UNIVERSIDADEFEDERALDORIODEJANEIRO ......RESUMO Existemdiversostiposdesistemaseleitoraisemusoaoredordomundo. Cadapaísopta pelo método que melhor se adequa ao …

Post on 04-Jul-2020

1 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

Transcript

UNIVERSIDADE FEDERAL DO RIO DE JANEIROINSTITUTO DE MATEMAacuteTICA

CURSO DE BACHARELADO EM CIEcircNCIA DA COMPUTACcedilAtildeO

GABRIEL S BEVILAQUA

ELEICcedilOtildeES MAIS JUSTAS SIMULANDO E INTERPRETANDO DIFERENTESSISTEMAS DE VOTACcedilAtildeO

RIO DE JANEIRO2019

GABRIEL S BEVILAQUA

ELEICcedilOtildeES MAIS JUSTAS SIMULANDO E INTERPRETANDO DIFERENTESSISTEMAS DE VOTACcedilAtildeO

Trabalho de conclusatildeo de curso de graduaccedilatildeoapresentado ao Departamento de Ciecircncia daComputaccedilatildeo da Universidade Federal do Riode Janeiro como parte dos requisitos para ob-tenccedilatildeo do grau de Bacharel em Ciecircncia daComputaccedilatildeo

Orientador Prof Viniacutecius Gusmatildeo Pereira de Saacute

RIO DE JANEIRO2019

AGRADECIMENTOS

Gostaria de agradecer primeiramente agrave UFRJ que me permitiu embarcar nessa jor-nada pela busca de conhecimento nesse fascinante campo que eacute a computaccedilatildeo Ao meuorientador Viniacutecius Gusmatildeo Pereira de Saacute pela atenccedilatildeo e ajuda no esclarecimento dosmelhores caminhos a se tomar na elaboraccedilatildeo deste trabalho Aos meus pais e a todaminha familia pelo incentivo e apoio incondicional A minha namorada pela paciecircnciae compreensatildeo nesta complicada fase da minha formaccedilatildeo acadecircmica E aos meus amigosque ja passaram ou que estatildeo passando pelo mesmo processo de conclusatildeo que eu e quecompartilham das mesmas dificuldades

ldquoElections are won by men and women chiefly because most people vote against somebodyrather than for somebody

Franklin P Adams

RESUMO

Existem diversos tipos de sistemas eleitorais em uso ao redor do mundo Cada paiacutes optapelo meacutetodo que melhor se adequa ao seu modo de governar muitas vezes utilizandovariaccedilotildees de um mesmo meacutetodo ou ateacute uma combinaccedilatildeo destes dependendo do cargopoliacutetico em questatildeo Atraveacutes da implementaccedilatildeo de um programa que permite simular umextenso nuacutemero de eleitores esta tese procura descobrir quais meacutetodos trazem resultadosque maximizam a taxa de satisfaccedilatildeo meacutedia da populaccedilatildeo quando testados sob diferentescenaacuterios poliacuteticos Cada eleitor simulado atribuiraacute notas para os candidatos que seratildeogeradas dependendo do cenaacuterio de maneira aleatoacuteria seguindo certa distribuiccedilatildeo de pro-babilidade ou deterministicamente atraveacutes de perfis eleitorais Tambeacutem seratildeo incluiacutedosnas simulaccedilotildees fatores reais de uma eleiccedilatildeo como o voto uacutetil e as coalizotildees entre can-didatos para que seja possiacutevel determinar de que maneira esses paracircmetros influenciamno resultado final Seraacute possiacutevel perceber que alguns dos sistemas satildeo muito eficazes naseleccedilatildeo dos melhores candidatos poreacutem afetados pelos votos taacuteticos enquanto outros satildeoresistentes a esses mas pecam em eficiecircncia

Palavras-chave Simulaccedilotildees Sistemas Eleitorais Satisfaccedilatildeo Meacutedia

ABSTRACT

There are several types of electoral systems in use around the world Each country choosesthe method that best fits their governance often using variations of the same method oreven a combination of these depending on the political position in question Through theimplementation of a program that simulates an extensive number of voters this thesisseeks to find out which methods bring results that maximize the rate of population sat-isfaction when tested under different political scenarios Each simulated voter will assignnotes to the candidates that will be generated depending on the scenario in randomfashion following a certain probability distribution or deterministically through electoralprofiles Also included in the simulations are the real factors of an election such as tacti-cal votes and coalitions between candidates so that it is possible to determine how theseparameters influence the final result It will be possible to see that some of the systemsare very effective in the selection of the best candidates however affected by tactical voteswhile others are resistant to these but lack efficiency

Keywords Simulations Electoral Systems Satisfaction Rate

LISTA DE ILUSTRACcedilOtildeES

Figura 1 ndash de paiacuteses de cada tipo de regime 1946-2016 17Figura 2 ndash Captura de tela 1 30Figura 3 ndash Captura de tela 2 30Figura 4 ndash Captura de tela 3 31Figura 5 ndash Captura de tela 4 32Figura 6 ndash Captura de tela 5 32Figura 7 ndash Captura de tela 6 33Figura 8 ndash FPTP - Cenaacuterio 1 sem voto taacutetico 34Figura 9 ndash TRS segundo turno - Cenaacuterio 1 sem voto taacutetico 34Figura 10 ndash IRV primeiro turno - Cenaacuterio 1 35Figura 11 ndash IRV segundo turno - Cenaacuterio 1 35Figura 12 ndash IRV terceiro turno - Cenaacuterio 1 35Figura 13 ndash AVS - Cenaacuterio 1 sem voto taacutetico 36Figura 14 ndash BC - Cenaacuterio 1 sem voto taacutetico 36Figura 15 ndash SVS - Cenaacuterio 1 sem voto taacutetico 36Figura 16 ndash FPTP - Cenaacuterio 1 - 20 de voto taacutetico na Ana 37Figura 17 ndash TRS segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana 37Figura 18 ndash IRV primeiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana 38Figura 19 ndash IRV segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana 38Figura 20 ndash IRV terceiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana 38Figura 21 ndash AVS - Cenaacuterio 1 20 de voto taacutetico na Ana 39Figura 22 ndash BC - Cenaacuterio 1 20 de voto taacutetico na Ana 39Figura 23 ndash SVS - Cenaacuterio 1 20 de voto taacutetico na Ana 39Figura 24 ndash BC - Cenaacuterio 1 100 de voto taacutetico na Ana e Beto 40Figura 25 ndash IRV primeiro turno - Cenaacuterio 2 41Figura 26 ndash IRV segundo turno - Cenaacuterio 2 41Figura 27 ndash IRV primeiro turno com voto taacutetico - Cenaacuterio 2 42Figura 28 ndash IRV segundo turno com voto taacutetico - Cenaacuterio 2 42Figura 29 ndash IRV primeiro turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3 44Figura 30 ndash IRV segundo turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3 44Figura 31 ndash TRS turno 1 - Cenaacuterio 4 45Figura 32 ndash TRS turno 2 - Cenaacuterio 4 46Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4 46Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4 46Figura 35 ndash FPTP - Cenaacuterio 5 48Figura 36 ndash TRS segundo turno - Cenaacuterio 5 48

Figura 37 ndash AVS - Cenaacuterio 5 49Figura 38 ndash BC - Cenaacuterio 5 49Figura 39 ndash SVS - Cenaacuterio 5 50Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria 50Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego 51Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego 51Figura 43 ndash BV - Cenaacuterio 6 52Figura 44 ndash estrutura candidates 53Figura 45 ndash estrutura voters 54Figura 46 ndash estrutura votes 54Figura 47 ndash PDF - Distribuiccedilatildeo Neutral 55Figura 48 ndash CDF - Distribuiccedilatildeo Neutral 55Figura 49 ndash PDF - Distribuiccedilatildeo Liked 56Figura 50 ndash CDF - Distribuiccedilatildeo Liked 56Figura 51 ndash PDF - Distribuiccedilatildeo Disliked 57Figura 52 ndash CDF - Distribuiccedilatildeo Disliked 57Figura 53 ndash PDF - Distribuiccedilatildeo Loved 58Figura 54 ndash CDF - Distribuiccedilatildeo Loved 58Figura 55 ndash PDF - Distribuiccedilatildeo Hated 59Figura 56 ndash CDF - Distribuiccedilatildeo Hated 59Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer 60Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer 60Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer 61Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer 61

LISTA DE COacuteDIGOS

A1 Meacutetodo create_voters 67B1 Meacutetodo create_candidates 68C1 Meacutetodo calculate_means 68D1 Meacutetodo get_mean 68E1 Meacutetodo calculate_mean 69F1 Meacutetodo set_leading_candidates 69G1 Meacutetodo irv_set_leading_candidates 69H1 Meacutetodo sort_ranks 70I1 Meacutetodo fptp_count_tactical_votes 71J1 Meacutetodo fptp_count_minority_votes 72K1 Meacutetodo trs_second_round 73L1 Meacutetodo trs_account_for_coalitions 74M1 Meacutetodo irv_count_votes 75N1 Meacutetodo avs_count_votes 76O1 Meacutetodo avs_count_votes_with_tactical 76P1 Meacutetodo irv_apply_tactical_votes 77Q1 Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo) 78R1 Meacutetodo bc_sum_candidates_scores 79S1 Meacutetodo svs_apply_tactical_votes 79T1 Meacutetodo svs_sum_candidates_scores 80U1 Meacutetodo bv_count_votes 80

LISTA DE TABELAS

Tabela 1 ndash Exemplo FPTP 18Tabela 2 ndash 2deg turno do TRS 20Tabela 3 ndash Exemplo IRV 22Tabela 4 ndash Desenvolvimento do IRV 22Tabela 5 ndash Exemplo AVS 24Tabela 6 ndash Resultado AVS 24Tabela 7 ndash Resultado BC 26Tabela 8 ndash Exemplo SVS 27Tabela 9 ndash Resultado SVS 27Tabela 10 ndash Exemplo BV 28Tabela 11 ndash Resultado BV 28Tabela 12 ndash Distribuiccedilatildeo de notas - Cenaacuterio 2 41Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2 42Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3 43Tabela 15 ndash Resultados do Cenaacuterio 3 44Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5 47Tabela 17 ndash Resultados do Cenaacuterio 5 48Tabela 18 ndash Resultados do Cenaacuterio 6 52

LISTA DE ABREVIATURAS E SIGLAS

FPTP First Past The Post

TRS Two-Round System

IRV Instant Runoff Voting

AVS Approval Voting System

BC Borda Count

SVS Score Voting System

BV Bloc Vote

SUMAacuteRIO

1 INTRODUCcedilAtildeO 1511 MOTIVACcedilAtildeO E OBJETIVO 1512 MEacuteTODO 1513 ESTRUTURA 15

2 SISTEMAS ELEITORAIS 1721 FISRT PAST THE POST 17211 Exemplo 18212 Vantagens e Desvantagens do FPTP 18213 Voto Uacutetil no FPTP 1922 TWO-ROUND SYSTEM 19221 Exemplo 20222 Vantagens e Desvantagens do TRS 20223 Voto Uacutetil no TRS 2123 INSTANT-RUNOFF VOTING 21231 Exemplo 22232 Vantagens e Desvantagens do IRV 22233 Voto Uacutetil no IRV 2324 APPROVAL VOTING SYSTEM 24241 Exemplo 24242 Vantagens e Desvantagens do AVS 24243 Voto Uacutetil no AVS 2525 THE BORDA COUNT 25251 Exemplo 25252 Vantagens e Desvantagens do BC 26253 Voto Uacutetil no BC 2626 SCORE VOTING SYSTEM 26261 Exemplo 27262 Vantagens e Desvantagens do SVS 27263 Voto Uacutetil no SVS 2727 BLOC VOTE 28271 Exemplo 28272 Voto Uacutetil no BV 29

3 O SIMULADOR 30

4 CENAacuteRIOS PERTINENTES 3441 CENAacuteRIO 1 VOTO TAacuteTICO 3442 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV 4143 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE 4344 CENAacuteRIO 4 COALIZOtildeES 4545 CENAacuteRIO 5 DILEMA DO PRISIONEIRO 4746 CENAacuteRIO 6 VOTO DE MINORIA 50

5 COMO FUNCIONA O SIMULADOR 5351 CLASSE Elections 5352 CLASSE FirstPastThePost 6053 CLASSE TwoRoundSystem 6254 CLASSE InstantRunoffVoting 6255 CLASSE ApprovalVoting 6356 CLASSE BordaCount 6357 CLASSE ScoreVoting 6358 CLASSE BlocVote 6459 TECNOLOGIAS UTILIZADAS 64

6 CONCLUSAtildeO 65

REFEREcircNCIAS 66

APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS 67

APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES 68

APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS 68

APEcircNDICE D ndash MEacuteTODO GET_MEAN 68

APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN 69

APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES 69

APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES 69

APEcircNDICE H ndash MEacuteTODO SORT_RANKS 70

APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES 71

APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES 72

APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND 73

APEcircNDICE L ndash MEacuteTODOTRS_ACCOUNT_FOR_COALITIONS 74

APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES 75

APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES 76

APEcircNDICE O ndash MEacuteTODOAVS_COUNT_VOTES_WITH_TACTICAL 76

APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES 77

APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES (CON-TINUACcedilAtildeO) 78

APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES 79

APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES 79

APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES 80

APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES 80

15

1 INTRODUCcedilAtildeO

Em toda eleiccedilatildeo existe pelo menos um grupo de indiviacuteduos que sai completamentedesfavorecido e insatisfeito com o resultado O contentamento completo de uma populaccedilatildeoeacute certamente improvaacutevel e muitas vezes impossiacutevel considerando a gama de candidatosque se dispotildee a concorrer Em todo caso o miacutenimo que pode ser feito eacute escolher demaneira eficiente o melhor candidato ao cargo dentre as opccedilotildees disponiacuteveis Diante dissoeacute necessaacuterio avaliar como essa escolha eacute feita e quais meacutetodos satildeo capazes de tornaacute-larealidade

11 MOTIVACcedilAtildeO E OBJETIVO

Em conformidade com o extenso nuacutemero de sistemas eleitorais pelo mundo este tra-balho tem como objetivo testar uma porccedilatildeo desses sistemas sob a simulaccedilatildeo de diferentescenaacuterios especiacuteficos a fim de determinar quais deles podem ser considerados como os maisjustos perante a taxa de satisfaccedilatildeo meacutedia da populaccedilatildeo

12 MEacuteTODO

Para que essa anaacutelise seja possiacutevel foi desenvolvido um programa que permite a criaccedilatildeoe configuraccedilatildeo de diferentes cenaacuterios onde os sistemas eleitorais seratildeo simulados Nele eacutepossiacutevel definir o nuacutemero total de eleitores e candidatos como esses eleitores iratildeo votar eo niacutevel de popularidade de cada candidato Aleacutem disso eacute possiacutevel formar coalizotildees entreos candidatos e escolher a porcentagem dos eleitores que optaratildeo pelo voto uacutetil Dessamaneira seraacute possiacutevel elaborar cenaacuterios que buscam expor os pontos fortes e fracos decada sistema

13 ESTRUTURA

Este trabalho eacute relatado ao longo de seis capiacutetulos No Capiacutetulo 2 seratildeo apresentados ossistemas eleitorais implementados no simulador suas vantagens e desvantagens conhecidase outras caracteriacutesticas especiacuteficas de cada um A intenccedilatildeo do capiacutetulo eacute tornar o textomais autocontido trazendo conceitos jaacute estudados que ajudaratildeo na melhor compreensatildeodos capiacutetulos seguintes por isso grande parte de sua composiccedilatildeo eacute oriunda de diferentesfontes consultadas

O Capiacutetulo 3 eacute uma apresentaccedilatildeo das funcionalidades que o simulador possui Seratildeoexplicados todos os campos de entrada e os dois modos distintos nos quais o programaopera

16

No Capiacutetulo 4 os sistemas seratildeo colocados em teste Todos seratildeo simulados em cenaacuteriosespeciacuteficos a fim de fazer sobressair aqueles com as maiores taxas de satisfaccedilatildeo meacutedia

A estrutura e implementaccedilatildeo do simulador seratildeo abordadas em detalhes no Capiacutetulo5 assim como uma breve descriccedilatildeo da stack utilizada Todos os meacutetodos relevantes aofuncionamento das simulaccedilotildees seratildeo explicados passo a passo

No Capiacutetulo 6 seratildeo apresentadas as conclusotildees referentes agrave anaacutelise dos resultadosobtidos no Capiacutetulo 4 e as consideraccedilotildees finais do projeto como um todo

17

2 SISTEMAS ELEITORAIS

Atualmente mais e mais paiacuteses estatildeo adotando sistemas democraacuteticos de governoCerca de 6 em 10 governos no mundo satildeo democracias (Pew Research Center 2017) o quepode ser observado na Figura 1 abaixo Em um sistema democraacutetico a populaccedilatildeo escolheseus liacutederes atraveacutes de seu sistema eleitoral Existem diversos sistemas eleitorais em usono mundo muitos dos quais satildeo usados em conjunto para eleger um uacutenico candidato Emvaacuterios paiacuteses mais de um sistema eleitoral pode ser utilizado tambeacutem em diferentes niacuteveisde governo tanto presidencial quanto estadual ou municipal Natildeo apenas imersos nomeio poliacutetico eles tambeacutem podem ser usados em escopos menores como em esportes oucompeticcedilotildees artiacutesticas poreacutem sempre com a finalidade de alocar um ou mais indiviacuteduosa determinado cargo ou tiacutetulo

Figura 1 ndash de paiacuteses de cada tipo de regime 1946-2016

Fonte Center of Systemic Peacersquos Polity IV Project

Os proacuteximos trecircs toacutepicos discutidos neste capiacutetulo referentes aos meacutetodos First Pastthe Post Two-Round System e Instant Runoff Voting possuem seus conceitos e infor-maccedilotildees relevantes com exceccedilatildeo dos exemplos traduzidos livremente do livro Behind theBallot Box A Citizenrsquos Guide to Voting Systems (AMY 2000)

21 FISRT PAST THE POST

O meacutetodo First Past the Post tambeacutem conhecido como Plurality Voting ou WinnerTakes All eacute o meacutetodo mais simples e direto e provavelmente o primeiro meacutetodo que sepensa quando se fala de eleiccedilotildees Os eleitores escolhem apenas um candidato e apoacutes a

18

contagem dos votos o candidato com o maior nuacutemero de votos eacute eleito O vencedor natildeonecessita da aprovaccedilatildeo de mais de 50 dos eleitores ele apenas precisa de uma pluralidadedos votos ou seja apenas possuir mais votos que os outros candidatos

Esse sistema eacute utilizado em escala nos Estados Unidos para a maior parte das eleiccedilotildeesvoltadas a eleger apenas um candidato como prefeitos e governadores aleacutem de ser usadana disputa presidencial Dentre outros paiacuteses que empregam o sistema em suas corridaspresidenciais estatildeo listados o Meacutexico as Filipinas a Coreia do Sul e a Venezuela

211 Exemplo

Tabela 1 ndash Exemplo FPTP

Candidatos VotosA 36B 25C 22D 17

Neste exemplo o candidato A possui uma pluralidade dos votos com 36 e ele eacute ocandidato eleito mesmo natildeo tendo uma maioria

212 Vantagens e Desvantagens do FPTP

A vantagem do FPTP eacute a sua simplicidade Natildeo eacute difiacutecil para um eleitor comumcompreender o seu funcionamento eles apenas precisam se decidir por um candidato Eletambeacutem eacute muito simples e direto na sua contagem e seleccedilatildeo do vencedor

Esse meacutetodo tambeacutem tende a criar listas de candidatos concorrentes mais curtasCandidatos independentes ou de partidos menores frequentemente acabam se sentindodesencorajados a concorrer devido agraves suas baixas chances de vitoacuteria Isso normalmentefornece aos eleitores uma faacutecil decisatildeo entre um ou dois candidatos dos maiores partidosao mesmo tempo poreacutem limitando suas opccedilotildees

No entanto sua essecircncia eacute sua principal desvantagem a pluralidade O fato do can-didato eleito natildeo necessitar de uma maioridade dos votos da populaccedilatildeo parece violaros princiacutepios baacutesicos da democracia Democracia eacute em sua origem o poder(kratos) nopovo(demos) poreacutem na pluralidade o poder de eleger um candidato pode residir emapenas uma fraccedilatildeo relativamente pequena do povo Em um cenaacuterio hipoteacutetico comapenas trecircs candidatos um deles apenas poderia necessitar de natildeo mais do que 34 dosvotos para ser eleito o que significa que no pior dos casos 66 da populaccedilatildeo rejeitao candidato eleito O cenaacuterio soacute piora com mais e mais candidatos concorrendo Paraquatro candidatos satildeo necessaacuterios 26 dos votos no pior dos casos para cinco satildeo 21 eassim por diante

19

213 Voto Uacutetil no FPTP

No FPTP tambeacutem existe a possibilidade de os eleitores evitarem votar em sua prefe-recircncia verdadeira No caso de sua preferecircncia natildeo aparentar ter boas chances de vitoacuteriamuitas vezes opta-se por uma segunda opccedilatildeo que esteja mais bem colocada nas eleiccedilotildeesO motivo disso eacute que nessas situaccedilotildees votar em sua preferecircncia pode parecer um des-perdiacutecio do seu voto e no pior dos cenaacuterios optar por natildeo transferir seu voto para umasegunda opccedilatildeo pode acabar resultando na eleiccedilatildeo de um candidato de seu desgosto As-sim votar de maneira verdadeira muitas vezes pode acabar prejudicando o eleitor que sevecirc forccedilado a abandonar seus interesses poliacuteticos mais imediatos e escolher o menor entredois(ou mais) males Os candidatos de partidos menores satildeo os que mais sofrem com essetipo de voto estrateacutegico por natildeo conseguirem agregar as maiores quantidades de votos

Entretanto ao mesmo tempo que partidos maiores roubam votos de partidos meno-res com os votos taacuteticos partidos menores tambeacutem tem a oportunidade de ganhar algunsvotos com o denominado spoiler effect Ao entrarem na eleiccedilatildeo candidatos de partidosmenores podem adquirir votos de candidatos mais populares que possuem inclinaccedilatildeo po-liacutetica semelhante Logo eacute possiacutevel que haja certo equiliacutebrio ao se contrapor as mudanccedilasde voto devido aos votos uacuteteis agraves mudanccedilas oriundas do spoiler effect

Poreacutem o spoiler effect natildeo necessariamente ocorre apenas entre partidos maiores emenores mas pode prejudicar candidatos de popularidades proacuteximas Por exemplo entretrecircs candidatos A B e C onde A representa determinada posiccedilatildeo no espectro poliacuteticoenquanto B e C possuem posiccedilotildees parecidas o que pode acontecer eacute B e C se prejudicaremmutuamente jaacute que ambos dividem os eleitores de um mesmo espectro poliacutetico Se esseespectro tem a maioria com 60 por exemplo com B e C compartilhando cada um 30dos votos o candidato A sairia vencedor com 40 mesmo que todos os eleitores de Bprefiram C e todos os eleitores de C prefiram B Esse exemplo demonstra claramente oproblema com os sistemas de pluralidade

22 TWO-ROUND SYSTEM

Uma das primeiras tentativas de lidar com a desvantagem dos sistemas por pluralidadeo Two-round System eacute usado desde o seacuteculo XIX no ocidente e atualmente ainda eacute utilizadoem corridas presidecircncias de paiacuteses como o Brasil Bulgaacuteria Chile Colocircmbia FinlacircndiaPolocircnia Portugal Ruacutessia e em inuacutemeras eleiccedilotildees locais nos Estados Unidos

O principal objetivo do TRS eacute garantir que o vencedor tenha conseguido uma maioriados votos Para isso as eleiccedilotildees satildeo estruturadas em duas rodadas de votaccedilatildeo Na primeirarodada os eleitores se dirigem agraves urnas e votam no candidato de sua preferecircncia Apoacutesa contagem se a quantidade de votos do candidato mais votado superar a proporccedilatildeo de50 natildeo haacute a necessidade de uma segunda rodada e este candidato eacute eleito No entantose este natildeo for o caso haveraacute uma segunda rodada com apenas os dois candidatos mais

20

votados Nesta rodada os eleitores retornam as urnas para escolher uma das duas opccedilotildeessendo eleito o candidato mais votado agora definitivamente com uma maioria dos votos

221 Exemplo

Utilizando a mesma distribuiccedilatildeo de votos descrita na tabela 1 Neste caso como ocandidato A natildeo possui uma maioria dos votos ele e o candidato B iratildeo concorrer em umsegundo turno Digamos que as distribuiccedilotildees dos votos dos eleitores dos candidatos C eD em relaccedilatildeo aos candidatos A e B satildeo as seguintes

Tabela 2 ndash 2deg turno do TRS

Candidatos Votos dos eleitoresde C

Votos dos eleitoresde D

Votos do 1degturno

A 7 5 36B 15 12 25

O candidato B agora eacute eleito com uma maioria dos votos 52 contra 48 do candidatoA

222 Vantagens e Desvantagens do TRS

Por ser parecido com o FPTP esse sistema tambeacutem eacute de faacutecil compreensatildeo do eleitorcomum poreacutem a maior vantagem do TRS eacute a garantia de que o candidato vencedor teraacute oapoio da maioria dos eleitores no segundo turno eliminando a pluralidade Argumenta-seque isso daacute maior legitimidade poliacutetica ao mandato do candidato eleito

O TRS tende a abrigar uma lista maior de candidatos sendo mais convidativo acandidatos de partidos menores mesmo que suas chances natildeo sejam maiores quandocomparadas agraves eleiccedilotildees sob o FPTP Mesmo assim essa listagem mais abrangente eacute umavantagem do sistema pois daacute aos eleitores uma variedade maior de opccedilotildees de voto

Em relaccedilatildeo agraves suas desvantagens o TRS possui duas principais A primeira satildeo oscustos elevados do sistema decorrentes da necessidade da organizaccedilatildeo de um segundoturno de votaccedilotildees A segunda eacute o aumento no iacutendice de ausecircncias dos eleitores agraves urnasEssa ampliaccedilatildeo no natildeo comparecimento dos eleitores se daacute tambeacutem devido ao segundoturno por pura fatiga eleitoral bem como consequecircncia da desistecircncia de eleitores queapoiam candidatos que jaacute foram eliminados

Outro ponto negativo do TRS eacute a sua natildeo-monotonicidade Isso significa que umcandidato pode ser prejudicado com um aumento em sua popularidade e suporte e domesmo modo um candidato pode se beneficiar com a perda de popularidade e suporteSe os candidatos A e B satildeo os esperados para ir ao segundo turno onde A eacute mais fortedo que B um aumento no suporte pelo candidato A pode resultar na sua derrota quandoesse aumento causa uma alteraccedilatildeo nos candidatos que satildeo selecionados para ir ao segundoturno Se esse aumento na popularidade de A resultar na eliminaccedilatildeo preacutevia de B um

21

terceiro candidato C pode ser vitorioso sobre A no segundo turno caso os eleitores de Bprefiram C ao candidato A Se natildeo houvesse esse crescimento de popularidade A teriaderrotado B no segundo turno Essa situaccedilatildeo seraacute vista em melhores detalhes na seccedilatildeo 43

223 Voto Uacutetil no TRS

Esse sistema minimiza os efeitos do voto uacutetil em relaccedilatildeo ao FPTP pois um eleitorqualquer pode tranquilamente votar em sua preferecircncia sem se preocupar em desperdiccedilaacute-lo mesmo que seu candidato natildeo tenha chances de vitoacuteria Se este natildeo for eleito aindapoderaacute escolher a sua preferecircncia dentre os dois candidatos que prosseguirem para osegundo turno

Apesar disso ainda existe um cenaacuterio em que o eleitor pode ser tentado a natildeo votar emsua preferecircncia Eacute possiacutevel que ele opte pela sua segunda opccedilatildeo se souber que sua primeiraopccedilatildeo possui miacutenimas chances de ir ao segundo turno ou ateacute mesmo por saber que issodiminuiraacute as chances de algum outro candidato ser eleito Mesmo assim eacute evidente queo TRS natildeo proporciona o mesmo apelo ao voto taacutetico que o FPTP

Outra caracteriacutestica do TRS eacute o incentivo a formaccedilatildeo de coalizotildees entre candidatosde partidos mais populares com candidatos de partidos menos populares As coalizotildeesfornecem benefiacutecios agrave ambas as partes onde os candidatos classificados para o segundoturno em geral se juntam a candidatos jaacute eliminados com a intenccedilatildeo de agregar maisvotos enquanto os candidatos jaacute eliminados apoiam um dos dois classificados na esperanccedilade inserir propostas proacuteprias ou modificaccedilotildees agrave chapa deles

23 INSTANT-RUNOFF VOTING

Instant Runoff Voting foi uma alternativa aos meacutetodos FPTP e TRS desenvolvidanos anos 70 por um professor do Instituto de Tecnologia de Massachusetts(MIT) O IRVelimina as principais desvantagens desses outros dois sistemas a pluralidade do FPTP e anecessidade de mais de uma rodada de votaccedilatildeo do TRS Este meacutetodo tambeacutem opera emmais de uma rodada poreacutem como o proacuteprio nome sugere essas rodadas satildeo instantacircneasnatildeo sendo necessaacuterio o retorno dos eleitores agraves urnas Atualmente ele eacute utilizado naIrlanda nas eleiccedilotildees presidenciais em Londres na eleiccedilatildeo de seu prefeito e em distritosindividuais na Austraacutelia para eleger membros de sua cacircmara baixa do parlamento OIRV tambeacutem eacute usado por vaacuterias organizaccedilotildees privadas nos Estados Unidos incluindoa American Political Science Association e a American Psychological Association paraeleger seus funcionaacuterios

Nesse sistema os eleitores natildeo satildeo solicitados a votar em um uacutenico candidato aoinveacutes disso eles listam todos os candidatos concorrentes na ordem de sua preferecircnciaA partir dessas listas as primeiras opccedilotildees de cada eleitor recebem o seu voto e apoacutes acontagem se um candidato obtiver 50 dos votos mais um este candidato eacute eleito Se

22

isso natildeo ocorrer o candidato menos votado eacute eliminado das eleiccedilotildees e seus votos satildeotransferidos para a segunda opccedilatildeo de cada um de seus eleitores Esse procedimento serepete eliminando o candidato menos votado a cada rodada ateacute que algum dos candidatospossuam a maioridade dos votos

231 Exemplo

Na tabela 3 pode-se verificar a distribuiccedilatildeo de votos por perfil de eleitor e na tabela4 vecirc-se o desenvolvimento do IRV para essas distribuiccedilotildees O candidato D eacute o menosvotado e por consequecircncia eacute o primeiro a ser eliminado A segunda opccedilatildeo de todos oseleitores que votaram no candidato D eacute o candidato C por isso este recebe todos os votosdistribuiacutedos na segunda rodada Com isso o candidato B eacute eliminado com 25 dos votos eos candidatos A e C concorrem na uacuteltima rodada Mesmo com o candidato C na lideranccedilana segunda rodada a maior parte dos eleitores do B tem como preferecircncia o candidatoA por isso A eacute eleito com 55 dos votos contra 45 do C

Tabela 3 ndash Exemplo IRV

Rankings Ndeg de eleitoresABCD 20ABDC 16BDAC 19BDCA 6CABD 7CDBA 15DCAB 5DCBA 12

Tabela 4 ndash Desenvolvimento do IRVTurnos D C B A

1 17 22 25 362 eliminado 39 25 363 eliminado 45 eliminado 55

232 Vantagens e Desvantagens do IRV

Assim como no TRS a pluralidade eacute irrelevante no IRV e um candidato soacute eacute eleitocom a maioridade dos votos dando maior legitimidade ao mandato deste No entantopode-se argumentar que o IRV faz isso com mais eficiecircncia pois natildeo requer a execuccedilatildeode mais de uma rodada de votaccedilotildees Isso diminui os custos das eleiccedilotildees como um todoao mesmo tempo que proporciona um nuacutemero menor de isenccedilotildees por parte dos eleitoresdevido ao desgaste de todo o processo eleitoral

23

Aleacutem disso candidatos de partidos menores tendem a receber mais votos do queno FPTP e portanto satildeo mais encorajados a se candidatar Com uma lista maior decandidatos eleitores desfrutam de uma variedade maior de opccedilotildees de voto Contudomesmo com mais candidatos menos populares o spoiler effect mencionado anteriormentetambeacutem natildeo possui espaccedilo nesse sistema de votaccedilatildeo Partidos menores natildeo tem comoroubar votos de partidos maiores visto que esses votos eventualmente seratildeo transferidosde volta a eles durante o desenvolvimento das rodadas do IRV

Em virtude de sua estrutura acredita-se que esse meacutetodo tende a encorajar os can-didatos tambeacutem a elaborar suas campanhas de forma mais abrangente ampliando suainfluecircncia para mais do que apenas um grupo especiacutefico de maneira que ele consiga agre-gar votos de segunda ou terceira opccedilatildeo aleacutem dos votos de seus eleitores principais

A principal desvantagem do IRV eacute o fato de ele ainda natildeo ser amplamente utilizado aoredor do mundo Essa falta de familiaridade do sistema pode causar confusatildeo ao eleitorcomum em suas primeiras ocorrecircncias No entanto nos paiacuteses em que este eacute utilizadonatildeo parece haver confusatildeo entre os eleitores Aleacutem disso na maioria dos casos haveraacute umcusto potencialmente alto da substituiccedilatildeo ou alteraccedilatildeo dos sistemas das urnas eletrocircnicaspara que seja possiacutevel haver a implementaccedilatildeo do meacutetodo

Aleacutem disso assim como o TRS este sistema tambeacutem possui natildeo-monotonicidade ouseja um candidato pode ser prejudicado ao ser ranqueado mais alto enquanto que outropode se beneficiar sendo ranqueado mais baixo pelos eleitores (ORNSTEIN 2018) issopode ocorrer quando esse ranqueamento causa alteraccedilotildees na ordem em que os candidatossatildeo eliminados Essa caracteriacutestica se manifesta em fenocircmenos complexos e especiacuteficos epor isso um exemplo de sua ocorrecircncia seraacute abordada em detalhes na seccedilatildeo 43

233 Voto Uacutetil no IRV

Como os sistemas de votaccedilatildeo anteriores o IRV natildeo eacute completamente imune ao vototaacutetico No entanto este meacutetodo se mostra bem resistente a eles quando comparado aoutros meacutetodos como o FPTP e o Borda Count (Bartholdi John J III and Orlin JamesB 1990) Distintivamente o IRV requer um maior esforccedilo do eleitor para elaborar umaestrateacutegia que melhor ajuste os resultados da eleiccedilatildeo de acordo com a sua preferecircnciaAleacutem disso eacute necessaacuterio que ele tenha informaccedilatildeo suficiente sobre os rankings de outroseleitores naturalmente obtida atraveacutes de pesquisas eleitorais

Existe tambeacutem a possibilidade de ocorrer uma exaustatildeo dos votos quando natildeo haacuteo completo preenchimento do ranking por parte dos eleitores Nessas ocasiotildees o votonatildeo pode continuar a ser transferido a outros candidatos e ele eacute descartado Isso afetaa legitimidade do mandato do candidato eleito pois o resultado final natildeo representaraacute100 da populaccedilatildeo votante Essas ocorrecircncias no entanto podem ser minimizadas comuma melhor educaccedilatildeo eleitoral ou como foi implementado na Austraacutelia requerer que osrankings incluam uma totalidade dos candidatos concorrentes

24

24 APPROVAL VOTING SYSTEM

No meacutetodo Approval Voting os eleitores natildeo satildeo limitados pelo nuacutemero de candidatosem que podem votar por isso approval cada eleitor pode votar em todos os candidatos osquais ele aprova Apoacutes as votaccedilotildees o candidato com a maior quantidade de votos eacute eleitoSegundo Hamlin (2015) a cidade de Fargo na Dakota do Norte se tornou a primeiracidade nos EUA a colocar em praacutetica este sistema em suas eleiccedilotildees gerais em novembrode 2018 AVS tambeacutem eacute utilizado para eleger o secretaacuterio-geral das Naccedilotildees Unidas e emdiversas outras organizaccedilotildees

241 Exemplo

Na tabela 5 abaixo pode-se encontrar 8 perfis de eleitores com seus candidatos apro-vados e quantidade de eleitores que se encaixam no perfil Na tabela 6 temos o resultadoda contabilizaccedilatildeo dos votos destes perfis O candidato mais popular eacute o B que se encontraaprovado em 5 perfis distintos totalizando 60 votos ou aproximadamente 32

Tabela 5 ndash Exemplo AVS

Aprovaccedilotildees Ndeg de eleitoresA 20AB 16B 19

BDC 6CAB 7CD 15DC 5DCB 12

Tabela 6 ndash Resultado AVSCandidatos Total de votos

A 43B 60C 45D 38

242 Vantagens e Desvantagens do AVS

Aleacutem de simples este meacutetodo permite um niacutevel maior de expressividade aos eleitoresOnde no FPTP e TRS eles satildeo limitados pelo seu uacutenico voto aqui os eleitores tecircm aliberdade de demonstrar exatamente quais candidatos consideram aptos ou aceitaacuteveis aocargo

25

Outro efeito dessa liberdade trazida pelo AVS eacute a dizimaccedilatildeo do spoiler effect Can-didatos de partidos menores natildeo tem como roubar votos de partidos maiores nessesistema ambos os candidatos contabilizariam o voto

243 Voto Uacutetil no AVS

O tipo de voto uacutetil no AVS eacute denominado bullet voting Segundo The Center forElection Science (2015) esta taacutetica envolve simplesmente ignorar a possibilidade de votarem mais de um candidato e votar apenas em sua primeira opccedilatildeo Um eleitor pode serlevado a adotar essa estrateacutegia quando percebe que sua preferecircncia pode ser prejudicadacom o voto em alguma segunda opccedilatildeo sua Em um cenaacuterio extremo onde 100 doseleitores adotam esta estrateacutegia as eleiccedilotildees satildeo convertidas a um simples First Past ThePost

25 THE BORDA COUNT

Este meacutetodo carrega o nome em homenagem a seu criador Jean-Charles de Bordaque o desenvolveu em 1770 (LIPPMAN 2012) A contagem de Borda utiliza a abordagemde ranqueamento dos candidatos poreacutem de maneira diferente ao IRV Este eacute um sistemaque atribui uma pontuaccedilatildeo aos candidatos com base nestes rankings O candidato na basedo ranking natildeo recebe pontos o candidato imediatamente acima deste recebe 1 pontoo proacuteximo recebe 2 pontos e assim por diante ateacute o topo do ranking As pontuaccedilotildees detodos os rankings satildeo contabilizadas e o candidato com maior pontuaccedilatildeo eacute eleito Deacordo com Lippman variaccedilotildees deste meacutetodo satildeo encontradas em uso na premiaccedilatildeo dediversos esportes como na seleccedilatildeo do MVP(Most Valuable Player) da MLB(principal ligade beisebol dos EUA) e no Trofeacuteu Heisman de futebol americano universitaacuterio

251 Exemplo

Neste exemplo seratildeo aproveitados os mesmos rankings apresentados na tabela 3 Porserem 4 candidatos o primeiro colocado de cada ranking receberaacute 3 pontos o segundo 2pontos o terceiro 1 e o quarto 0 Assim o nuacutemero maacuteximo de pontos que um candidatopode atingir eacute igual a 300(se ficar na primeira posiccedilatildeo em todos os rankings) e o nuacutemerototal de pontos no sistema eacute 600 O nuacutemero maacuteximo de pontos que um candidato podeatingir eacute calculado com

(cminus 1)times e

Sendo c igual ao nuacutemero de candidatos e e o nuacutemero de eleitores Por sua vez onuacutemero total de pontos no sistema eacute

26

(cminus 1)times c2

times e

A contagem final dos pontos eacute apresentada na tabela 7 abaixo

Tabela 7 ndash Resultado BCCandidatos Total de pontos

A 146B 181C 126D 147

O candidato eleito eacute o B com 181 pontos ou aproximadamente 60 da pontuaccedilatildeomaacutexima

252 Vantagens e Desvantagens do BC

Em comparaccedilatildeo com os meacutetodos abordados anteriormente que apenas consideramas primeiras opccedilotildees de cada eleitor este meacutetodo regularmente escolhe candidatos comaceitaccedilatildeo mais ampla ao inveacutes de uma preferecircncia direta dos eleitores (Electoral ReformSociety 2017b)

Ele tambeacutem encoraja uma abordagem estrateacutegica por parte dos partidos onde seriade seu interesse nomear mais de um candidato para concorrer pois quanto mais candi-datos estatildeo no paacutereo maior eacute a pontuaccedilatildeo dos primeiros colocados Logo a nomeaccedilatildeo decandidatos menos populares pode beneficiar os principais candidatos de um partido

253 Voto Uacutetil no BC

Existem duas estrateacutegias aplicaacuteveis a esse sistema A primeira denominada compromi-sing de maneira similar a outros meacutetodos de votaccedilatildeo se resume em ranquear em primeirolugar um dos candidatos que estejam liderando as eleiccedilotildees mesmo que este natildeo seja suapreferecircncia real A segunda estrateacutegia burying eacute o oposto esta se baseia em ranquearem uacuteltimo lugar um dos candidatos liacutederes mesmo que este natildeo seja o seu candidato demaior desgosto Ambas estrateacutegias podem ser aplicadas ao mesmo tempo por um eleitor

26 SCORE VOTING SYSTEM

Score Voting ou Range Voting como tambeacutem eacute conhecido eacute mais um meacutetodo quetenta trazer maior liberdade de expressatildeo aos eleitores Assim como o Borda Counteste sistema funciona baseado na pontuaccedilatildeo dos candidatos no entanto ao inveacutes dessapontuaccedilatildeo ser relativa agrave posiccedilatildeo do candidato no ranking de cada eleitor este por sua veztem completa liberdade de atribuir qualquer quantidade de pontos aos candidatos dentro

27

de determinada escala Um eleitor pode dar o mesmo nuacutemero de pontos para diferentescandidatos e apoacutes o somatoacuterio de todas as pontuaccedilotildees o candidato com a pontuaccedilatildeo maisalta eacute eleito Incorporado ao escopo poliacutetico o SVS eacute utilizado no Partido Pirata Alematildeobem como em diversas organizaccedilotildees tais como o Fedora Project e Mozilla e tambeacutem emvariados esportes oliacutempicos e reality shows como o American Idol aponta Hamlin (2015)

261 Exemplo

Neste exemplo temos apresentados na tabela 8 abaixo 4 perfis distintos de eleitorese suas respectivas atribuiccedilotildees de pontos aos 4 candidatos Cada eleitor pode atribuirqualquer pontuaccedilatildeo a um candidato dentro da escala de -10 a 10 O resultado da eleiccedilatildeoapoacutes a soma de todos os pontos por candidato se encontra na tabela 9 onde o candidatoA eacute eleito com um total de 605 pontos

Tabela 8 ndash Exemplo SVS

Perfil A B C D Ndeg de eleitores1 10 -1 5 2 362 6 9 -3 4 253 2 0 8 4 224 3 3 3 10 17

Tabela 9 ndash Resultado SVSCandidatos Total de pontos

A 605B 240C 332D 430

262 Vantagens e Desvantagens do SVS

A grande vantagem do SVS eacute como ele proporciona aos eleitores expressar de maneiramuito proacutexima potencialmente exata suas impressotildees poliacuteticas de cada candidato Eleeacute ainda mais expressivo que o AVS Dessa maneira o spoiler effect tambeacutem se torna nuloao passo que toda intenccedilatildeo de voto eacute precisamente representada neste sistema

Assim como outros meacutetodos eleitorais este sofre igualmente dos males produzidos pelovoto taacutetico Sua principal desvantagem eacute discutida na seccedilatildeo abaixo

263 Voto Uacutetil no SVS

Da mesma maneira que no Approval Voting atraveacutes do bullet voting o SVS tambeacutempode ser convertido em uma eleiccedilatildeo sob o meacutetodo FPTP em um cenaacuterio com um grande

28

volume de eleitores maliciosos O voto uacutetil sob este sistema se manifesta pontuando-seapenas um candidato com uma nota positiva e todos os outros com as notas mais baixasda escala Se todos os eleitores se aproveitarem dessa abordagem natildeo existiraacute distinccedilatildeoefetiva entre uma eleiccedilatildeo sob SVS e FPTP Essencialmente cada eleitor estaacute votando emapenas um candidato Essa eacute a principal desvantagem do SVS e ela consegue eliminarsua principal vantagem dar ao eleitor um poder maior de expressatildeo

27 BLOC VOTE

O Bloc Vote eacute um meacutetodo utilizado para a eleiccedilatildeo de candidatos a cargos no governocom mais de uma vacacircncia Pode ser considerado um meio-termo entre o FPTP e oAVS pois os eleitores podem votar em mais de um candidato poreacutem satildeo limitados pelonuacutemero de vagas Em uma eleiccedilatildeo com duas vagas por exemplo cada eleitor selecionaraacutedois candidatos ou menos Sensatamente o candidato mais votado eacute eleito Ele possuialgumas utilizaccedilotildees em eleiccedilotildees locais em algumas partes da Inglaterra (Electoral ReformSociety 2017a)

271 Exemplo

Neste exemplo dois candidatos seratildeo eleitos logo cada eleitor votaraacute em no maacuteximodois candidatos A distribuiccedilatildeo de votos pode ser conferida na tabela 10 e o resultado dacontagem de votos na tabela 11 abaixo Os candidatos eleitos satildeo o C totalizando 78do maacuteximo de votos possiacuteveis para um candidato e o A com 43

Tabela 10 ndash Exemplo BV

Aprovaccedilotildees Ndeg de eleitoresAC 20AB 16BC 19BD 6CA 7CD 15DC 17

Tabela 11 ndash Resultado BVCandidatos Total de votos

A 43B 41C 78D 38

29

272 Voto Uacutetil no BV

Neste sistema eacute possiacutevel que um eleitor evite votar em sua primeira opccedilatildeo quandoeste natildeo tem chances de vitoacuteria e se fazendo isto ele diminuiraacute as chances de algum outrocandidato de seu desgosto ganhar Poreacutem o sistema previne um outro tipo de voto uacutetilEm eleiccedilotildees com mais de uma vaga onde os eleitores soacute podem votar em um candidatose um eleitor sabe que sua primeira opccedilatildeo tambeacutem eacute a primeira opccedilatildeo da maior parteda populaccedilatildeo e portanto muito provavelmente seraacute um dos candidatos eleitos eacute possiacutevelque ele arrisque votar em uma segunda opccedilatildeo sua na esperanccedila de a longo prazo elegersuas duas principais opccedilotildees de voto Com os eleitores podendo votar no nuacutemero exato devagas disponiacuteveis esse tipo de pensamento taacutetico perde o sentido

30

3 O SIMULADOR

Para este trabalho foi implementado um simulador eleitoral na forma de uma aplicaccedilatildeoweb para que a interaccedilatildeo do usuaacuterio fosse facilitada Veremos a seguir como se daacute suautilizaccedilatildeo de forma geral

Figura 2 ndash Captura de tela 1

Figura 3 ndash Captura de tela 2

A primeira opccedilatildeo encontrada pelo usuaacuterio eacute a escolha de quais sistemas de votaccedilatildeo se-ratildeo simulados (Figura 2) Todos eles podem ser selecionados para rodar simultaneamentePoreacutem natildeo eacute permitido rodar uma simulaccedilatildeo do Bloc Vote para uma eleiccedilatildeo onde apenasum candidato eacute eleito aleacutem disso natildeo existe implementaccedilatildeo dos meacutetodos TRS e IRV para

31

eleiccedilotildees com mais de um candidato eleito jaacute que eles se comportariam exatamente comono FPTP

A maioria das linguagens de programaccedilatildeo senatildeo todas possuem um gerador de nuacuteme-ros pseudoaleatoacuterios que fornece a possibilidade de definir uma seed para o gerador Estaseed funciona como um ponto de partida para a geraccedilatildeo dos nuacutemero e portanto todasimulaccedilatildeo que rodar com a mesma seed sempre teraacute os mesmos resultados Se nenhumvalor for fornecido pelo usuaacuterio o tempo atual do sistema eacute utilizado As opccedilotildees subse-quentes satildeo a escolha do nuacutemero de eleitores gerados e o nuacutemero de vagas (Figura 3) Senenhum valor for fornecido o nuacutemero de eleitores padratildeo utilizado eacute 1000 e o nuacutemero devagas igual a 1

Figura 4 ndash Captura de tela 3

Este simulador possui dois modos para a criaccedilatildeo dos rankings dos eleitores No modoManipulate (Figura 4) primeiramente se define o nuacutemero de candidatos atraveacutes do campode entrada ao lado do tiacutetulo Candidates ou alternativamente pode-se adicionar candida-tos um a um atraveacutes do sinal de mais na parte inferior da paacutegina Para cada candidatoeacute possiacutevel definir a porcentagem de seus eleitores que optaraacute pelo voto taacutetico e pelovoto de minoria Tambeacutem eacute possiacutevel alterar o nome dos candidatos se for do interessedo usuaacuterio

32

Figura 5 ndash Captura de tela 4

Figura 6 ndash Captura de tela 5

33

Figura 7 ndash Captura de tela 6

Apoacutes a criaccedilatildeo dos candidatos o usuaacuterio pode criar perfis de eleitores que definiratildeo demaneira exata como partes da populaccedilatildeo iraacute votar (Figura 5) Em cada perfil se defineo valor em porcentos da populaccedilatildeo votante que o adotaraacute e a nota de cada candidatoTambeacutem eacute possiacutevel nomear cada perfil livremente

No modo Generate (Figura 6) eacute onde o gerador de nuacutemeros pseudoaleatoacuterios eacute usadoNesse modo ao inveacutes do usuaacuterio criar perfis de eleitores ele define qual seraacute a distribuiccedilatildeoadotada para a geraccedilatildeo de notas de cada candidato Essas distribuiccedilotildees seratildeo mais bemdetalhadas no Capiacutetulo 5 Da mesma maneira que no modo Manipulate nesse modotambeacutem eacute possiacutevel definir os valores para os dois tipos de voto uacutetil os votos taacuteticos eos votos de minoria No primeiro estatildeo incluiacutedas as estrateacutegias de mudanccedila de votoespeciacuteficas de cada sistema como o bullet voting no AVS e SVS ou quando a preferecircnciade um eleitor claramente natildeo possui chances de vitoacuteria e ele muda seu voto para um doscandidatos que esteja na lideranccedila o que ocorre no FPTP e TRS O voto de minoriase apresenta apenas no FPTP em eleiccedilotildees onde mais de um candidato eacute eleito Se apreferecircncia de um eleitor claramente lidera a eleiccedilatildeo por ser tambeacutem a preferecircncia damaior parte da populaccedilatildeo esse eleitor pode mudar o seu voto para uma segunda opccedilatildeona esperanccedila de eleger dois de seus candidatos favoritos

Por fim em ambos os modos o usuaacuterio tem a opccedilatildeo de definir coalizotildees entre oscandidatos se o sistema TRS estiver habilitado pois as coalizotildees apenas se manifestamnesse sistema Essas coalizotildees alteraratildeo as notas dos candidatos dependendo dos outroscandidatos pertencentes a elas (Figura 7)

A aplicaccedilatildeo pode ser encontrada na paacutegina httpelectionsimpythonanywherecom

34

4 CENAacuteRIOS PERTINENTES

Para todos os cenaacuterios deste capiacutetulo seraacute usada a seed do simulador igual a 100 e apopulaccedilatildeo de eleitores igual a 1000 para que exista consistecircncia na anaacutelise e tambeacutem paraque possa haver replicaccedilatildeo dos resultados se necessaacuterio

41 CENAacuteRIO 1 VOTO TAacuteTICO

Neste exemplo teremos quatro candidatos Ana Beto Carla e Diego Ana e Betoseratildeo gerados a partir da distribuiccedilatildeo Neutral (Figura 47) Carla da distribuiccedilatildeo Disliked(Figura 51) e Diego da Hated (Figura 55) Para a simulaccedilatildeo com a seed 100 o melhorcandidato a ser eleito ou seja aquele que maximiza a meacutedia das notas dos eleitores eacute oBeto com uma meacutedia de 0073 Para cada sistema seratildeo comparados os resultados semvoto taacutetico aos com 20 de voto taacutetico a favor da Ana Abaixo se encontram osresultados para o sistema FPTP

Figura 8 ndash FPTP - Cenaacuterio 1 sem voto taacutetico

Figura 9 ndash TRS segundo turno - Cenaacuterio 1 sem voto taacutetico

35

Figura 10 ndash IRV primeiro turno - Cenaacuterio 1

Figura 11 ndash IRV segundo turno - Cenaacuterio 1

Figura 12 ndash IRV terceiro turno - Cenaacuterio 1

36

Figura 13 ndash AVS - Cenaacuterio 1 sem voto taacutetico

Figura 14 ndash BC - Cenaacuterio 1 sem voto taacutetico

Figura 15 ndash SVS - Cenaacuterio 1 sem voto taacutetico

37

Nesse cenaacuterio sem voto taacutetico o uacutenico sistema que natildeo elege o Beto eacute o AVS Todosos outros elegem o melhor candidato Ou seja apesar de Beto ter uma melhor meacutediadas notas dos eleitores existem mais eleitores que ranqueiam Ana com uma nota acimade 0 No entanto apenas 20 dos eleitores de Diego e Carla que preferem a Ana aoinveacutes do Beto satildeo o suficiente para fazer Beto natildeo ser eleito se eles decidirem abandonarsua primeira opccedilatildeo e votar na Ana Considerando a vantagem que os votos taacuteticosproporcionam agrave Ana esta eacute eleita em todos os sistemas menos o TRS e o IRV

Figura 16 ndash FPTP - Cenaacuterio 1 - 20 de voto taacutetico na Ana

Figura 17 ndash TRS segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

38

Figura 18 ndash IRV primeiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

Figura 19 ndash IRV segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

Figura 20 ndash IRV terceiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

39

Figura 21 ndash AVS - Cenaacuterio 1 20 de voto taacutetico na Ana

Figura 22 ndash BC - Cenaacuterio 1 20 de voto taacutetico na Ana

Figura 23 ndash SVS - Cenaacuterio 1 20 de voto taacutetico na Ana

40

Eacute claro que se os eleitores que preferem o Beto tambeacutem votassem de maneira estra-teacutegica a situaccedilatildeo se equilibraria e haveria o mesmo niacutevel de concorrecircncia entre os doiscandidatos que ocorre quando natildeo haacute voto taacutetico Poreacutem no Borda Count esse equiliacute-brio pode natildeo acontecer e as estrateacutegias de compromising e burying podem acabar saindopela culatra se uma porcentagem elevada dos eleitores as adotarem Abaixo encontram-seos resultados para esse sistema quando 100 dos eleitores de Carla e Diego se comportammaliciosamente

Figura 24 ndash BC - Cenaacuterio 1 100 de voto taacutetico na Ana e Beto

Por causa do uso demasiado da estrateacutegia burying Ana e Beto perdem muitos pontose isso abre espaccedilo para uma vitoacuteria da Carla No entanto para porcentagens menores que100 o Beto ainda eacute o vencedor

Essas duas estrateacutegias tambeacutem foram implementadas nesse simulador para o sistemaIRV e eacute possiacutevel ver como ele eacute resistente a elas Para que seja possiacutevel mudar os resultadosde uma eleiccedilatildeo sob o IRV eacute necessaacuterio mudar a ordem de eliminaccedilatildeo dos candidatos paraque o seu candidato preferido acabe enfrentando um candidato mais fraco nas rodadasfinais Isso natildeo ocorre com compromising e burying No proacuteximo cenaacuterio seraacute analisadacomo eacute possiacutevel modificar os resultados de uma eleiccedilatildeo sob o IRV

Esses resultados podem ser replicados acessando os linksSem votos taacuteticos lthttpelectionsimpythonanywherecomdirect_res1111110

--[0021][22Ana2222Beto222022Carla2222Diego22]------100gt

Com 20 de voto taacutetico lthttpelectionsimpythonanywherecomdirect_res1111110--[0021][22Ana222022Beto2222Carla2222Diego22]1-[02000]---100gt

Com 100 de voto taacuteticona Ana e Beto lthttpelectionsimpythonanywherecomdirect_res0000100--[0021][22Ana222022Beto222022Carla2222Diego22]1-[101000]---100gt

41

42 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV

Neste cenaacuterio teremos Ana Carla e Beto concorrendo e trecircs perfis distintos que apoiamcada candidato As distribuiccedilotildees de notas dos perfis se encontram na tabela abaixo

Tabela 12 ndash Distribuiccedilatildeo de notas - Cenaacuterio 2

Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

deeleitores

1 10 5 0 422 0 10 5 303 5 0 10 28

Com essas distribuiccedilotildees Carla eacute eliminada na primeira rodada e seus 28 de votossatildeo transferidos para a segunda opccedilatildeo de seus eleitores Ana que eacute eleita com 70 dosvotos e uma meacutedia de 56

Figura 25 ndash IRV primeiro turno - Cenaacuterio 2

Figura 26 ndash IRV segundo turno - Cenaacuterio 2

42

Cientes desse provaacutevel futuro cenaacuterio onde Ana eacute eleita uma pequena parte dos elei-tores de Beto estrategicamente o abandona e decide apoiar Carla na esperanccedila de leva-laao segundo turno contra Ana As novas distribuiccedilotildees de notas se encontram na tabelaabaixo com essa porccedilatildeo de eleitores representada pelo perfil 4

Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2

Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

deeleitores

1 10 5 0 422 0 10 5 283 5 0 10 284 0 8 10 2

Essa mudanccedila estrateacutegica de voto altera a ordem de eliminaccedilotildees do sistema com Betosendo o primeiro a ser eliminado Com isso seus votos satildeo naturalmente transferidos paraCarla que derrota Ana no segundo turno com 58 dos votos

Figura 27 ndash IRV primeiro turno com voto taacutetico - Cenaacuterio 2

Figura 28 ndash IRV segundo turno com voto taacutetico - Cenaacuterio 2

43

Percebendo que a eleiccedilatildeo de Beto natildeo era provaacutevel seus eleitores conseguiram aomenos impedir a eleiccedilatildeo do pior candidato para eles Mas para isso foi necessaacuterio queeles tivessem a informaccedilatildeo de como os outros eleitores votariam Uma aproximaccedilatildeo dessasinformaccedilotildees poderia ser obtida em um cenaacuterio real com poucos candidatos atraveacutes depesquisas eleitorais poreacutem se o nuacutemero de candidatos eacute significativo uma noccedilatildeo completadas distribuiccedilotildees dos rankings dos eleitores se torna muito menos viaacutevel e dificulta aformulaccedilatildeo de estrateacutegias para alterar a ordem em que os candidatos satildeo eliminados

Esses resultados podem ser replicados acessando os linksSem voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana22

22Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

Com voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana

2222Beto2222Carla22]-----42Voter20Profile2001020520028Voter20Profile2010201020528Voter20Profile202520020102Voter20Profile20302082010100gt

43 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE

O interessante dos sistemas IRV e TRS eacute que os resultados do cenaacuterio anterior po-deriam ter sido obtidos ao inveacutes do voto taacutetico pela sua natildeo-monotonicidade Seriapossiacutevel que a Carla derrotasse a Ana no segundo turno atraveacutes do proacuteprio aumento depopularidade da Ana Assumindo que essa popularizaccedilatildeo ocorresse entre os candidatosdo perfil 2 onde 3 passasse a apoiar a Ana ao inveacutes do Beto as novas distribuiccedilotildeesseguiriam a tabela abaixo

Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

deeleitores

1 10 5 0 452 0 10 5 273 5 0 10 28

Dessa maneira Beto agora com uma porcentagem dos eleitores menor do que a deCarla seraacute eliminado na primeira rodada e como seus eleitores tecircm a Carla como segundaopccedilatildeo ela receberaacute todos os seus votos e seraacute eleita na segunda rodada As rodadas doIRV podem ser vistas nas figuras 29 e 30

44

Figura 29 ndash IRV primeiro turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

Figura 30 ndash IRV segundo turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

Tabela 15 ndash Resultados do Cenaacuterio 3Candidato

eleitoMeacutedia das

notasAntes da

popularizaccedilatildeode Ana

Ana 56

Apoacutespopularizaccedilatildeo

de AnaCarla 415

Os efeitos dessa caracteriacutestica se refletem na satisfaccedilatildeo meacutedia da populaccedilatildeo A Ana eacuteclaramente a melhor candidata e mesmo com o seu ganho de popularidade (ou devido aele) a Carla eacute eleita

Esses resultados podem ser replicados acessando os linksAntes da popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecom

direct_res0010000---[22Ana2222Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

45

Apoacutes popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana2222Beto2222Carla22]-----45Voter20Profile2001020520027Voter20Profile2010201020528Voter20Profile20252002010100gt

44 CENAacuteRIO 4 COALIZOtildeES

O TRS por ser organizado em dois turnos separados normalmente a semanas dedistacircncia um do outro acaba abrindo brecha agrave mudanccedila de opiniatildeo por parte dos eleitorese o desenvolvimento de novas estrateacutegias por parte dos candidatos tais como a coalizatildeocom candidatos jaacute eliminados Com isso em mente nesse cenaacuterio teremos novamenteos quatro candidatos Ana Beto Carla e Diego Os trecircs primeiros seratildeo gerados dadistribuiccedilatildeo Neutral e Diego da distribuiccedilatildeo Disliked

Figura 31 ndash TRS turno 1 - Cenaacuterio 4

No TRS normal Ana Beto e Carla possuem com essas distribuiccedilotildees quantidades devotos muito proacuteximas com Beto e Carla indo para o segundo turno Carla estaacute 10 votosatraacutes de Beto e decide aproveitar o espaccedilo de tempo entre os dois turnos para tentaragregar mais votos Com isso Carla se aproxima de Diego e juntos formam uma coalizatildeoNo entanto com sua baixa popularidade Diego acaba ferindo a reputaccedilatildeo de Carla etorna o segundo turno muito mais faacutecil para Beto (Figura 33) Se Carla tivesse buscado osuporte de Ana por outro lado ela se veria vitoriosa no segundo turno e com uma amplavantagem sobre o Beto (Figura 34) Ou ateacute mesmo sem buscar uma coalizatildeo mesmosendo uma corrida apertada Carla teria naturalmente sido eleita (Figura 32)

Esses resultados podem ser replicados acessando os linksSem coalizotildees lthttpelectionsimpythonanywherecomdirect_res0100000

--[0002][22Ana222022Beto2222Carla2222Diego22]------100gt

46

Figura 32 ndash TRS turno 2 - Cenaacuterio 4

Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4

Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4

47

Coalizatildeo Carla e Diego lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2203Carla20Diego-100gt

Coalizatildeo Carla e Ana lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2200Carla20Ana-100gt

45 CENAacuteRIO 5 DILEMA DO PRISIONEIRO

Neste cenaacuterio temos uma eleiccedilatildeo de uma vaga com trecircs candidatos concorrentes e trecircsperfis distintos de eleitores que seguiratildeo as seguintes distribuiccedilotildees

Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5

Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

deeleitores

1 10 -10 5 362 -10 10 5 343 -10 -10 5 30

Esse contexto nos remete ao notaacutevel dilema do prisioneiro Nele dois prisioneiroscuacutemplices satildeo interrogados individualmente sem poder se comunicar um com o outro ecada um enfrenta o dilema de delatar ou natildeo o seu parceiro Se os dois prisioneirosdecidem se manter calados sobre o crime ambos satildeo sentenciados a um ano de prisatildeo Seapenas um deles dedurar o outro o traidor sai livre enquanto seu parceiro eacute condenadoa trecircs anos Se ambos dedurarem um ao outro eles satildeo condenados juntos a dois anosde prisatildeo Esse dilema eacute uma ideia claacutessica presente no estudo da teoria dos jogos sendooriginalmente elaborada por Merrill Flood e Melvin Dresher em 1950 e mais tarde sendonomeada de dilema dos prisioneiros por Albert W Tucker (POUNDSTONE 1992)

O que esse dilema nos mostra eacute a tentaccedilatildeo que o indiviacuteduo deteacutem se sua racionalizaccedilatildeoestiver voltada para seus proacuteprios interesses e somente eles em oposiccedilatildeo a pensar no bemdo grupo como um todo Neste cenaacuterio encontramos dois grupos de eleitores expressiva-mente opostos os perfis 1 e 2 Se qualquer uma das preferecircncias desses perfis fosse eleitaisso significaria uma alta rejeiccedilatildeo de maior parte da populaccedilatildeo No entanto eles possuema segunda opccedilatildeo em comum a Carla que por sua vez eacute a preferecircncia do terceiro perfilPortanto a eleiccedilatildeo da Carla seria logicamente o resultado oacutetimo

Mesmo assim a Ana eacute eleita nos dois sistemas acima o que natildeo parece justo poispela tabela 16 eacute evidente que apenas 36 da populaccedilatildeo a aprova enquanto que os outros64 a reprovam ao maacuteximo O sistema IRV se comporta de maneira idecircntica ao TRS

48

Figura 35 ndash FPTP - Cenaacuterio 5

Figura 36 ndash TRS segundo turno - Cenaacuterio 5

nesta situaccedilatildeo Com esse resultado a meacutedia das notas eacute -28 No entanto os trecircs sistemasseguintes nos apresentam resultados diferentes

Tabela 17 ndash Resultados do Cenaacuterio 5

Sistema Candidatoeleito

Meacutedia dasnotas

FPTP Ana -28TRS Ana -28IRV Ana -28AVS Carla 50BC Carla 50SVS Carla 50

49

Figura 37 ndash AVS - Cenaacuterio 5

Figura 38 ndash BC - Cenaacuterio 5

Tanto o AVS quanto o Borda Count e o SVS satildeo sistemas que consideram todasas opiniotildees de cada eleitor ao mesmo tempo e por isso satildeo capazes de eleger o melhorcandidato nesta situaccedilatildeo diferentemente do TRS que natildeo absorve completamente todosentimento do eleitor por todos os candidatos e o IRV que apesar de ser bem expressivoquebra esse processo em inuacutemeras rodadas o que permite a perda de informaccedilatildeo ao longodelas

Esses resultados podem ser replicados acessando o linklthttpelectionsimpythonanywherecomdirect_res1111110---[22Ana

222022Beto222022Carla22]-----36Voter20Profile2001020-1020534Voter20Profile201-10201020530Voter20Profile202-1020-10205100gt

50

Figura 39 ndash SVS - Cenaacuterio 5

46 CENAacuteRIO 6 VOTO DE MINORIA

Neste cenaacuterio temos uma eleiccedilatildeo com quatro candidatos e duas vagas A Ana seraacutea preferecircncia de uma extensa parte da populaccedilatildeo (distribuiccedilatildeo Loved Figura 53) Betoe Carla seratildeo candidatos razoavelmente populares (distribuiccedilatildeo Neutral Figura 47) eDiego seraacute a preferecircncia de apenas um pequeno grupo especiacutefico e rejeitado pela maioria(distribuiccedilatildeo Disliked Figura 51) Eacute intuitivo esperar que os dois candidatos eleitos seratildeoa Ana e ou o Beto ou a Carla e isso eacute exatamente o que ocorre na figura 40 no sistemaFPTP sem voto de minoria

Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria

Eacute evidente a discrepacircncia da quantidade de votos da Ana para os outros candidatose apesar de Beto e Carla serem mais populares que Diego os trecircs natildeo se encontrammuito afastados Poreacutem se a pequena fraccedilatildeo de candidatos que possuem a Ana como

51

Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego

preferecircncia e Diego como segunda opccedilatildeo optarem pelo voto de minoria a situaccedilatildeo mudacompletamente (Figura 41) Assim apesar de extensamente rejeitado Diego conquistaa segunda vaga e a meacutedia das notas despenca de 2929 para 0505 No entanto aindaexiste um cenaacuterio pior Se os outros grupos de eleitores pensarem da mesma forma eevitarem votar na Ana achando que sua eleiccedilatildeo jaacute estaacute assegurada apenas 80 de votode minoria para esses grupos jaacute eacute o suficiente para eliminaacute-la das eleiccedilotildees (Figura 42)Com a Ana eliminada a meacutedia das notas cai ainda mais para 0058

Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego

O sistema Bloc Vote eacute uma das soluccedilotildees para o voto de minoria Permitindo queos eleitores votem no mesmo nuacutemero de candidatos que de vagas a serem preenchidasnatildeo existe o iacutempeto a esse tipo de voto estrateacutegico O resultado desse sistema portantoretorna a meacutedia das notas a casa dos 29 (Figura 43) Os sistemas AVS Borda Count eSVS tambeacutem impedem a presenccedila do voto de minoria e atingem resultados semelhantes

52

Figura 43 ndash BV - Cenaacuterio 6

Tabela 18 ndash Resultados do Cenaacuterio 6

Sistema Candidatoseleitos

Meacutedia dasnotas

FPTP sem voto de minoriaAna eBeto 2929

FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

FPTP com 80 de voto de minoriaBeto eCarla 0058

Bloc VoteAna eCarla 2913

Esses resultados podem ser replicados acessando os links

Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

53

5 COMO FUNCIONA O SIMULADOR

O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

51 CLASSE ELECTIONS

Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

Figura 44 ndash estrutura candidates

bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

54

Figura 45 ndash estrutura voters

Figura 46 ndash estrutura votes

daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

55

Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

56

Figura 49 ndash PDF - Distribuiccedilatildeo Liked

Figura 50 ndash CDF - Distribuiccedilatildeo Liked

(dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

57

Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

58

Figura 53 ndash PDF - Distribuiccedilatildeo Loved

Figura 54 ndash CDF - Distribuiccedilatildeo Loved

funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

59

Figura 55 ndash PDF - Distribuiccedilatildeo Hated

Figura 56 ndash CDF - Distribuiccedilatildeo Hated

Meacutedia das Notas sumei

sumvj nij

etimes v

Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

60

Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

52 CLASSE FIRSTPASTTHEPOST

Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

61

Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

62

53 CLASSE TWOROUNDSYSTEM

A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

54 CLASSE INSTANTRUNOFFVOTING

A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

63

cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

55 CLASSE APPROVALVOTING

Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

56 CLASSE BORDACOUNT

Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

57 CLASSE SCOREVOTING

De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

64

58 CLASSE BLOCVOTE

O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

59 TECNOLOGIAS UTILIZADAS

A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

65

6 CONCLUSAtildeO

Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

66

REFEREcircNCIAS

AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

67

APEcircNDICES

APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

if(not len(selfvoter_profiles))

for voter in range(selfN_VOTERS)

candidates_rank = dict()

for candidate in reversed(range(selfN_CANDIDATES))

if(selfBIAS_VECTOR[candidate]==4)

candidates_rank[candidate] = self_sortear(selfloved)

elif(selfBIAS_VECTOR[candidate]==3)

candidates_rank[candidate] = self_sortear(selfliked)

elif(selfBIAS_VECTOR[candidate]==2)

candidates_rank[candidate] = self_sortear(selfdisliked)

elif(selfBIAS_VECTOR[candidate]==1)

candidates_rank[candidate] = self_sortear(selfhated)

elif(selfBIAS_VECTOR[candidate]==-1)

candidates_rank[candidate] = self_sortear(selfpolarizer

)

elif(selfBIAS_VECTOR[candidate]==-2)

candidates_rank[candidate] = self_sortear(self

more_polarizer)

else

candidates_rank[candidate] = self_sortear(selfneutral)

selfvotersappend(candidates_rank)

else

ranges = []

ranks = []

for prof in selfvoter_profiles

rangesappend(int(prof[pop_percentage]))

rank =

for index score in enumerate(prof[scores])

rank[index] = score

ranksappend(rank)

for index _range in enumerate(ranges)

for _ in range(int(selfN_VOTERS(_range100)))

selfvotersappend(ranks[index])

68

APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

for i in range(selfN_CANDIDATES)

selfcandidates[i] = 0

selfvotes[i] = set()

APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

for candidate in range(selfN_CANDIDATES)

rating_sum = 0

for voter in selfvoters

rating_sum += voter[candidate]

selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

APEcircNDICE D ndash MEacuteTODO GET_MEAN

Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

if len(winners) gt 1 or selfN_CANDIDATES gt 10

return selfcalculate_mean(winners)

else

chose_best = True if winners[0] == selfbest_candidate else

False

return selfstats[rsquomeansrsquo][winners[0]] chose_best

69

APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

rating_sum = 0

for voter in selfvoters

for candidate in winners

rating_sum += voter[candidate]

return rating_sum(selfN_VOTERSselfN_VACANCIES) False

APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

for i in range(1 selfN_VACANCIES + 2)

selfleading_candidatesappend(selfsorted_candidates[-i][self

CANDIDATE_INDEX])

APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

for leader in selfelecrounds[-1]

selfleading_candidatesappend(leader[0])

70

APEcircNDICE H ndash MEacuteTODO SORT_RANKS

Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

self_account_for_coalitions()

for voter in selfvoters

selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

(1)))

temp = []

for voter in selfsorted_voters

new_dict = defaultdict(list)

for k in voter

new_dict[k[1]]append(k[0])

tempappend(new_dict)

selfsorted_voters = []

for voter_index current_voter in enumerate(temp)

new_voter = []

for rating candidate_indexes in current_voteritems()

if len(current_voter[rating]) gt 1

shuffle(current_voter[rating])

for e in candidate_indexes

new_voterappend((e rating))

else

new_voterappend((candidate_indexes[0] rating))

selfsorted_votersappend(new_voter)

selfcandidates[new_voter[-1][0]] += 1

selfvotes[new_voter[-1][0]]add(voter_index)

71

APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

for candidate in selfvotes_copy

if candidate not in selfelecleading_candidates

for voter_index in selfvotes_copy[candidate]

for index _candidate in enumerate(reversed(selfelec

sorted_voters[voter_index]))

if _candidate[selfelecCANDIDATE_INDEX] in selfelec

leading_candidates

if randomrandom() lt selfelec

tactical_vote_percentages[_candidate[selfelec

CANDIDATE_INDEX]]

selfrankings_changed[voter_index] = copy

deepcopy(selfelecsorted_voters[voter_index])

selfrankings_changed[voter_index][-(index + 1)]

selfrankings_changed[voter_index][-1] = self

rankings_changed[voter_index][-1] self

rankings_changed[voter_index][-(index + 1)]

selfcandidates[candidate] -= 1

selfcandidates[_candidate[selfelec

CANDIDATE_INDEX]] += 1

selfvotes[candidate]remove(voter_index)

selfvotes[_candidate[selfelecCANDIDATE_INDEX

]]add(voter_index)

break

break

72

APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

half_vacancies = mathfloor(selfelecN_VACANCIES2)

for candidate in selfelecleading_candidates

if selfelecleading_candidatesindex(candidate) gt= half_vacancies

continue

for voter_index in selfvotes_copy[candidate]

if voter_index in selfrankings_changed

ranking = selfrankings_changed[voter_index]

else

ranking = copydeepcopy(selfelecsorted_voters[voter_index

])

for index _candidate in enumerate(reversed(ranking))

if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

leading_candidates or (_candidate[selfelec

CANDIDATE_INDEX] in selfelecleading_candidates and

selfelecleading_candidatesindex(_candidate[selfelec

CANDIDATE_INDEX]) gt= half_vacancies)

if _candidate[selfelecCANDIDATE_RANK] gt= 0

if randomrandom() lt selfelec

minority_vote_percentages[_candidate[selfelec

CANDIDATE_INDEX]]

selfcandidates[candidate] -= 1

selfcandidates[_candidate[selfelec

CANDIDATE_INDEX]] += 1

break

break

break

73

APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

self_account_for_coalitions()

for candidate in selfvotes

if candidate = selfwinner and candidate = selfsecond_place

for voter_index in selfvotes[candidate]

if voter_index in selfrankings_changed

ranking = selfrankings_changed[voter_index]

else

ranking = copydeepcopy(selfelecsorted_voters[

voter_index])

for index2 candidate in enumerate(reversed(ranking))

if candidate[selfelecCANDIDATE_INDEX] == selfwinner

selfcandidates[selfwinner] += 1

selfvotes[selfwinner]add(voter_index)

break

elif candidate[selfelecCANDIDATE_INDEX] == self

second_place

selfcandidates[selfsecond_place] += 1

selfvotes[selfsecond_place]add(voter_index)

break

selfsorted_candidates = selfelecsort_candidates(selfcandidates)

winners = []

vacancies = selfelecN_VACANCIES

for candidate in reversed(selfsorted_candidates)

if vacancies == 0

break

winnersappend(candidate[0])

vacancies -= 1

mean chose_best = selfelecget_mean(winners = winners)

74

APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

for voter_index voter in enumerate(selfelecsorted_voters)

voter_dict = dict()

og_voter_dict = dict()

for tup in voter

voter_dict[tup[0]] = tup[1]

og_voter_dict[tup[0]] = tup[1]

for coalition in selfeleccoalitions

for candidate in coalition

add_to_score = 0

for candidate2 in coalition

if candidate == candidate2

continue

half = og_voter_dict[candidate2[rsquovaluersquo]]2

if half lt 0

add_to_score += mathceil(half)

else

add_to_score += mathfloor(half)

if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

voter_dict[candidate[rsquovaluersquo]] = 10

elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

voter_dict[candidate[rsquovaluersquo]] = -10

else

voter_dict[candidate[rsquovaluersquo]] += add_to_score

selfrankings_changed[voter_index] = []

for candidate in voter_dict

selfrankings_changed[voter_index]append((candidate voter_dict[

candidate]))

selfrankings_changed[voter_index] = sorted(selfrankings_changed[

voter_index] key=lambda x x[1])

75

APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

selfelecroundsappend(selfsorted_candidates[_round])

if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

N_VACANCIES - 1)

return 2

elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

N_VOTERS gt 05)

return 1

else

selfelecexcludedadd(selfsorted_candidates[_round][selfelec

CANDIDATE_INDEX])

for voter_index in selfvotes[selfsorted_candidates[_round][self

elecCANDIDATE_INDEX]]

if voter_index in selfrankings_changed

for candidate in reversed(selfrankings_changed[voter_index

])

if candidate[selfelecCANDIDATE_INDEX] not in selfelec

excluded

selfcandidates[candidate[selfelecCANDIDATE_INDEX

]] += 1

selfvotes[candidate[selfelecCANDIDATE_INDEX]]

add(voter_index)

break

else

continue

else

for candidate in reversed(selfelecsorted_voters[

voter_index])

if candidate[selfelecCANDIDATE_INDEX] not in selfelec

excluded

selfcandidates[candidate[selfelecCANDIDATE_INDEX

]] += 1

selfvotes[candidate[selfelecCANDIDATE_INDEX]]

add(voter_index)

break

else

continue

selfsorted_candidates = selfelecsort_candidates(selfcandidates)

return 0

76

APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

for index in range(selfelecN_CANDIDATES)

selfcandidates[index] = 0

for voter in selfelecsorted_voters

for candidate in reversed(voter)

if candidate[selfelecCANDIDATE_SCORE] gt 0

selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

else

break

APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

for index in range(selfelecN_CANDIDATES)

selfcandidates[index] = 0

for voter in selfelecsorted_voters

if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

elecCANDIDATE_INDEX]]

selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

else

for candidate in reversed(voter)

if candidate[selfelecCANDIDATE_SCORE] gt 0

selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

else

break

77

APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

pos = set()

for index perc in enumerate(selfelectactical_vote_percentages)

if perc gt 0

posadd(index)

for candidate in selfeleccandidates

if candidate not in selfleading_candidates

for voter_index in selfvotes[candidate]

raised = None

for candidate_tuple in reversed(selfelecsorted_voters[voter_index

])

if candidate_tuple[selfelecCANDIDATE_INDEX] in self

leading_candidates

if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

if randomrandom() lt selfelectactical_vote_percentages[

candidate_tuple[selfelecCANDIDATE_INDEX]]

ranking = [None]selfelecN_CANDIDATES

ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

selfelecvoters[voter_index][candidate_tuple[selfelec

CANDIDATE_INDEX]])

raised = candidate_tuple[selfelecCANDIDATE_INDEX]

break

break

break

if raised = None

for _candidate in selfleading_candidates

if _candidate = ranking[-1][0]

ranking[0] = (_candidate selfelecvoters[voter_index][

_candidate])

buried = _candidate

break

i = 1

for candidate_tuple in selfelecsorted_voters[voter_index]

if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

buried]

continue

else

ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

selfelecvoters[voter_index][candidate_tuple[selfelec

CANDIDATE_INDEX]])

i += 1

selfrankings_changed[voter_index] = ranking

78

APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

for voter_index in selfvotes[candidate]

if randomrandom() lt selfelectactical_vote_percentages[candidate

]

for _candidate in selfleading_candidates

if _candidate = candidate

ranking = [None]selfelecN_CANDIDATES

ranking[0] = (_candidate selfelecvoters[voter_index][

_candidate])

buried = _candidate

break

i = 1

for candidate_tuple in selfelecsorted_voters[voter_index]

if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

continue

else

ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

selfelecvoters[voter_index][candidate_tuple[selfelec

CANDIDATE_INDEX]])

i += 1

selfrankings_changed[voter_index] = ranking

79

APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

for index in range(selfelecN_CANDIDATES)

selfcandidates[index] = 0

for voter_index voter in enumerate(selfelecsorted_voters)

score = 0

if voter_index in selfrankings_changed

for candidate in selfrankings_changed[voter_index]

selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

score += 1

else

for candidate in voter

selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

score += 1

APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

for voter_index voter in enumerate(selfelecsorted_voters)

if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

elecCANDIDATE_INDEX]]

selfrankings_changed[voter_index] = copydeepcopy(selfelec

sorted_voters[voter_index])

for candidate_index candidate in enumerate(reversed(voter))

if candidate_index == 0

selfrankings_changed[voter_index][-(candidate_index + 1)] = (

voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

else

selfrankings_changed[voter_index][-(candidate_index + 1)] = (

voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

80

APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

for index in range(selfelecN_CANDIDATES)

selfcandidates[index] = 0

for voter_index voter in enumerate(selfelecsorted_voters)

if voter_index in selfrankings_changed

for candidate in selfrankings_changed[voter_index]

selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

selfelecCANDIDATE_RANK]

else

for candidate in voter

selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

selfelecCANDIDATE_RANK]

APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

for index in range(selfelecN_CANDIDATES)

selfcandidates[index] = 0

for voter in selfelecsorted_voters

votes = selfelecN_VACANCIES

for candidate in reversed(voter)

if votes == 0

break

selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

votes -= 1

  • Folha de aprovaccedilatildeo
  • Agradecimentos
  • Epiacutegrafe
  • Resumo
  • Abstract
  • Lista de ilustraccedilotildees
  • Lista de Coacutedigos
  • Lista de tabelas
  • Lista de abreviaturas e siglas
  • Sumaacuterio
  • INTRODUCcedilAtildeO
    • MOTIVACcedilAtildeO E OBJETIVO
    • MEacuteTODO
    • ESTRUTURA
      • SISTEMAS ELEITORAIS
        • FISRT PAST THE POST
          • Exemplo
          • Vantagens e Desvantagens do FPTP
          • Voto Uacutetil no FPTP
            • TWO-ROUND SYSTEM
              • Exemplo
              • Vantagens e Desvantagens do TRS
              • Voto Uacutetil no TRS
                • INSTANT-RUNOFF VOTING
                  • Exemplo
                  • Vantagens e Desvantagens do IRV
                  • Voto Uacutetil no IRV
                    • APPROVAL VOTING SYSTEM
                      • Exemplo
                      • Vantagens e Desvantagens do AVS
                      • Voto Uacutetil no AVS
                        • THE BORDA COUNT
                          • Exemplo
                          • Vantagens e Desvantagens do BC
                          • Voto Uacutetil no BC
                            • SCORE VOTING SYSTEM
                              • Exemplo
                              • Vantagens e Desvantagens do SVS
                              • Voto Uacutetil no SVS
                                • BLOC VOTE
                                  • Exemplo
                                  • Voto Uacutetil no BV
                                      • O SIMULADOR
                                      • CENAacuteRIOS PERTINENTES
                                        • CENAacuteRIO 1 VOTO TAacuteTICO
                                        • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                        • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                        • CENAacuteRIO 4 COALIZOtildeES
                                        • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                        • CENAacuteRIO 6 VOTO DE MINORIA
                                          • COMO FUNCIONA O SIMULADOR
                                            • CLASSE Elections
                                            • CLASSE FirstPastThePost
                                            • CLASSE TwoRoundSystem
                                            • CLASSE InstantRunoffVoting
                                            • CLASSE ApprovalVoting
                                            • CLASSE BordaCount
                                            • CLASSE ScoreVoting
                                            • CLASSE BlocVote
                                            • TECNOLOGIAS UTILIZADAS
                                              • CONCLUSAtildeO
                                              • Referecircncias
                                              • Meacutetodo create_voters
                                              • Meacutetodo create_candidates
                                              • Meacutetodo calculate_means
                                              • Meacutetodo get_mean
                                              • Meacutetodo calculate_mean
                                              • Meacutetodo set_leading_candidates
                                              • Meacutetodo irv_set_leading_candidates
                                              • Meacutetodo sort_ranks
                                              • Meacutetodo fptp_count_tactical_votes
                                              • Meacutetodo fptp_count_minority_votes
                                              • Meacutetodo trs_second_round
                                              • Meacutetodo trs_account_for_coalitions
                                              • Meacutetodo irv_count_votes
                                              • Meacutetodo avs_count_votes
                                              • Meacutetodo avs_count_votes_with_tactical
                                              • Meacutetodo irv_apply_tactical_votes
                                              • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                              • Meacutetodo bc_sum_candidates_scores
                                              • Meacutetodo svs_apply_tactical_votes
                                              • Meacutetodo svs_sum_candidates_scores
                                              • Meacutetodo bv_count_votes

    GABRIEL S BEVILAQUA

    ELEICcedilOtildeES MAIS JUSTAS SIMULANDO E INTERPRETANDO DIFERENTESSISTEMAS DE VOTACcedilAtildeO

    Trabalho de conclusatildeo de curso de graduaccedilatildeoapresentado ao Departamento de Ciecircncia daComputaccedilatildeo da Universidade Federal do Riode Janeiro como parte dos requisitos para ob-tenccedilatildeo do grau de Bacharel em Ciecircncia daComputaccedilatildeo

    Orientador Prof Viniacutecius Gusmatildeo Pereira de Saacute

    RIO DE JANEIRO2019

    AGRADECIMENTOS

    Gostaria de agradecer primeiramente agrave UFRJ que me permitiu embarcar nessa jor-nada pela busca de conhecimento nesse fascinante campo que eacute a computaccedilatildeo Ao meuorientador Viniacutecius Gusmatildeo Pereira de Saacute pela atenccedilatildeo e ajuda no esclarecimento dosmelhores caminhos a se tomar na elaboraccedilatildeo deste trabalho Aos meus pais e a todaminha familia pelo incentivo e apoio incondicional A minha namorada pela paciecircnciae compreensatildeo nesta complicada fase da minha formaccedilatildeo acadecircmica E aos meus amigosque ja passaram ou que estatildeo passando pelo mesmo processo de conclusatildeo que eu e quecompartilham das mesmas dificuldades

    ldquoElections are won by men and women chiefly because most people vote against somebodyrather than for somebody

    Franklin P Adams

    RESUMO

    Existem diversos tipos de sistemas eleitorais em uso ao redor do mundo Cada paiacutes optapelo meacutetodo que melhor se adequa ao seu modo de governar muitas vezes utilizandovariaccedilotildees de um mesmo meacutetodo ou ateacute uma combinaccedilatildeo destes dependendo do cargopoliacutetico em questatildeo Atraveacutes da implementaccedilatildeo de um programa que permite simular umextenso nuacutemero de eleitores esta tese procura descobrir quais meacutetodos trazem resultadosque maximizam a taxa de satisfaccedilatildeo meacutedia da populaccedilatildeo quando testados sob diferentescenaacuterios poliacuteticos Cada eleitor simulado atribuiraacute notas para os candidatos que seratildeogeradas dependendo do cenaacuterio de maneira aleatoacuteria seguindo certa distribuiccedilatildeo de pro-babilidade ou deterministicamente atraveacutes de perfis eleitorais Tambeacutem seratildeo incluiacutedosnas simulaccedilotildees fatores reais de uma eleiccedilatildeo como o voto uacutetil e as coalizotildees entre can-didatos para que seja possiacutevel determinar de que maneira esses paracircmetros influenciamno resultado final Seraacute possiacutevel perceber que alguns dos sistemas satildeo muito eficazes naseleccedilatildeo dos melhores candidatos poreacutem afetados pelos votos taacuteticos enquanto outros satildeoresistentes a esses mas pecam em eficiecircncia

    Palavras-chave Simulaccedilotildees Sistemas Eleitorais Satisfaccedilatildeo Meacutedia

    ABSTRACT

    There are several types of electoral systems in use around the world Each country choosesthe method that best fits their governance often using variations of the same method oreven a combination of these depending on the political position in question Through theimplementation of a program that simulates an extensive number of voters this thesisseeks to find out which methods bring results that maximize the rate of population sat-isfaction when tested under different political scenarios Each simulated voter will assignnotes to the candidates that will be generated depending on the scenario in randomfashion following a certain probability distribution or deterministically through electoralprofiles Also included in the simulations are the real factors of an election such as tacti-cal votes and coalitions between candidates so that it is possible to determine how theseparameters influence the final result It will be possible to see that some of the systemsare very effective in the selection of the best candidates however affected by tactical voteswhile others are resistant to these but lack efficiency

    Keywords Simulations Electoral Systems Satisfaction Rate

    LISTA DE ILUSTRACcedilOtildeES

    Figura 1 ndash de paiacuteses de cada tipo de regime 1946-2016 17Figura 2 ndash Captura de tela 1 30Figura 3 ndash Captura de tela 2 30Figura 4 ndash Captura de tela 3 31Figura 5 ndash Captura de tela 4 32Figura 6 ndash Captura de tela 5 32Figura 7 ndash Captura de tela 6 33Figura 8 ndash FPTP - Cenaacuterio 1 sem voto taacutetico 34Figura 9 ndash TRS segundo turno - Cenaacuterio 1 sem voto taacutetico 34Figura 10 ndash IRV primeiro turno - Cenaacuterio 1 35Figura 11 ndash IRV segundo turno - Cenaacuterio 1 35Figura 12 ndash IRV terceiro turno - Cenaacuterio 1 35Figura 13 ndash AVS - Cenaacuterio 1 sem voto taacutetico 36Figura 14 ndash BC - Cenaacuterio 1 sem voto taacutetico 36Figura 15 ndash SVS - Cenaacuterio 1 sem voto taacutetico 36Figura 16 ndash FPTP - Cenaacuterio 1 - 20 de voto taacutetico na Ana 37Figura 17 ndash TRS segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana 37Figura 18 ndash IRV primeiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana 38Figura 19 ndash IRV segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana 38Figura 20 ndash IRV terceiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana 38Figura 21 ndash AVS - Cenaacuterio 1 20 de voto taacutetico na Ana 39Figura 22 ndash BC - Cenaacuterio 1 20 de voto taacutetico na Ana 39Figura 23 ndash SVS - Cenaacuterio 1 20 de voto taacutetico na Ana 39Figura 24 ndash BC - Cenaacuterio 1 100 de voto taacutetico na Ana e Beto 40Figura 25 ndash IRV primeiro turno - Cenaacuterio 2 41Figura 26 ndash IRV segundo turno - Cenaacuterio 2 41Figura 27 ndash IRV primeiro turno com voto taacutetico - Cenaacuterio 2 42Figura 28 ndash IRV segundo turno com voto taacutetico - Cenaacuterio 2 42Figura 29 ndash IRV primeiro turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3 44Figura 30 ndash IRV segundo turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3 44Figura 31 ndash TRS turno 1 - Cenaacuterio 4 45Figura 32 ndash TRS turno 2 - Cenaacuterio 4 46Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4 46Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4 46Figura 35 ndash FPTP - Cenaacuterio 5 48Figura 36 ndash TRS segundo turno - Cenaacuterio 5 48

    Figura 37 ndash AVS - Cenaacuterio 5 49Figura 38 ndash BC - Cenaacuterio 5 49Figura 39 ndash SVS - Cenaacuterio 5 50Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria 50Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego 51Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego 51Figura 43 ndash BV - Cenaacuterio 6 52Figura 44 ndash estrutura candidates 53Figura 45 ndash estrutura voters 54Figura 46 ndash estrutura votes 54Figura 47 ndash PDF - Distribuiccedilatildeo Neutral 55Figura 48 ndash CDF - Distribuiccedilatildeo Neutral 55Figura 49 ndash PDF - Distribuiccedilatildeo Liked 56Figura 50 ndash CDF - Distribuiccedilatildeo Liked 56Figura 51 ndash PDF - Distribuiccedilatildeo Disliked 57Figura 52 ndash CDF - Distribuiccedilatildeo Disliked 57Figura 53 ndash PDF - Distribuiccedilatildeo Loved 58Figura 54 ndash CDF - Distribuiccedilatildeo Loved 58Figura 55 ndash PDF - Distribuiccedilatildeo Hated 59Figura 56 ndash CDF - Distribuiccedilatildeo Hated 59Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer 60Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer 60Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer 61Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer 61

    LISTA DE COacuteDIGOS

    A1 Meacutetodo create_voters 67B1 Meacutetodo create_candidates 68C1 Meacutetodo calculate_means 68D1 Meacutetodo get_mean 68E1 Meacutetodo calculate_mean 69F1 Meacutetodo set_leading_candidates 69G1 Meacutetodo irv_set_leading_candidates 69H1 Meacutetodo sort_ranks 70I1 Meacutetodo fptp_count_tactical_votes 71J1 Meacutetodo fptp_count_minority_votes 72K1 Meacutetodo trs_second_round 73L1 Meacutetodo trs_account_for_coalitions 74M1 Meacutetodo irv_count_votes 75N1 Meacutetodo avs_count_votes 76O1 Meacutetodo avs_count_votes_with_tactical 76P1 Meacutetodo irv_apply_tactical_votes 77Q1 Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo) 78R1 Meacutetodo bc_sum_candidates_scores 79S1 Meacutetodo svs_apply_tactical_votes 79T1 Meacutetodo svs_sum_candidates_scores 80U1 Meacutetodo bv_count_votes 80

    LISTA DE TABELAS

    Tabela 1 ndash Exemplo FPTP 18Tabela 2 ndash 2deg turno do TRS 20Tabela 3 ndash Exemplo IRV 22Tabela 4 ndash Desenvolvimento do IRV 22Tabela 5 ndash Exemplo AVS 24Tabela 6 ndash Resultado AVS 24Tabela 7 ndash Resultado BC 26Tabela 8 ndash Exemplo SVS 27Tabela 9 ndash Resultado SVS 27Tabela 10 ndash Exemplo BV 28Tabela 11 ndash Resultado BV 28Tabela 12 ndash Distribuiccedilatildeo de notas - Cenaacuterio 2 41Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2 42Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3 43Tabela 15 ndash Resultados do Cenaacuterio 3 44Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5 47Tabela 17 ndash Resultados do Cenaacuterio 5 48Tabela 18 ndash Resultados do Cenaacuterio 6 52

    LISTA DE ABREVIATURAS E SIGLAS

    FPTP First Past The Post

    TRS Two-Round System

    IRV Instant Runoff Voting

    AVS Approval Voting System

    BC Borda Count

    SVS Score Voting System

    BV Bloc Vote

    SUMAacuteRIO

    1 INTRODUCcedilAtildeO 1511 MOTIVACcedilAtildeO E OBJETIVO 1512 MEacuteTODO 1513 ESTRUTURA 15

    2 SISTEMAS ELEITORAIS 1721 FISRT PAST THE POST 17211 Exemplo 18212 Vantagens e Desvantagens do FPTP 18213 Voto Uacutetil no FPTP 1922 TWO-ROUND SYSTEM 19221 Exemplo 20222 Vantagens e Desvantagens do TRS 20223 Voto Uacutetil no TRS 2123 INSTANT-RUNOFF VOTING 21231 Exemplo 22232 Vantagens e Desvantagens do IRV 22233 Voto Uacutetil no IRV 2324 APPROVAL VOTING SYSTEM 24241 Exemplo 24242 Vantagens e Desvantagens do AVS 24243 Voto Uacutetil no AVS 2525 THE BORDA COUNT 25251 Exemplo 25252 Vantagens e Desvantagens do BC 26253 Voto Uacutetil no BC 2626 SCORE VOTING SYSTEM 26261 Exemplo 27262 Vantagens e Desvantagens do SVS 27263 Voto Uacutetil no SVS 2727 BLOC VOTE 28271 Exemplo 28272 Voto Uacutetil no BV 29

    3 O SIMULADOR 30

    4 CENAacuteRIOS PERTINENTES 3441 CENAacuteRIO 1 VOTO TAacuteTICO 3442 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV 4143 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE 4344 CENAacuteRIO 4 COALIZOtildeES 4545 CENAacuteRIO 5 DILEMA DO PRISIONEIRO 4746 CENAacuteRIO 6 VOTO DE MINORIA 50

    5 COMO FUNCIONA O SIMULADOR 5351 CLASSE Elections 5352 CLASSE FirstPastThePost 6053 CLASSE TwoRoundSystem 6254 CLASSE InstantRunoffVoting 6255 CLASSE ApprovalVoting 6356 CLASSE BordaCount 6357 CLASSE ScoreVoting 6358 CLASSE BlocVote 6459 TECNOLOGIAS UTILIZADAS 64

    6 CONCLUSAtildeO 65

    REFEREcircNCIAS 66

    APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS 67

    APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES 68

    APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS 68

    APEcircNDICE D ndash MEacuteTODO GET_MEAN 68

    APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN 69

    APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES 69

    APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES 69

    APEcircNDICE H ndash MEacuteTODO SORT_RANKS 70

    APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES 71

    APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES 72

    APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND 73

    APEcircNDICE L ndash MEacuteTODOTRS_ACCOUNT_FOR_COALITIONS 74

    APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES 75

    APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES 76

    APEcircNDICE O ndash MEacuteTODOAVS_COUNT_VOTES_WITH_TACTICAL 76

    APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES 77

    APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES (CON-TINUACcedilAtildeO) 78

    APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES 79

    APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES 79

    APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES 80

    APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES 80

    15

    1 INTRODUCcedilAtildeO

    Em toda eleiccedilatildeo existe pelo menos um grupo de indiviacuteduos que sai completamentedesfavorecido e insatisfeito com o resultado O contentamento completo de uma populaccedilatildeoeacute certamente improvaacutevel e muitas vezes impossiacutevel considerando a gama de candidatosque se dispotildee a concorrer Em todo caso o miacutenimo que pode ser feito eacute escolher demaneira eficiente o melhor candidato ao cargo dentre as opccedilotildees disponiacuteveis Diante dissoeacute necessaacuterio avaliar como essa escolha eacute feita e quais meacutetodos satildeo capazes de tornaacute-larealidade

    11 MOTIVACcedilAtildeO E OBJETIVO

    Em conformidade com o extenso nuacutemero de sistemas eleitorais pelo mundo este tra-balho tem como objetivo testar uma porccedilatildeo desses sistemas sob a simulaccedilatildeo de diferentescenaacuterios especiacuteficos a fim de determinar quais deles podem ser considerados como os maisjustos perante a taxa de satisfaccedilatildeo meacutedia da populaccedilatildeo

    12 MEacuteTODO

    Para que essa anaacutelise seja possiacutevel foi desenvolvido um programa que permite a criaccedilatildeoe configuraccedilatildeo de diferentes cenaacuterios onde os sistemas eleitorais seratildeo simulados Nele eacutepossiacutevel definir o nuacutemero total de eleitores e candidatos como esses eleitores iratildeo votar eo niacutevel de popularidade de cada candidato Aleacutem disso eacute possiacutevel formar coalizotildees entreos candidatos e escolher a porcentagem dos eleitores que optaratildeo pelo voto uacutetil Dessamaneira seraacute possiacutevel elaborar cenaacuterios que buscam expor os pontos fortes e fracos decada sistema

    13 ESTRUTURA

    Este trabalho eacute relatado ao longo de seis capiacutetulos No Capiacutetulo 2 seratildeo apresentados ossistemas eleitorais implementados no simulador suas vantagens e desvantagens conhecidase outras caracteriacutesticas especiacuteficas de cada um A intenccedilatildeo do capiacutetulo eacute tornar o textomais autocontido trazendo conceitos jaacute estudados que ajudaratildeo na melhor compreensatildeodos capiacutetulos seguintes por isso grande parte de sua composiccedilatildeo eacute oriunda de diferentesfontes consultadas

    O Capiacutetulo 3 eacute uma apresentaccedilatildeo das funcionalidades que o simulador possui Seratildeoexplicados todos os campos de entrada e os dois modos distintos nos quais o programaopera

    16

    No Capiacutetulo 4 os sistemas seratildeo colocados em teste Todos seratildeo simulados em cenaacuteriosespeciacuteficos a fim de fazer sobressair aqueles com as maiores taxas de satisfaccedilatildeo meacutedia

    A estrutura e implementaccedilatildeo do simulador seratildeo abordadas em detalhes no Capiacutetulo5 assim como uma breve descriccedilatildeo da stack utilizada Todos os meacutetodos relevantes aofuncionamento das simulaccedilotildees seratildeo explicados passo a passo

    No Capiacutetulo 6 seratildeo apresentadas as conclusotildees referentes agrave anaacutelise dos resultadosobtidos no Capiacutetulo 4 e as consideraccedilotildees finais do projeto como um todo

    17

    2 SISTEMAS ELEITORAIS

    Atualmente mais e mais paiacuteses estatildeo adotando sistemas democraacuteticos de governoCerca de 6 em 10 governos no mundo satildeo democracias (Pew Research Center 2017) o quepode ser observado na Figura 1 abaixo Em um sistema democraacutetico a populaccedilatildeo escolheseus liacutederes atraveacutes de seu sistema eleitoral Existem diversos sistemas eleitorais em usono mundo muitos dos quais satildeo usados em conjunto para eleger um uacutenico candidato Emvaacuterios paiacuteses mais de um sistema eleitoral pode ser utilizado tambeacutem em diferentes niacuteveisde governo tanto presidencial quanto estadual ou municipal Natildeo apenas imersos nomeio poliacutetico eles tambeacutem podem ser usados em escopos menores como em esportes oucompeticcedilotildees artiacutesticas poreacutem sempre com a finalidade de alocar um ou mais indiviacuteduosa determinado cargo ou tiacutetulo

    Figura 1 ndash de paiacuteses de cada tipo de regime 1946-2016

    Fonte Center of Systemic Peacersquos Polity IV Project

    Os proacuteximos trecircs toacutepicos discutidos neste capiacutetulo referentes aos meacutetodos First Pastthe Post Two-Round System e Instant Runoff Voting possuem seus conceitos e infor-maccedilotildees relevantes com exceccedilatildeo dos exemplos traduzidos livremente do livro Behind theBallot Box A Citizenrsquos Guide to Voting Systems (AMY 2000)

    21 FISRT PAST THE POST

    O meacutetodo First Past the Post tambeacutem conhecido como Plurality Voting ou WinnerTakes All eacute o meacutetodo mais simples e direto e provavelmente o primeiro meacutetodo que sepensa quando se fala de eleiccedilotildees Os eleitores escolhem apenas um candidato e apoacutes a

    18

    contagem dos votos o candidato com o maior nuacutemero de votos eacute eleito O vencedor natildeonecessita da aprovaccedilatildeo de mais de 50 dos eleitores ele apenas precisa de uma pluralidadedos votos ou seja apenas possuir mais votos que os outros candidatos

    Esse sistema eacute utilizado em escala nos Estados Unidos para a maior parte das eleiccedilotildeesvoltadas a eleger apenas um candidato como prefeitos e governadores aleacutem de ser usadana disputa presidencial Dentre outros paiacuteses que empregam o sistema em suas corridaspresidenciais estatildeo listados o Meacutexico as Filipinas a Coreia do Sul e a Venezuela

    211 Exemplo

    Tabela 1 ndash Exemplo FPTP

    Candidatos VotosA 36B 25C 22D 17

    Neste exemplo o candidato A possui uma pluralidade dos votos com 36 e ele eacute ocandidato eleito mesmo natildeo tendo uma maioria

    212 Vantagens e Desvantagens do FPTP

    A vantagem do FPTP eacute a sua simplicidade Natildeo eacute difiacutecil para um eleitor comumcompreender o seu funcionamento eles apenas precisam se decidir por um candidato Eletambeacutem eacute muito simples e direto na sua contagem e seleccedilatildeo do vencedor

    Esse meacutetodo tambeacutem tende a criar listas de candidatos concorrentes mais curtasCandidatos independentes ou de partidos menores frequentemente acabam se sentindodesencorajados a concorrer devido agraves suas baixas chances de vitoacuteria Isso normalmentefornece aos eleitores uma faacutecil decisatildeo entre um ou dois candidatos dos maiores partidosao mesmo tempo poreacutem limitando suas opccedilotildees

    No entanto sua essecircncia eacute sua principal desvantagem a pluralidade O fato do can-didato eleito natildeo necessitar de uma maioridade dos votos da populaccedilatildeo parece violaros princiacutepios baacutesicos da democracia Democracia eacute em sua origem o poder(kratos) nopovo(demos) poreacutem na pluralidade o poder de eleger um candidato pode residir emapenas uma fraccedilatildeo relativamente pequena do povo Em um cenaacuterio hipoteacutetico comapenas trecircs candidatos um deles apenas poderia necessitar de natildeo mais do que 34 dosvotos para ser eleito o que significa que no pior dos casos 66 da populaccedilatildeo rejeitao candidato eleito O cenaacuterio soacute piora com mais e mais candidatos concorrendo Paraquatro candidatos satildeo necessaacuterios 26 dos votos no pior dos casos para cinco satildeo 21 eassim por diante

    19

    213 Voto Uacutetil no FPTP

    No FPTP tambeacutem existe a possibilidade de os eleitores evitarem votar em sua prefe-recircncia verdadeira No caso de sua preferecircncia natildeo aparentar ter boas chances de vitoacuteriamuitas vezes opta-se por uma segunda opccedilatildeo que esteja mais bem colocada nas eleiccedilotildeesO motivo disso eacute que nessas situaccedilotildees votar em sua preferecircncia pode parecer um des-perdiacutecio do seu voto e no pior dos cenaacuterios optar por natildeo transferir seu voto para umasegunda opccedilatildeo pode acabar resultando na eleiccedilatildeo de um candidato de seu desgosto As-sim votar de maneira verdadeira muitas vezes pode acabar prejudicando o eleitor que sevecirc forccedilado a abandonar seus interesses poliacuteticos mais imediatos e escolher o menor entredois(ou mais) males Os candidatos de partidos menores satildeo os que mais sofrem com essetipo de voto estrateacutegico por natildeo conseguirem agregar as maiores quantidades de votos

    Entretanto ao mesmo tempo que partidos maiores roubam votos de partidos meno-res com os votos taacuteticos partidos menores tambeacutem tem a oportunidade de ganhar algunsvotos com o denominado spoiler effect Ao entrarem na eleiccedilatildeo candidatos de partidosmenores podem adquirir votos de candidatos mais populares que possuem inclinaccedilatildeo po-liacutetica semelhante Logo eacute possiacutevel que haja certo equiliacutebrio ao se contrapor as mudanccedilasde voto devido aos votos uacuteteis agraves mudanccedilas oriundas do spoiler effect

    Poreacutem o spoiler effect natildeo necessariamente ocorre apenas entre partidos maiores emenores mas pode prejudicar candidatos de popularidades proacuteximas Por exemplo entretrecircs candidatos A B e C onde A representa determinada posiccedilatildeo no espectro poliacuteticoenquanto B e C possuem posiccedilotildees parecidas o que pode acontecer eacute B e C se prejudicaremmutuamente jaacute que ambos dividem os eleitores de um mesmo espectro poliacutetico Se esseespectro tem a maioria com 60 por exemplo com B e C compartilhando cada um 30dos votos o candidato A sairia vencedor com 40 mesmo que todos os eleitores de Bprefiram C e todos os eleitores de C prefiram B Esse exemplo demonstra claramente oproblema com os sistemas de pluralidade

    22 TWO-ROUND SYSTEM

    Uma das primeiras tentativas de lidar com a desvantagem dos sistemas por pluralidadeo Two-round System eacute usado desde o seacuteculo XIX no ocidente e atualmente ainda eacute utilizadoem corridas presidecircncias de paiacuteses como o Brasil Bulgaacuteria Chile Colocircmbia FinlacircndiaPolocircnia Portugal Ruacutessia e em inuacutemeras eleiccedilotildees locais nos Estados Unidos

    O principal objetivo do TRS eacute garantir que o vencedor tenha conseguido uma maioriados votos Para isso as eleiccedilotildees satildeo estruturadas em duas rodadas de votaccedilatildeo Na primeirarodada os eleitores se dirigem agraves urnas e votam no candidato de sua preferecircncia Apoacutesa contagem se a quantidade de votos do candidato mais votado superar a proporccedilatildeo de50 natildeo haacute a necessidade de uma segunda rodada e este candidato eacute eleito No entantose este natildeo for o caso haveraacute uma segunda rodada com apenas os dois candidatos mais

    20

    votados Nesta rodada os eleitores retornam as urnas para escolher uma das duas opccedilotildeessendo eleito o candidato mais votado agora definitivamente com uma maioria dos votos

    221 Exemplo

    Utilizando a mesma distribuiccedilatildeo de votos descrita na tabela 1 Neste caso como ocandidato A natildeo possui uma maioria dos votos ele e o candidato B iratildeo concorrer em umsegundo turno Digamos que as distribuiccedilotildees dos votos dos eleitores dos candidatos C eD em relaccedilatildeo aos candidatos A e B satildeo as seguintes

    Tabela 2 ndash 2deg turno do TRS

    Candidatos Votos dos eleitoresde C

    Votos dos eleitoresde D

    Votos do 1degturno

    A 7 5 36B 15 12 25

    O candidato B agora eacute eleito com uma maioria dos votos 52 contra 48 do candidatoA

    222 Vantagens e Desvantagens do TRS

    Por ser parecido com o FPTP esse sistema tambeacutem eacute de faacutecil compreensatildeo do eleitorcomum poreacutem a maior vantagem do TRS eacute a garantia de que o candidato vencedor teraacute oapoio da maioria dos eleitores no segundo turno eliminando a pluralidade Argumenta-seque isso daacute maior legitimidade poliacutetica ao mandato do candidato eleito

    O TRS tende a abrigar uma lista maior de candidatos sendo mais convidativo acandidatos de partidos menores mesmo que suas chances natildeo sejam maiores quandocomparadas agraves eleiccedilotildees sob o FPTP Mesmo assim essa listagem mais abrangente eacute umavantagem do sistema pois daacute aos eleitores uma variedade maior de opccedilotildees de voto

    Em relaccedilatildeo agraves suas desvantagens o TRS possui duas principais A primeira satildeo oscustos elevados do sistema decorrentes da necessidade da organizaccedilatildeo de um segundoturno de votaccedilotildees A segunda eacute o aumento no iacutendice de ausecircncias dos eleitores agraves urnasEssa ampliaccedilatildeo no natildeo comparecimento dos eleitores se daacute tambeacutem devido ao segundoturno por pura fatiga eleitoral bem como consequecircncia da desistecircncia de eleitores queapoiam candidatos que jaacute foram eliminados

    Outro ponto negativo do TRS eacute a sua natildeo-monotonicidade Isso significa que umcandidato pode ser prejudicado com um aumento em sua popularidade e suporte e domesmo modo um candidato pode se beneficiar com a perda de popularidade e suporteSe os candidatos A e B satildeo os esperados para ir ao segundo turno onde A eacute mais fortedo que B um aumento no suporte pelo candidato A pode resultar na sua derrota quandoesse aumento causa uma alteraccedilatildeo nos candidatos que satildeo selecionados para ir ao segundoturno Se esse aumento na popularidade de A resultar na eliminaccedilatildeo preacutevia de B um

    21

    terceiro candidato C pode ser vitorioso sobre A no segundo turno caso os eleitores de Bprefiram C ao candidato A Se natildeo houvesse esse crescimento de popularidade A teriaderrotado B no segundo turno Essa situaccedilatildeo seraacute vista em melhores detalhes na seccedilatildeo 43

    223 Voto Uacutetil no TRS

    Esse sistema minimiza os efeitos do voto uacutetil em relaccedilatildeo ao FPTP pois um eleitorqualquer pode tranquilamente votar em sua preferecircncia sem se preocupar em desperdiccedilaacute-lo mesmo que seu candidato natildeo tenha chances de vitoacuteria Se este natildeo for eleito aindapoderaacute escolher a sua preferecircncia dentre os dois candidatos que prosseguirem para osegundo turno

    Apesar disso ainda existe um cenaacuterio em que o eleitor pode ser tentado a natildeo votar emsua preferecircncia Eacute possiacutevel que ele opte pela sua segunda opccedilatildeo se souber que sua primeiraopccedilatildeo possui miacutenimas chances de ir ao segundo turno ou ateacute mesmo por saber que issodiminuiraacute as chances de algum outro candidato ser eleito Mesmo assim eacute evidente queo TRS natildeo proporciona o mesmo apelo ao voto taacutetico que o FPTP

    Outra caracteriacutestica do TRS eacute o incentivo a formaccedilatildeo de coalizotildees entre candidatosde partidos mais populares com candidatos de partidos menos populares As coalizotildeesfornecem benefiacutecios agrave ambas as partes onde os candidatos classificados para o segundoturno em geral se juntam a candidatos jaacute eliminados com a intenccedilatildeo de agregar maisvotos enquanto os candidatos jaacute eliminados apoiam um dos dois classificados na esperanccedilade inserir propostas proacuteprias ou modificaccedilotildees agrave chapa deles

    23 INSTANT-RUNOFF VOTING

    Instant Runoff Voting foi uma alternativa aos meacutetodos FPTP e TRS desenvolvidanos anos 70 por um professor do Instituto de Tecnologia de Massachusetts(MIT) O IRVelimina as principais desvantagens desses outros dois sistemas a pluralidade do FPTP e anecessidade de mais de uma rodada de votaccedilatildeo do TRS Este meacutetodo tambeacutem opera emmais de uma rodada poreacutem como o proacuteprio nome sugere essas rodadas satildeo instantacircneasnatildeo sendo necessaacuterio o retorno dos eleitores agraves urnas Atualmente ele eacute utilizado naIrlanda nas eleiccedilotildees presidenciais em Londres na eleiccedilatildeo de seu prefeito e em distritosindividuais na Austraacutelia para eleger membros de sua cacircmara baixa do parlamento OIRV tambeacutem eacute usado por vaacuterias organizaccedilotildees privadas nos Estados Unidos incluindoa American Political Science Association e a American Psychological Association paraeleger seus funcionaacuterios

    Nesse sistema os eleitores natildeo satildeo solicitados a votar em um uacutenico candidato aoinveacutes disso eles listam todos os candidatos concorrentes na ordem de sua preferecircnciaA partir dessas listas as primeiras opccedilotildees de cada eleitor recebem o seu voto e apoacutes acontagem se um candidato obtiver 50 dos votos mais um este candidato eacute eleito Se

    22

    isso natildeo ocorrer o candidato menos votado eacute eliminado das eleiccedilotildees e seus votos satildeotransferidos para a segunda opccedilatildeo de cada um de seus eleitores Esse procedimento serepete eliminando o candidato menos votado a cada rodada ateacute que algum dos candidatospossuam a maioridade dos votos

    231 Exemplo

    Na tabela 3 pode-se verificar a distribuiccedilatildeo de votos por perfil de eleitor e na tabela4 vecirc-se o desenvolvimento do IRV para essas distribuiccedilotildees O candidato D eacute o menosvotado e por consequecircncia eacute o primeiro a ser eliminado A segunda opccedilatildeo de todos oseleitores que votaram no candidato D eacute o candidato C por isso este recebe todos os votosdistribuiacutedos na segunda rodada Com isso o candidato B eacute eliminado com 25 dos votos eos candidatos A e C concorrem na uacuteltima rodada Mesmo com o candidato C na lideranccedilana segunda rodada a maior parte dos eleitores do B tem como preferecircncia o candidatoA por isso A eacute eleito com 55 dos votos contra 45 do C

    Tabela 3 ndash Exemplo IRV

    Rankings Ndeg de eleitoresABCD 20ABDC 16BDAC 19BDCA 6CABD 7CDBA 15DCAB 5DCBA 12

    Tabela 4 ndash Desenvolvimento do IRVTurnos D C B A

    1 17 22 25 362 eliminado 39 25 363 eliminado 45 eliminado 55

    232 Vantagens e Desvantagens do IRV

    Assim como no TRS a pluralidade eacute irrelevante no IRV e um candidato soacute eacute eleitocom a maioridade dos votos dando maior legitimidade ao mandato deste No entantopode-se argumentar que o IRV faz isso com mais eficiecircncia pois natildeo requer a execuccedilatildeode mais de uma rodada de votaccedilotildees Isso diminui os custos das eleiccedilotildees como um todoao mesmo tempo que proporciona um nuacutemero menor de isenccedilotildees por parte dos eleitoresdevido ao desgaste de todo o processo eleitoral

    23

    Aleacutem disso candidatos de partidos menores tendem a receber mais votos do queno FPTP e portanto satildeo mais encorajados a se candidatar Com uma lista maior decandidatos eleitores desfrutam de uma variedade maior de opccedilotildees de voto Contudomesmo com mais candidatos menos populares o spoiler effect mencionado anteriormentetambeacutem natildeo possui espaccedilo nesse sistema de votaccedilatildeo Partidos menores natildeo tem comoroubar votos de partidos maiores visto que esses votos eventualmente seratildeo transferidosde volta a eles durante o desenvolvimento das rodadas do IRV

    Em virtude de sua estrutura acredita-se que esse meacutetodo tende a encorajar os can-didatos tambeacutem a elaborar suas campanhas de forma mais abrangente ampliando suainfluecircncia para mais do que apenas um grupo especiacutefico de maneira que ele consiga agre-gar votos de segunda ou terceira opccedilatildeo aleacutem dos votos de seus eleitores principais

    A principal desvantagem do IRV eacute o fato de ele ainda natildeo ser amplamente utilizado aoredor do mundo Essa falta de familiaridade do sistema pode causar confusatildeo ao eleitorcomum em suas primeiras ocorrecircncias No entanto nos paiacuteses em que este eacute utilizadonatildeo parece haver confusatildeo entre os eleitores Aleacutem disso na maioria dos casos haveraacute umcusto potencialmente alto da substituiccedilatildeo ou alteraccedilatildeo dos sistemas das urnas eletrocircnicaspara que seja possiacutevel haver a implementaccedilatildeo do meacutetodo

    Aleacutem disso assim como o TRS este sistema tambeacutem possui natildeo-monotonicidade ouseja um candidato pode ser prejudicado ao ser ranqueado mais alto enquanto que outropode se beneficiar sendo ranqueado mais baixo pelos eleitores (ORNSTEIN 2018) issopode ocorrer quando esse ranqueamento causa alteraccedilotildees na ordem em que os candidatossatildeo eliminados Essa caracteriacutestica se manifesta em fenocircmenos complexos e especiacuteficos epor isso um exemplo de sua ocorrecircncia seraacute abordada em detalhes na seccedilatildeo 43

    233 Voto Uacutetil no IRV

    Como os sistemas de votaccedilatildeo anteriores o IRV natildeo eacute completamente imune ao vototaacutetico No entanto este meacutetodo se mostra bem resistente a eles quando comparado aoutros meacutetodos como o FPTP e o Borda Count (Bartholdi John J III and Orlin JamesB 1990) Distintivamente o IRV requer um maior esforccedilo do eleitor para elaborar umaestrateacutegia que melhor ajuste os resultados da eleiccedilatildeo de acordo com a sua preferecircnciaAleacutem disso eacute necessaacuterio que ele tenha informaccedilatildeo suficiente sobre os rankings de outroseleitores naturalmente obtida atraveacutes de pesquisas eleitorais

    Existe tambeacutem a possibilidade de ocorrer uma exaustatildeo dos votos quando natildeo haacuteo completo preenchimento do ranking por parte dos eleitores Nessas ocasiotildees o votonatildeo pode continuar a ser transferido a outros candidatos e ele eacute descartado Isso afetaa legitimidade do mandato do candidato eleito pois o resultado final natildeo representaraacute100 da populaccedilatildeo votante Essas ocorrecircncias no entanto podem ser minimizadas comuma melhor educaccedilatildeo eleitoral ou como foi implementado na Austraacutelia requerer que osrankings incluam uma totalidade dos candidatos concorrentes

    24

    24 APPROVAL VOTING SYSTEM

    No meacutetodo Approval Voting os eleitores natildeo satildeo limitados pelo nuacutemero de candidatosem que podem votar por isso approval cada eleitor pode votar em todos os candidatos osquais ele aprova Apoacutes as votaccedilotildees o candidato com a maior quantidade de votos eacute eleitoSegundo Hamlin (2015) a cidade de Fargo na Dakota do Norte se tornou a primeiracidade nos EUA a colocar em praacutetica este sistema em suas eleiccedilotildees gerais em novembrode 2018 AVS tambeacutem eacute utilizado para eleger o secretaacuterio-geral das Naccedilotildees Unidas e emdiversas outras organizaccedilotildees

    241 Exemplo

    Na tabela 5 abaixo pode-se encontrar 8 perfis de eleitores com seus candidatos apro-vados e quantidade de eleitores que se encaixam no perfil Na tabela 6 temos o resultadoda contabilizaccedilatildeo dos votos destes perfis O candidato mais popular eacute o B que se encontraaprovado em 5 perfis distintos totalizando 60 votos ou aproximadamente 32

    Tabela 5 ndash Exemplo AVS

    Aprovaccedilotildees Ndeg de eleitoresA 20AB 16B 19

    BDC 6CAB 7CD 15DC 5DCB 12

    Tabela 6 ndash Resultado AVSCandidatos Total de votos

    A 43B 60C 45D 38

    242 Vantagens e Desvantagens do AVS

    Aleacutem de simples este meacutetodo permite um niacutevel maior de expressividade aos eleitoresOnde no FPTP e TRS eles satildeo limitados pelo seu uacutenico voto aqui os eleitores tecircm aliberdade de demonstrar exatamente quais candidatos consideram aptos ou aceitaacuteveis aocargo

    25

    Outro efeito dessa liberdade trazida pelo AVS eacute a dizimaccedilatildeo do spoiler effect Can-didatos de partidos menores natildeo tem como roubar votos de partidos maiores nessesistema ambos os candidatos contabilizariam o voto

    243 Voto Uacutetil no AVS

    O tipo de voto uacutetil no AVS eacute denominado bullet voting Segundo The Center forElection Science (2015) esta taacutetica envolve simplesmente ignorar a possibilidade de votarem mais de um candidato e votar apenas em sua primeira opccedilatildeo Um eleitor pode serlevado a adotar essa estrateacutegia quando percebe que sua preferecircncia pode ser prejudicadacom o voto em alguma segunda opccedilatildeo sua Em um cenaacuterio extremo onde 100 doseleitores adotam esta estrateacutegia as eleiccedilotildees satildeo convertidas a um simples First Past ThePost

    25 THE BORDA COUNT

    Este meacutetodo carrega o nome em homenagem a seu criador Jean-Charles de Bordaque o desenvolveu em 1770 (LIPPMAN 2012) A contagem de Borda utiliza a abordagemde ranqueamento dos candidatos poreacutem de maneira diferente ao IRV Este eacute um sistemaque atribui uma pontuaccedilatildeo aos candidatos com base nestes rankings O candidato na basedo ranking natildeo recebe pontos o candidato imediatamente acima deste recebe 1 pontoo proacuteximo recebe 2 pontos e assim por diante ateacute o topo do ranking As pontuaccedilotildees detodos os rankings satildeo contabilizadas e o candidato com maior pontuaccedilatildeo eacute eleito Deacordo com Lippman variaccedilotildees deste meacutetodo satildeo encontradas em uso na premiaccedilatildeo dediversos esportes como na seleccedilatildeo do MVP(Most Valuable Player) da MLB(principal ligade beisebol dos EUA) e no Trofeacuteu Heisman de futebol americano universitaacuterio

    251 Exemplo

    Neste exemplo seratildeo aproveitados os mesmos rankings apresentados na tabela 3 Porserem 4 candidatos o primeiro colocado de cada ranking receberaacute 3 pontos o segundo 2pontos o terceiro 1 e o quarto 0 Assim o nuacutemero maacuteximo de pontos que um candidatopode atingir eacute igual a 300(se ficar na primeira posiccedilatildeo em todos os rankings) e o nuacutemerototal de pontos no sistema eacute 600 O nuacutemero maacuteximo de pontos que um candidato podeatingir eacute calculado com

    (cminus 1)times e

    Sendo c igual ao nuacutemero de candidatos e e o nuacutemero de eleitores Por sua vez onuacutemero total de pontos no sistema eacute

    26

    (cminus 1)times c2

    times e

    A contagem final dos pontos eacute apresentada na tabela 7 abaixo

    Tabela 7 ndash Resultado BCCandidatos Total de pontos

    A 146B 181C 126D 147

    O candidato eleito eacute o B com 181 pontos ou aproximadamente 60 da pontuaccedilatildeomaacutexima

    252 Vantagens e Desvantagens do BC

    Em comparaccedilatildeo com os meacutetodos abordados anteriormente que apenas consideramas primeiras opccedilotildees de cada eleitor este meacutetodo regularmente escolhe candidatos comaceitaccedilatildeo mais ampla ao inveacutes de uma preferecircncia direta dos eleitores (Electoral ReformSociety 2017b)

    Ele tambeacutem encoraja uma abordagem estrateacutegica por parte dos partidos onde seriade seu interesse nomear mais de um candidato para concorrer pois quanto mais candi-datos estatildeo no paacutereo maior eacute a pontuaccedilatildeo dos primeiros colocados Logo a nomeaccedilatildeo decandidatos menos populares pode beneficiar os principais candidatos de um partido

    253 Voto Uacutetil no BC

    Existem duas estrateacutegias aplicaacuteveis a esse sistema A primeira denominada compromi-sing de maneira similar a outros meacutetodos de votaccedilatildeo se resume em ranquear em primeirolugar um dos candidatos que estejam liderando as eleiccedilotildees mesmo que este natildeo seja suapreferecircncia real A segunda estrateacutegia burying eacute o oposto esta se baseia em ranquearem uacuteltimo lugar um dos candidatos liacutederes mesmo que este natildeo seja o seu candidato demaior desgosto Ambas estrateacutegias podem ser aplicadas ao mesmo tempo por um eleitor

    26 SCORE VOTING SYSTEM

    Score Voting ou Range Voting como tambeacutem eacute conhecido eacute mais um meacutetodo quetenta trazer maior liberdade de expressatildeo aos eleitores Assim como o Borda Counteste sistema funciona baseado na pontuaccedilatildeo dos candidatos no entanto ao inveacutes dessapontuaccedilatildeo ser relativa agrave posiccedilatildeo do candidato no ranking de cada eleitor este por sua veztem completa liberdade de atribuir qualquer quantidade de pontos aos candidatos dentro

    27

    de determinada escala Um eleitor pode dar o mesmo nuacutemero de pontos para diferentescandidatos e apoacutes o somatoacuterio de todas as pontuaccedilotildees o candidato com a pontuaccedilatildeo maisalta eacute eleito Incorporado ao escopo poliacutetico o SVS eacute utilizado no Partido Pirata Alematildeobem como em diversas organizaccedilotildees tais como o Fedora Project e Mozilla e tambeacutem emvariados esportes oliacutempicos e reality shows como o American Idol aponta Hamlin (2015)

    261 Exemplo

    Neste exemplo temos apresentados na tabela 8 abaixo 4 perfis distintos de eleitorese suas respectivas atribuiccedilotildees de pontos aos 4 candidatos Cada eleitor pode atribuirqualquer pontuaccedilatildeo a um candidato dentro da escala de -10 a 10 O resultado da eleiccedilatildeoapoacutes a soma de todos os pontos por candidato se encontra na tabela 9 onde o candidatoA eacute eleito com um total de 605 pontos

    Tabela 8 ndash Exemplo SVS

    Perfil A B C D Ndeg de eleitores1 10 -1 5 2 362 6 9 -3 4 253 2 0 8 4 224 3 3 3 10 17

    Tabela 9 ndash Resultado SVSCandidatos Total de pontos

    A 605B 240C 332D 430

    262 Vantagens e Desvantagens do SVS

    A grande vantagem do SVS eacute como ele proporciona aos eleitores expressar de maneiramuito proacutexima potencialmente exata suas impressotildees poliacuteticas de cada candidato Eleeacute ainda mais expressivo que o AVS Dessa maneira o spoiler effect tambeacutem se torna nuloao passo que toda intenccedilatildeo de voto eacute precisamente representada neste sistema

    Assim como outros meacutetodos eleitorais este sofre igualmente dos males produzidos pelovoto taacutetico Sua principal desvantagem eacute discutida na seccedilatildeo abaixo

    263 Voto Uacutetil no SVS

    Da mesma maneira que no Approval Voting atraveacutes do bullet voting o SVS tambeacutempode ser convertido em uma eleiccedilatildeo sob o meacutetodo FPTP em um cenaacuterio com um grande

    28

    volume de eleitores maliciosos O voto uacutetil sob este sistema se manifesta pontuando-seapenas um candidato com uma nota positiva e todos os outros com as notas mais baixasda escala Se todos os eleitores se aproveitarem dessa abordagem natildeo existiraacute distinccedilatildeoefetiva entre uma eleiccedilatildeo sob SVS e FPTP Essencialmente cada eleitor estaacute votando emapenas um candidato Essa eacute a principal desvantagem do SVS e ela consegue eliminarsua principal vantagem dar ao eleitor um poder maior de expressatildeo

    27 BLOC VOTE

    O Bloc Vote eacute um meacutetodo utilizado para a eleiccedilatildeo de candidatos a cargos no governocom mais de uma vacacircncia Pode ser considerado um meio-termo entre o FPTP e oAVS pois os eleitores podem votar em mais de um candidato poreacutem satildeo limitados pelonuacutemero de vagas Em uma eleiccedilatildeo com duas vagas por exemplo cada eleitor selecionaraacutedois candidatos ou menos Sensatamente o candidato mais votado eacute eleito Ele possuialgumas utilizaccedilotildees em eleiccedilotildees locais em algumas partes da Inglaterra (Electoral ReformSociety 2017a)

    271 Exemplo

    Neste exemplo dois candidatos seratildeo eleitos logo cada eleitor votaraacute em no maacuteximodois candidatos A distribuiccedilatildeo de votos pode ser conferida na tabela 10 e o resultado dacontagem de votos na tabela 11 abaixo Os candidatos eleitos satildeo o C totalizando 78do maacuteximo de votos possiacuteveis para um candidato e o A com 43

    Tabela 10 ndash Exemplo BV

    Aprovaccedilotildees Ndeg de eleitoresAC 20AB 16BC 19BD 6CA 7CD 15DC 17

    Tabela 11 ndash Resultado BVCandidatos Total de votos

    A 43B 41C 78D 38

    29

    272 Voto Uacutetil no BV

    Neste sistema eacute possiacutevel que um eleitor evite votar em sua primeira opccedilatildeo quandoeste natildeo tem chances de vitoacuteria e se fazendo isto ele diminuiraacute as chances de algum outrocandidato de seu desgosto ganhar Poreacutem o sistema previne um outro tipo de voto uacutetilEm eleiccedilotildees com mais de uma vaga onde os eleitores soacute podem votar em um candidatose um eleitor sabe que sua primeira opccedilatildeo tambeacutem eacute a primeira opccedilatildeo da maior parteda populaccedilatildeo e portanto muito provavelmente seraacute um dos candidatos eleitos eacute possiacutevelque ele arrisque votar em uma segunda opccedilatildeo sua na esperanccedila de a longo prazo elegersuas duas principais opccedilotildees de voto Com os eleitores podendo votar no nuacutemero exato devagas disponiacuteveis esse tipo de pensamento taacutetico perde o sentido

    30

    3 O SIMULADOR

    Para este trabalho foi implementado um simulador eleitoral na forma de uma aplicaccedilatildeoweb para que a interaccedilatildeo do usuaacuterio fosse facilitada Veremos a seguir como se daacute suautilizaccedilatildeo de forma geral

    Figura 2 ndash Captura de tela 1

    Figura 3 ndash Captura de tela 2

    A primeira opccedilatildeo encontrada pelo usuaacuterio eacute a escolha de quais sistemas de votaccedilatildeo se-ratildeo simulados (Figura 2) Todos eles podem ser selecionados para rodar simultaneamentePoreacutem natildeo eacute permitido rodar uma simulaccedilatildeo do Bloc Vote para uma eleiccedilatildeo onde apenasum candidato eacute eleito aleacutem disso natildeo existe implementaccedilatildeo dos meacutetodos TRS e IRV para

    31

    eleiccedilotildees com mais de um candidato eleito jaacute que eles se comportariam exatamente comono FPTP

    A maioria das linguagens de programaccedilatildeo senatildeo todas possuem um gerador de nuacuteme-ros pseudoaleatoacuterios que fornece a possibilidade de definir uma seed para o gerador Estaseed funciona como um ponto de partida para a geraccedilatildeo dos nuacutemero e portanto todasimulaccedilatildeo que rodar com a mesma seed sempre teraacute os mesmos resultados Se nenhumvalor for fornecido pelo usuaacuterio o tempo atual do sistema eacute utilizado As opccedilotildees subse-quentes satildeo a escolha do nuacutemero de eleitores gerados e o nuacutemero de vagas (Figura 3) Senenhum valor for fornecido o nuacutemero de eleitores padratildeo utilizado eacute 1000 e o nuacutemero devagas igual a 1

    Figura 4 ndash Captura de tela 3

    Este simulador possui dois modos para a criaccedilatildeo dos rankings dos eleitores No modoManipulate (Figura 4) primeiramente se define o nuacutemero de candidatos atraveacutes do campode entrada ao lado do tiacutetulo Candidates ou alternativamente pode-se adicionar candida-tos um a um atraveacutes do sinal de mais na parte inferior da paacutegina Para cada candidatoeacute possiacutevel definir a porcentagem de seus eleitores que optaraacute pelo voto taacutetico e pelovoto de minoria Tambeacutem eacute possiacutevel alterar o nome dos candidatos se for do interessedo usuaacuterio

    32

    Figura 5 ndash Captura de tela 4

    Figura 6 ndash Captura de tela 5

    33

    Figura 7 ndash Captura de tela 6

    Apoacutes a criaccedilatildeo dos candidatos o usuaacuterio pode criar perfis de eleitores que definiratildeo demaneira exata como partes da populaccedilatildeo iraacute votar (Figura 5) Em cada perfil se defineo valor em porcentos da populaccedilatildeo votante que o adotaraacute e a nota de cada candidatoTambeacutem eacute possiacutevel nomear cada perfil livremente

    No modo Generate (Figura 6) eacute onde o gerador de nuacutemeros pseudoaleatoacuterios eacute usadoNesse modo ao inveacutes do usuaacuterio criar perfis de eleitores ele define qual seraacute a distribuiccedilatildeoadotada para a geraccedilatildeo de notas de cada candidato Essas distribuiccedilotildees seratildeo mais bemdetalhadas no Capiacutetulo 5 Da mesma maneira que no modo Manipulate nesse modotambeacutem eacute possiacutevel definir os valores para os dois tipos de voto uacutetil os votos taacuteticos eos votos de minoria No primeiro estatildeo incluiacutedas as estrateacutegias de mudanccedila de votoespeciacuteficas de cada sistema como o bullet voting no AVS e SVS ou quando a preferecircnciade um eleitor claramente natildeo possui chances de vitoacuteria e ele muda seu voto para um doscandidatos que esteja na lideranccedila o que ocorre no FPTP e TRS O voto de minoriase apresenta apenas no FPTP em eleiccedilotildees onde mais de um candidato eacute eleito Se apreferecircncia de um eleitor claramente lidera a eleiccedilatildeo por ser tambeacutem a preferecircncia damaior parte da populaccedilatildeo esse eleitor pode mudar o seu voto para uma segunda opccedilatildeona esperanccedila de eleger dois de seus candidatos favoritos

    Por fim em ambos os modos o usuaacuterio tem a opccedilatildeo de definir coalizotildees entre oscandidatos se o sistema TRS estiver habilitado pois as coalizotildees apenas se manifestamnesse sistema Essas coalizotildees alteraratildeo as notas dos candidatos dependendo dos outroscandidatos pertencentes a elas (Figura 7)

    A aplicaccedilatildeo pode ser encontrada na paacutegina httpelectionsimpythonanywherecom

    34

    4 CENAacuteRIOS PERTINENTES

    Para todos os cenaacuterios deste capiacutetulo seraacute usada a seed do simulador igual a 100 e apopulaccedilatildeo de eleitores igual a 1000 para que exista consistecircncia na anaacutelise e tambeacutem paraque possa haver replicaccedilatildeo dos resultados se necessaacuterio

    41 CENAacuteRIO 1 VOTO TAacuteTICO

    Neste exemplo teremos quatro candidatos Ana Beto Carla e Diego Ana e Betoseratildeo gerados a partir da distribuiccedilatildeo Neutral (Figura 47) Carla da distribuiccedilatildeo Disliked(Figura 51) e Diego da Hated (Figura 55) Para a simulaccedilatildeo com a seed 100 o melhorcandidato a ser eleito ou seja aquele que maximiza a meacutedia das notas dos eleitores eacute oBeto com uma meacutedia de 0073 Para cada sistema seratildeo comparados os resultados semvoto taacutetico aos com 20 de voto taacutetico a favor da Ana Abaixo se encontram osresultados para o sistema FPTP

    Figura 8 ndash FPTP - Cenaacuterio 1 sem voto taacutetico

    Figura 9 ndash TRS segundo turno - Cenaacuterio 1 sem voto taacutetico

    35

    Figura 10 ndash IRV primeiro turno - Cenaacuterio 1

    Figura 11 ndash IRV segundo turno - Cenaacuterio 1

    Figura 12 ndash IRV terceiro turno - Cenaacuterio 1

    36

    Figura 13 ndash AVS - Cenaacuterio 1 sem voto taacutetico

    Figura 14 ndash BC - Cenaacuterio 1 sem voto taacutetico

    Figura 15 ndash SVS - Cenaacuterio 1 sem voto taacutetico

    37

    Nesse cenaacuterio sem voto taacutetico o uacutenico sistema que natildeo elege o Beto eacute o AVS Todosos outros elegem o melhor candidato Ou seja apesar de Beto ter uma melhor meacutediadas notas dos eleitores existem mais eleitores que ranqueiam Ana com uma nota acimade 0 No entanto apenas 20 dos eleitores de Diego e Carla que preferem a Ana aoinveacutes do Beto satildeo o suficiente para fazer Beto natildeo ser eleito se eles decidirem abandonarsua primeira opccedilatildeo e votar na Ana Considerando a vantagem que os votos taacuteticosproporcionam agrave Ana esta eacute eleita em todos os sistemas menos o TRS e o IRV

    Figura 16 ndash FPTP - Cenaacuterio 1 - 20 de voto taacutetico na Ana

    Figura 17 ndash TRS segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

    38

    Figura 18 ndash IRV primeiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

    Figura 19 ndash IRV segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

    Figura 20 ndash IRV terceiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

    39

    Figura 21 ndash AVS - Cenaacuterio 1 20 de voto taacutetico na Ana

    Figura 22 ndash BC - Cenaacuterio 1 20 de voto taacutetico na Ana

    Figura 23 ndash SVS - Cenaacuterio 1 20 de voto taacutetico na Ana

    40

    Eacute claro que se os eleitores que preferem o Beto tambeacutem votassem de maneira estra-teacutegica a situaccedilatildeo se equilibraria e haveria o mesmo niacutevel de concorrecircncia entre os doiscandidatos que ocorre quando natildeo haacute voto taacutetico Poreacutem no Borda Count esse equiliacute-brio pode natildeo acontecer e as estrateacutegias de compromising e burying podem acabar saindopela culatra se uma porcentagem elevada dos eleitores as adotarem Abaixo encontram-seos resultados para esse sistema quando 100 dos eleitores de Carla e Diego se comportammaliciosamente

    Figura 24 ndash BC - Cenaacuterio 1 100 de voto taacutetico na Ana e Beto

    Por causa do uso demasiado da estrateacutegia burying Ana e Beto perdem muitos pontose isso abre espaccedilo para uma vitoacuteria da Carla No entanto para porcentagens menores que100 o Beto ainda eacute o vencedor

    Essas duas estrateacutegias tambeacutem foram implementadas nesse simulador para o sistemaIRV e eacute possiacutevel ver como ele eacute resistente a elas Para que seja possiacutevel mudar os resultadosde uma eleiccedilatildeo sob o IRV eacute necessaacuterio mudar a ordem de eliminaccedilatildeo dos candidatos paraque o seu candidato preferido acabe enfrentando um candidato mais fraco nas rodadasfinais Isso natildeo ocorre com compromising e burying No proacuteximo cenaacuterio seraacute analisadacomo eacute possiacutevel modificar os resultados de uma eleiccedilatildeo sob o IRV

    Esses resultados podem ser replicados acessando os linksSem votos taacuteticos lthttpelectionsimpythonanywherecomdirect_res1111110

    --[0021][22Ana2222Beto222022Carla2222Diego22]------100gt

    Com 20 de voto taacutetico lthttpelectionsimpythonanywherecomdirect_res1111110--[0021][22Ana222022Beto2222Carla2222Diego22]1-[02000]---100gt

    Com 100 de voto taacuteticona Ana e Beto lthttpelectionsimpythonanywherecomdirect_res0000100--[0021][22Ana222022Beto222022Carla2222Diego22]1-[101000]---100gt

    41

    42 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV

    Neste cenaacuterio teremos Ana Carla e Beto concorrendo e trecircs perfis distintos que apoiamcada candidato As distribuiccedilotildees de notas dos perfis se encontram na tabela abaixo

    Tabela 12 ndash Distribuiccedilatildeo de notas - Cenaacuterio 2

    Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

    deeleitores

    1 10 5 0 422 0 10 5 303 5 0 10 28

    Com essas distribuiccedilotildees Carla eacute eliminada na primeira rodada e seus 28 de votossatildeo transferidos para a segunda opccedilatildeo de seus eleitores Ana que eacute eleita com 70 dosvotos e uma meacutedia de 56

    Figura 25 ndash IRV primeiro turno - Cenaacuterio 2

    Figura 26 ndash IRV segundo turno - Cenaacuterio 2

    42

    Cientes desse provaacutevel futuro cenaacuterio onde Ana eacute eleita uma pequena parte dos elei-tores de Beto estrategicamente o abandona e decide apoiar Carla na esperanccedila de leva-laao segundo turno contra Ana As novas distribuiccedilotildees de notas se encontram na tabelaabaixo com essa porccedilatildeo de eleitores representada pelo perfil 4

    Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2

    Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

    deeleitores

    1 10 5 0 422 0 10 5 283 5 0 10 284 0 8 10 2

    Essa mudanccedila estrateacutegica de voto altera a ordem de eliminaccedilotildees do sistema com Betosendo o primeiro a ser eliminado Com isso seus votos satildeo naturalmente transferidos paraCarla que derrota Ana no segundo turno com 58 dos votos

    Figura 27 ndash IRV primeiro turno com voto taacutetico - Cenaacuterio 2

    Figura 28 ndash IRV segundo turno com voto taacutetico - Cenaacuterio 2

    43

    Percebendo que a eleiccedilatildeo de Beto natildeo era provaacutevel seus eleitores conseguiram aomenos impedir a eleiccedilatildeo do pior candidato para eles Mas para isso foi necessaacuterio queeles tivessem a informaccedilatildeo de como os outros eleitores votariam Uma aproximaccedilatildeo dessasinformaccedilotildees poderia ser obtida em um cenaacuterio real com poucos candidatos atraveacutes depesquisas eleitorais poreacutem se o nuacutemero de candidatos eacute significativo uma noccedilatildeo completadas distribuiccedilotildees dos rankings dos eleitores se torna muito menos viaacutevel e dificulta aformulaccedilatildeo de estrateacutegias para alterar a ordem em que os candidatos satildeo eliminados

    Esses resultados podem ser replicados acessando os linksSem voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana22

    22Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

    Com voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana

    2222Beto2222Carla22]-----42Voter20Profile2001020520028Voter20Profile2010201020528Voter20Profile202520020102Voter20Profile20302082010100gt

    43 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE

    O interessante dos sistemas IRV e TRS eacute que os resultados do cenaacuterio anterior po-deriam ter sido obtidos ao inveacutes do voto taacutetico pela sua natildeo-monotonicidade Seriapossiacutevel que a Carla derrotasse a Ana no segundo turno atraveacutes do proacuteprio aumento depopularidade da Ana Assumindo que essa popularizaccedilatildeo ocorresse entre os candidatosdo perfil 2 onde 3 passasse a apoiar a Ana ao inveacutes do Beto as novas distribuiccedilotildeesseguiriam a tabela abaixo

    Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

    Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

    deeleitores

    1 10 5 0 452 0 10 5 273 5 0 10 28

    Dessa maneira Beto agora com uma porcentagem dos eleitores menor do que a deCarla seraacute eliminado na primeira rodada e como seus eleitores tecircm a Carla como segundaopccedilatildeo ela receberaacute todos os seus votos e seraacute eleita na segunda rodada As rodadas doIRV podem ser vistas nas figuras 29 e 30

    44

    Figura 29 ndash IRV primeiro turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

    Figura 30 ndash IRV segundo turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

    Tabela 15 ndash Resultados do Cenaacuterio 3Candidato

    eleitoMeacutedia das

    notasAntes da

    popularizaccedilatildeode Ana

    Ana 56

    Apoacutespopularizaccedilatildeo

    de AnaCarla 415

    Os efeitos dessa caracteriacutestica se refletem na satisfaccedilatildeo meacutedia da populaccedilatildeo A Ana eacuteclaramente a melhor candidata e mesmo com o seu ganho de popularidade (ou devido aele) a Carla eacute eleita

    Esses resultados podem ser replicados acessando os linksAntes da popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecom

    direct_res0010000---[22Ana2222Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

    45

    Apoacutes popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana2222Beto2222Carla22]-----45Voter20Profile2001020520027Voter20Profile2010201020528Voter20Profile20252002010100gt

    44 CENAacuteRIO 4 COALIZOtildeES

    O TRS por ser organizado em dois turnos separados normalmente a semanas dedistacircncia um do outro acaba abrindo brecha agrave mudanccedila de opiniatildeo por parte dos eleitorese o desenvolvimento de novas estrateacutegias por parte dos candidatos tais como a coalizatildeocom candidatos jaacute eliminados Com isso em mente nesse cenaacuterio teremos novamenteos quatro candidatos Ana Beto Carla e Diego Os trecircs primeiros seratildeo gerados dadistribuiccedilatildeo Neutral e Diego da distribuiccedilatildeo Disliked

    Figura 31 ndash TRS turno 1 - Cenaacuterio 4

    No TRS normal Ana Beto e Carla possuem com essas distribuiccedilotildees quantidades devotos muito proacuteximas com Beto e Carla indo para o segundo turno Carla estaacute 10 votosatraacutes de Beto e decide aproveitar o espaccedilo de tempo entre os dois turnos para tentaragregar mais votos Com isso Carla se aproxima de Diego e juntos formam uma coalizatildeoNo entanto com sua baixa popularidade Diego acaba ferindo a reputaccedilatildeo de Carla etorna o segundo turno muito mais faacutecil para Beto (Figura 33) Se Carla tivesse buscado osuporte de Ana por outro lado ela se veria vitoriosa no segundo turno e com uma amplavantagem sobre o Beto (Figura 34) Ou ateacute mesmo sem buscar uma coalizatildeo mesmosendo uma corrida apertada Carla teria naturalmente sido eleita (Figura 32)

    Esses resultados podem ser replicados acessando os linksSem coalizotildees lthttpelectionsimpythonanywherecomdirect_res0100000

    --[0002][22Ana222022Beto2222Carla2222Diego22]------100gt

    46

    Figura 32 ndash TRS turno 2 - Cenaacuterio 4

    Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4

    Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4

    47

    Coalizatildeo Carla e Diego lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2203Carla20Diego-100gt

    Coalizatildeo Carla e Ana lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2200Carla20Ana-100gt

    45 CENAacuteRIO 5 DILEMA DO PRISIONEIRO

    Neste cenaacuterio temos uma eleiccedilatildeo de uma vaga com trecircs candidatos concorrentes e trecircsperfis distintos de eleitores que seguiratildeo as seguintes distribuiccedilotildees

    Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5

    Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

    deeleitores

    1 10 -10 5 362 -10 10 5 343 -10 -10 5 30

    Esse contexto nos remete ao notaacutevel dilema do prisioneiro Nele dois prisioneiroscuacutemplices satildeo interrogados individualmente sem poder se comunicar um com o outro ecada um enfrenta o dilema de delatar ou natildeo o seu parceiro Se os dois prisioneirosdecidem se manter calados sobre o crime ambos satildeo sentenciados a um ano de prisatildeo Seapenas um deles dedurar o outro o traidor sai livre enquanto seu parceiro eacute condenadoa trecircs anos Se ambos dedurarem um ao outro eles satildeo condenados juntos a dois anosde prisatildeo Esse dilema eacute uma ideia claacutessica presente no estudo da teoria dos jogos sendooriginalmente elaborada por Merrill Flood e Melvin Dresher em 1950 e mais tarde sendonomeada de dilema dos prisioneiros por Albert W Tucker (POUNDSTONE 1992)

    O que esse dilema nos mostra eacute a tentaccedilatildeo que o indiviacuteduo deteacutem se sua racionalizaccedilatildeoestiver voltada para seus proacuteprios interesses e somente eles em oposiccedilatildeo a pensar no bemdo grupo como um todo Neste cenaacuterio encontramos dois grupos de eleitores expressiva-mente opostos os perfis 1 e 2 Se qualquer uma das preferecircncias desses perfis fosse eleitaisso significaria uma alta rejeiccedilatildeo de maior parte da populaccedilatildeo No entanto eles possuema segunda opccedilatildeo em comum a Carla que por sua vez eacute a preferecircncia do terceiro perfilPortanto a eleiccedilatildeo da Carla seria logicamente o resultado oacutetimo

    Mesmo assim a Ana eacute eleita nos dois sistemas acima o que natildeo parece justo poispela tabela 16 eacute evidente que apenas 36 da populaccedilatildeo a aprova enquanto que os outros64 a reprovam ao maacuteximo O sistema IRV se comporta de maneira idecircntica ao TRS

    48

    Figura 35 ndash FPTP - Cenaacuterio 5

    Figura 36 ndash TRS segundo turno - Cenaacuterio 5

    nesta situaccedilatildeo Com esse resultado a meacutedia das notas eacute -28 No entanto os trecircs sistemasseguintes nos apresentam resultados diferentes

    Tabela 17 ndash Resultados do Cenaacuterio 5

    Sistema Candidatoeleito

    Meacutedia dasnotas

    FPTP Ana -28TRS Ana -28IRV Ana -28AVS Carla 50BC Carla 50SVS Carla 50

    49

    Figura 37 ndash AVS - Cenaacuterio 5

    Figura 38 ndash BC - Cenaacuterio 5

    Tanto o AVS quanto o Borda Count e o SVS satildeo sistemas que consideram todasas opiniotildees de cada eleitor ao mesmo tempo e por isso satildeo capazes de eleger o melhorcandidato nesta situaccedilatildeo diferentemente do TRS que natildeo absorve completamente todosentimento do eleitor por todos os candidatos e o IRV que apesar de ser bem expressivoquebra esse processo em inuacutemeras rodadas o que permite a perda de informaccedilatildeo ao longodelas

    Esses resultados podem ser replicados acessando o linklthttpelectionsimpythonanywherecomdirect_res1111110---[22Ana

    222022Beto222022Carla22]-----36Voter20Profile2001020-1020534Voter20Profile201-10201020530Voter20Profile202-1020-10205100gt

    50

    Figura 39 ndash SVS - Cenaacuterio 5

    46 CENAacuteRIO 6 VOTO DE MINORIA

    Neste cenaacuterio temos uma eleiccedilatildeo com quatro candidatos e duas vagas A Ana seraacutea preferecircncia de uma extensa parte da populaccedilatildeo (distribuiccedilatildeo Loved Figura 53) Betoe Carla seratildeo candidatos razoavelmente populares (distribuiccedilatildeo Neutral Figura 47) eDiego seraacute a preferecircncia de apenas um pequeno grupo especiacutefico e rejeitado pela maioria(distribuiccedilatildeo Disliked Figura 51) Eacute intuitivo esperar que os dois candidatos eleitos seratildeoa Ana e ou o Beto ou a Carla e isso eacute exatamente o que ocorre na figura 40 no sistemaFPTP sem voto de minoria

    Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria

    Eacute evidente a discrepacircncia da quantidade de votos da Ana para os outros candidatose apesar de Beto e Carla serem mais populares que Diego os trecircs natildeo se encontrammuito afastados Poreacutem se a pequena fraccedilatildeo de candidatos que possuem a Ana como

    51

    Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego

    preferecircncia e Diego como segunda opccedilatildeo optarem pelo voto de minoria a situaccedilatildeo mudacompletamente (Figura 41) Assim apesar de extensamente rejeitado Diego conquistaa segunda vaga e a meacutedia das notas despenca de 2929 para 0505 No entanto aindaexiste um cenaacuterio pior Se os outros grupos de eleitores pensarem da mesma forma eevitarem votar na Ana achando que sua eleiccedilatildeo jaacute estaacute assegurada apenas 80 de votode minoria para esses grupos jaacute eacute o suficiente para eliminaacute-la das eleiccedilotildees (Figura 42)Com a Ana eliminada a meacutedia das notas cai ainda mais para 0058

    Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego

    O sistema Bloc Vote eacute uma das soluccedilotildees para o voto de minoria Permitindo queos eleitores votem no mesmo nuacutemero de candidatos que de vagas a serem preenchidasnatildeo existe o iacutempeto a esse tipo de voto estrateacutegico O resultado desse sistema portantoretorna a meacutedia das notas a casa dos 29 (Figura 43) Os sistemas AVS Borda Count eSVS tambeacutem impedem a presenccedila do voto de minoria e atingem resultados semelhantes

    52

    Figura 43 ndash BV - Cenaacuterio 6

    Tabela 18 ndash Resultados do Cenaacuterio 6

    Sistema Candidatoseleitos

    Meacutedia dasnotas

    FPTP sem voto de minoriaAna eBeto 2929

    FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

    FPTP com 80 de voto de minoriaBeto eCarla 0058

    Bloc VoteAna eCarla 2913

    Esses resultados podem ser replicados acessando os links

    Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

    100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

    80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

    53

    5 COMO FUNCIONA O SIMULADOR

    O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

    51 CLASSE ELECTIONS

    Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

    bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

    Figura 44 ndash estrutura candidates

    bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

    bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

    Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

    Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

    54

    Figura 45 ndash estrutura voters

    Figura 46 ndash estrutura votes

    daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

    Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

    55

    Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

    Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

    na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

    56

    Figura 49 ndash PDF - Distribuiccedilatildeo Liked

    Figura 50 ndash CDF - Distribuiccedilatildeo Liked

    (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

    Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

    57

    Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

    Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

    candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

    Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

    58

    Figura 53 ndash PDF - Distribuiccedilatildeo Loved

    Figura 54 ndash CDF - Distribuiccedilatildeo Loved

    funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

    59

    Figura 55 ndash PDF - Distribuiccedilatildeo Hated

    Figura 56 ndash CDF - Distribuiccedilatildeo Hated

    Meacutedia das Notas sumei

    sumvj nij

    etimes v

    Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

    Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

    60

    Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

    Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

    52 CLASSE FIRSTPASTTHEPOST

    Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

    Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

    61

    Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

    Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

    mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

    62

    53 CLASSE TWOROUNDSYSTEM

    A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

    54 CLASSE INSTANTRUNOFFVOTING

    A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

    Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

    63

    cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

    55 CLASSE APPROVALVOTING

    Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

    56 CLASSE BORDACOUNT

    Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

    57 CLASSE SCOREVOTING

    De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

    64

    58 CLASSE BLOCVOTE

    O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

    59 TECNOLOGIAS UTILIZADAS

    A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

    Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

    O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

    Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

    65

    6 CONCLUSAtildeO

    Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

    Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

    Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

    Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

    Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

    66

    REFEREcircNCIAS

    AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

    Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

    Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

    Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

    HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

    LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

    ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

    Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

    POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

    The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

    67

    APEcircNDICES

    APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

    Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

    if(not len(selfvoter_profiles))

    for voter in range(selfN_VOTERS)

    candidates_rank = dict()

    for candidate in reversed(range(selfN_CANDIDATES))

    if(selfBIAS_VECTOR[candidate]==4)

    candidates_rank[candidate] = self_sortear(selfloved)

    elif(selfBIAS_VECTOR[candidate]==3)

    candidates_rank[candidate] = self_sortear(selfliked)

    elif(selfBIAS_VECTOR[candidate]==2)

    candidates_rank[candidate] = self_sortear(selfdisliked)

    elif(selfBIAS_VECTOR[candidate]==1)

    candidates_rank[candidate] = self_sortear(selfhated)

    elif(selfBIAS_VECTOR[candidate]==-1)

    candidates_rank[candidate] = self_sortear(selfpolarizer

    )

    elif(selfBIAS_VECTOR[candidate]==-2)

    candidates_rank[candidate] = self_sortear(self

    more_polarizer)

    else

    candidates_rank[candidate] = self_sortear(selfneutral)

    selfvotersappend(candidates_rank)

    else

    ranges = []

    ranks = []

    for prof in selfvoter_profiles

    rangesappend(int(prof[pop_percentage]))

    rank =

    for index score in enumerate(prof[scores])

    rank[index] = score

    ranksappend(rank)

    for index _range in enumerate(ranges)

    for _ in range(int(selfN_VOTERS(_range100)))

    selfvotersappend(ranks[index])

    68

    APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

    Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

    for i in range(selfN_CANDIDATES)

    selfcandidates[i] = 0

    selfvotes[i] = set()

    APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

    Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

    for candidate in range(selfN_CANDIDATES)

    rating_sum = 0

    for voter in selfvoters

    rating_sum += voter[candidate]

    selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

    APEcircNDICE D ndash MEacuteTODO GET_MEAN

    Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

    if len(winners) gt 1 or selfN_CANDIDATES gt 10

    return selfcalculate_mean(winners)

    else

    chose_best = True if winners[0] == selfbest_candidate else

    False

    return selfstats[rsquomeansrsquo][winners[0]] chose_best

    69

    APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

    Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

    rating_sum = 0

    for voter in selfvoters

    for candidate in winners

    rating_sum += voter[candidate]

    return rating_sum(selfN_VOTERSselfN_VACANCIES) False

    APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

    Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

    for i in range(1 selfN_VACANCIES + 2)

    selfleading_candidatesappend(selfsorted_candidates[-i][self

    CANDIDATE_INDEX])

    APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

    Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

    for leader in selfelecrounds[-1]

    selfleading_candidatesappend(leader[0])

    70

    APEcircNDICE H ndash MEacuteTODO SORT_RANKS

    Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

    self_account_for_coalitions()

    for voter in selfvoters

    selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

    (1)))

    temp = []

    for voter in selfsorted_voters

    new_dict = defaultdict(list)

    for k in voter

    new_dict[k[1]]append(k[0])

    tempappend(new_dict)

    selfsorted_voters = []

    for voter_index current_voter in enumerate(temp)

    new_voter = []

    for rating candidate_indexes in current_voteritems()

    if len(current_voter[rating]) gt 1

    shuffle(current_voter[rating])

    for e in candidate_indexes

    new_voterappend((e rating))

    else

    new_voterappend((candidate_indexes[0] rating))

    selfsorted_votersappend(new_voter)

    selfcandidates[new_voter[-1][0]] += 1

    selfvotes[new_voter[-1][0]]add(voter_index)

    71

    APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

    Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

    for candidate in selfvotes_copy

    if candidate not in selfelecleading_candidates

    for voter_index in selfvotes_copy[candidate]

    for index _candidate in enumerate(reversed(selfelec

    sorted_voters[voter_index]))

    if _candidate[selfelecCANDIDATE_INDEX] in selfelec

    leading_candidates

    if randomrandom() lt selfelec

    tactical_vote_percentages[_candidate[selfelec

    CANDIDATE_INDEX]]

    selfrankings_changed[voter_index] = copy

    deepcopy(selfelecsorted_voters[voter_index])

    selfrankings_changed[voter_index][-(index + 1)]

    selfrankings_changed[voter_index][-1] = self

    rankings_changed[voter_index][-1] self

    rankings_changed[voter_index][-(index + 1)]

    selfcandidates[candidate] -= 1

    selfcandidates[_candidate[selfelec

    CANDIDATE_INDEX]] += 1

    selfvotes[candidate]remove(voter_index)

    selfvotes[_candidate[selfelecCANDIDATE_INDEX

    ]]add(voter_index)

    break

    break

    72

    APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

    Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

    half_vacancies = mathfloor(selfelecN_VACANCIES2)

    for candidate in selfelecleading_candidates

    if selfelecleading_candidatesindex(candidate) gt= half_vacancies

    continue

    for voter_index in selfvotes_copy[candidate]

    if voter_index in selfrankings_changed

    ranking = selfrankings_changed[voter_index]

    else

    ranking = copydeepcopy(selfelecsorted_voters[voter_index

    ])

    for index _candidate in enumerate(reversed(ranking))

    if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

    leading_candidates or (_candidate[selfelec

    CANDIDATE_INDEX] in selfelecleading_candidates and

    selfelecleading_candidatesindex(_candidate[selfelec

    CANDIDATE_INDEX]) gt= half_vacancies)

    if _candidate[selfelecCANDIDATE_RANK] gt= 0

    if randomrandom() lt selfelec

    minority_vote_percentages[_candidate[selfelec

    CANDIDATE_INDEX]]

    selfcandidates[candidate] -= 1

    selfcandidates[_candidate[selfelec

    CANDIDATE_INDEX]] += 1

    break

    break

    break

    73

    APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

    Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

    self_account_for_coalitions()

    for candidate in selfvotes

    if candidate = selfwinner and candidate = selfsecond_place

    for voter_index in selfvotes[candidate]

    if voter_index in selfrankings_changed

    ranking = selfrankings_changed[voter_index]

    else

    ranking = copydeepcopy(selfelecsorted_voters[

    voter_index])

    for index2 candidate in enumerate(reversed(ranking))

    if candidate[selfelecCANDIDATE_INDEX] == selfwinner

    selfcandidates[selfwinner] += 1

    selfvotes[selfwinner]add(voter_index)

    break

    elif candidate[selfelecCANDIDATE_INDEX] == self

    second_place

    selfcandidates[selfsecond_place] += 1

    selfvotes[selfsecond_place]add(voter_index)

    break

    selfsorted_candidates = selfelecsort_candidates(selfcandidates)

    winners = []

    vacancies = selfelecN_VACANCIES

    for candidate in reversed(selfsorted_candidates)

    if vacancies == 0

    break

    winnersappend(candidate[0])

    vacancies -= 1

    mean chose_best = selfelecget_mean(winners = winners)

    74

    APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

    Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

    for voter_index voter in enumerate(selfelecsorted_voters)

    voter_dict = dict()

    og_voter_dict = dict()

    for tup in voter

    voter_dict[tup[0]] = tup[1]

    og_voter_dict[tup[0]] = tup[1]

    for coalition in selfeleccoalitions

    for candidate in coalition

    add_to_score = 0

    for candidate2 in coalition

    if candidate == candidate2

    continue

    half = og_voter_dict[candidate2[rsquovaluersquo]]2

    if half lt 0

    add_to_score += mathceil(half)

    else

    add_to_score += mathfloor(half)

    if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

    voter_dict[candidate[rsquovaluersquo]] = 10

    elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

    voter_dict[candidate[rsquovaluersquo]] = -10

    else

    voter_dict[candidate[rsquovaluersquo]] += add_to_score

    selfrankings_changed[voter_index] = []

    for candidate in voter_dict

    selfrankings_changed[voter_index]append((candidate voter_dict[

    candidate]))

    selfrankings_changed[voter_index] = sorted(selfrankings_changed[

    voter_index] key=lambda x x[1])

    75

    APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

    Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

    selfelecroundsappend(selfsorted_candidates[_round])

    if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

    N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

    N_VACANCIES - 1)

    return 2

    elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

    N_VOTERS gt 05)

    return 1

    else

    selfelecexcludedadd(selfsorted_candidates[_round][selfelec

    CANDIDATE_INDEX])

    for voter_index in selfvotes[selfsorted_candidates[_round][self

    elecCANDIDATE_INDEX]]

    if voter_index in selfrankings_changed

    for candidate in reversed(selfrankings_changed[voter_index

    ])

    if candidate[selfelecCANDIDATE_INDEX] not in selfelec

    excluded

    selfcandidates[candidate[selfelecCANDIDATE_INDEX

    ]] += 1

    selfvotes[candidate[selfelecCANDIDATE_INDEX]]

    add(voter_index)

    break

    else

    continue

    else

    for candidate in reversed(selfelecsorted_voters[

    voter_index])

    if candidate[selfelecCANDIDATE_INDEX] not in selfelec

    excluded

    selfcandidates[candidate[selfelecCANDIDATE_INDEX

    ]] += 1

    selfvotes[candidate[selfelecCANDIDATE_INDEX]]

    add(voter_index)

    break

    else

    continue

    selfsorted_candidates = selfelecsort_candidates(selfcandidates)

    return 0

    76

    APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

    Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

    for index in range(selfelecN_CANDIDATES)

    selfcandidates[index] = 0

    for voter in selfelecsorted_voters

    for candidate in reversed(voter)

    if candidate[selfelecCANDIDATE_SCORE] gt 0

    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

    else

    break

    APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

    Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

    for index in range(selfelecN_CANDIDATES)

    selfcandidates[index] = 0

    for voter in selfelecsorted_voters

    if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

    elecCANDIDATE_INDEX]]

    selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

    else

    for candidate in reversed(voter)

    if candidate[selfelecCANDIDATE_SCORE] gt 0

    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

    else

    break

    77

    APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

    Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

    pos = set()

    for index perc in enumerate(selfelectactical_vote_percentages)

    if perc gt 0

    posadd(index)

    for candidate in selfeleccandidates

    if candidate not in selfleading_candidates

    for voter_index in selfvotes[candidate]

    raised = None

    for candidate_tuple in reversed(selfelecsorted_voters[voter_index

    ])

    if candidate_tuple[selfelecCANDIDATE_INDEX] in self

    leading_candidates

    if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

    if randomrandom() lt selfelectactical_vote_percentages[

    candidate_tuple[selfelecCANDIDATE_INDEX]]

    ranking = [None]selfelecN_CANDIDATES

    ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

    selfelecvoters[voter_index][candidate_tuple[selfelec

    CANDIDATE_INDEX]])

    raised = candidate_tuple[selfelecCANDIDATE_INDEX]

    break

    break

    break

    if raised = None

    for _candidate in selfleading_candidates

    if _candidate = ranking[-1][0]

    ranking[0] = (_candidate selfelecvoters[voter_index][

    _candidate])

    buried = _candidate

    break

    i = 1

    for candidate_tuple in selfelecsorted_voters[voter_index]

    if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

    buried]

    continue

    else

    ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

    selfelecvoters[voter_index][candidate_tuple[selfelec

    CANDIDATE_INDEX]])

    i += 1

    selfrankings_changed[voter_index] = ranking

    78

    APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

    Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

    for voter_index in selfvotes[candidate]

    if randomrandom() lt selfelectactical_vote_percentages[candidate

    ]

    for _candidate in selfleading_candidates

    if _candidate = candidate

    ranking = [None]selfelecN_CANDIDATES

    ranking[0] = (_candidate selfelecvoters[voter_index][

    _candidate])

    buried = _candidate

    break

    i = 1

    for candidate_tuple in selfelecsorted_voters[voter_index]

    if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

    continue

    else

    ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

    selfelecvoters[voter_index][candidate_tuple[selfelec

    CANDIDATE_INDEX]])

    i += 1

    selfrankings_changed[voter_index] = ranking

    79

    APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

    Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

    for index in range(selfelecN_CANDIDATES)

    selfcandidates[index] = 0

    for voter_index voter in enumerate(selfelecsorted_voters)

    score = 0

    if voter_index in selfrankings_changed

    for candidate in selfrankings_changed[voter_index]

    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

    score += 1

    else

    for candidate in voter

    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

    score += 1

    APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

    Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

    for voter_index voter in enumerate(selfelecsorted_voters)

    if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

    elecCANDIDATE_INDEX]]

    selfrankings_changed[voter_index] = copydeepcopy(selfelec

    sorted_voters[voter_index])

    for candidate_index candidate in enumerate(reversed(voter))

    if candidate_index == 0

    selfrankings_changed[voter_index][-(candidate_index + 1)] = (

    voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

    else

    selfrankings_changed[voter_index][-(candidate_index + 1)] = (

    voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

    80

    APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

    Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

    for index in range(selfelecN_CANDIDATES)

    selfcandidates[index] = 0

    for voter_index voter in enumerate(selfelecsorted_voters)

    if voter_index in selfrankings_changed

    for candidate in selfrankings_changed[voter_index]

    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

    selfelecCANDIDATE_RANK]

    else

    for candidate in voter

    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

    selfelecCANDIDATE_RANK]

    APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

    Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

    for index in range(selfelecN_CANDIDATES)

    selfcandidates[index] = 0

    for voter in selfelecsorted_voters

    votes = selfelecN_VACANCIES

    for candidate in reversed(voter)

    if votes == 0

    break

    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

    votes -= 1

    • Folha de aprovaccedilatildeo
    • Agradecimentos
    • Epiacutegrafe
    • Resumo
    • Abstract
    • Lista de ilustraccedilotildees
    • Lista de Coacutedigos
    • Lista de tabelas
    • Lista de abreviaturas e siglas
    • Sumaacuterio
    • INTRODUCcedilAtildeO
      • MOTIVACcedilAtildeO E OBJETIVO
      • MEacuteTODO
      • ESTRUTURA
        • SISTEMAS ELEITORAIS
          • FISRT PAST THE POST
            • Exemplo
            • Vantagens e Desvantagens do FPTP
            • Voto Uacutetil no FPTP
              • TWO-ROUND SYSTEM
                • Exemplo
                • Vantagens e Desvantagens do TRS
                • Voto Uacutetil no TRS
                  • INSTANT-RUNOFF VOTING
                    • Exemplo
                    • Vantagens e Desvantagens do IRV
                    • Voto Uacutetil no IRV
                      • APPROVAL VOTING SYSTEM
                        • Exemplo
                        • Vantagens e Desvantagens do AVS
                        • Voto Uacutetil no AVS
                          • THE BORDA COUNT
                            • Exemplo
                            • Vantagens e Desvantagens do BC
                            • Voto Uacutetil no BC
                              • SCORE VOTING SYSTEM
                                • Exemplo
                                • Vantagens e Desvantagens do SVS
                                • Voto Uacutetil no SVS
                                  • BLOC VOTE
                                    • Exemplo
                                    • Voto Uacutetil no BV
                                        • O SIMULADOR
                                        • CENAacuteRIOS PERTINENTES
                                          • CENAacuteRIO 1 VOTO TAacuteTICO
                                          • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                          • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                          • CENAacuteRIO 4 COALIZOtildeES
                                          • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                          • CENAacuteRIO 6 VOTO DE MINORIA
                                            • COMO FUNCIONA O SIMULADOR
                                              • CLASSE Elections
                                              • CLASSE FirstPastThePost
                                              • CLASSE TwoRoundSystem
                                              • CLASSE InstantRunoffVoting
                                              • CLASSE ApprovalVoting
                                              • CLASSE BordaCount
                                              • CLASSE ScoreVoting
                                              • CLASSE BlocVote
                                              • TECNOLOGIAS UTILIZADAS
                                                • CONCLUSAtildeO
                                                • Referecircncias
                                                • Meacutetodo create_voters
                                                • Meacutetodo create_candidates
                                                • Meacutetodo calculate_means
                                                • Meacutetodo get_mean
                                                • Meacutetodo calculate_mean
                                                • Meacutetodo set_leading_candidates
                                                • Meacutetodo irv_set_leading_candidates
                                                • Meacutetodo sort_ranks
                                                • Meacutetodo fptp_count_tactical_votes
                                                • Meacutetodo fptp_count_minority_votes
                                                • Meacutetodo trs_second_round
                                                • Meacutetodo trs_account_for_coalitions
                                                • Meacutetodo irv_count_votes
                                                • Meacutetodo avs_count_votes
                                                • Meacutetodo avs_count_votes_with_tactical
                                                • Meacutetodo irv_apply_tactical_votes
                                                • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                • Meacutetodo bc_sum_candidates_scores
                                                • Meacutetodo svs_apply_tactical_votes
                                                • Meacutetodo svs_sum_candidates_scores
                                                • Meacutetodo bv_count_votes

      AGRADECIMENTOS

      Gostaria de agradecer primeiramente agrave UFRJ que me permitiu embarcar nessa jor-nada pela busca de conhecimento nesse fascinante campo que eacute a computaccedilatildeo Ao meuorientador Viniacutecius Gusmatildeo Pereira de Saacute pela atenccedilatildeo e ajuda no esclarecimento dosmelhores caminhos a se tomar na elaboraccedilatildeo deste trabalho Aos meus pais e a todaminha familia pelo incentivo e apoio incondicional A minha namorada pela paciecircnciae compreensatildeo nesta complicada fase da minha formaccedilatildeo acadecircmica E aos meus amigosque ja passaram ou que estatildeo passando pelo mesmo processo de conclusatildeo que eu e quecompartilham das mesmas dificuldades

      ldquoElections are won by men and women chiefly because most people vote against somebodyrather than for somebody

      Franklin P Adams

      RESUMO

      Existem diversos tipos de sistemas eleitorais em uso ao redor do mundo Cada paiacutes optapelo meacutetodo que melhor se adequa ao seu modo de governar muitas vezes utilizandovariaccedilotildees de um mesmo meacutetodo ou ateacute uma combinaccedilatildeo destes dependendo do cargopoliacutetico em questatildeo Atraveacutes da implementaccedilatildeo de um programa que permite simular umextenso nuacutemero de eleitores esta tese procura descobrir quais meacutetodos trazem resultadosque maximizam a taxa de satisfaccedilatildeo meacutedia da populaccedilatildeo quando testados sob diferentescenaacuterios poliacuteticos Cada eleitor simulado atribuiraacute notas para os candidatos que seratildeogeradas dependendo do cenaacuterio de maneira aleatoacuteria seguindo certa distribuiccedilatildeo de pro-babilidade ou deterministicamente atraveacutes de perfis eleitorais Tambeacutem seratildeo incluiacutedosnas simulaccedilotildees fatores reais de uma eleiccedilatildeo como o voto uacutetil e as coalizotildees entre can-didatos para que seja possiacutevel determinar de que maneira esses paracircmetros influenciamno resultado final Seraacute possiacutevel perceber que alguns dos sistemas satildeo muito eficazes naseleccedilatildeo dos melhores candidatos poreacutem afetados pelos votos taacuteticos enquanto outros satildeoresistentes a esses mas pecam em eficiecircncia

      Palavras-chave Simulaccedilotildees Sistemas Eleitorais Satisfaccedilatildeo Meacutedia

      ABSTRACT

      There are several types of electoral systems in use around the world Each country choosesthe method that best fits their governance often using variations of the same method oreven a combination of these depending on the political position in question Through theimplementation of a program that simulates an extensive number of voters this thesisseeks to find out which methods bring results that maximize the rate of population sat-isfaction when tested under different political scenarios Each simulated voter will assignnotes to the candidates that will be generated depending on the scenario in randomfashion following a certain probability distribution or deterministically through electoralprofiles Also included in the simulations are the real factors of an election such as tacti-cal votes and coalitions between candidates so that it is possible to determine how theseparameters influence the final result It will be possible to see that some of the systemsare very effective in the selection of the best candidates however affected by tactical voteswhile others are resistant to these but lack efficiency

      Keywords Simulations Electoral Systems Satisfaction Rate

      LISTA DE ILUSTRACcedilOtildeES

      Figura 1 ndash de paiacuteses de cada tipo de regime 1946-2016 17Figura 2 ndash Captura de tela 1 30Figura 3 ndash Captura de tela 2 30Figura 4 ndash Captura de tela 3 31Figura 5 ndash Captura de tela 4 32Figura 6 ndash Captura de tela 5 32Figura 7 ndash Captura de tela 6 33Figura 8 ndash FPTP - Cenaacuterio 1 sem voto taacutetico 34Figura 9 ndash TRS segundo turno - Cenaacuterio 1 sem voto taacutetico 34Figura 10 ndash IRV primeiro turno - Cenaacuterio 1 35Figura 11 ndash IRV segundo turno - Cenaacuterio 1 35Figura 12 ndash IRV terceiro turno - Cenaacuterio 1 35Figura 13 ndash AVS - Cenaacuterio 1 sem voto taacutetico 36Figura 14 ndash BC - Cenaacuterio 1 sem voto taacutetico 36Figura 15 ndash SVS - Cenaacuterio 1 sem voto taacutetico 36Figura 16 ndash FPTP - Cenaacuterio 1 - 20 de voto taacutetico na Ana 37Figura 17 ndash TRS segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana 37Figura 18 ndash IRV primeiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana 38Figura 19 ndash IRV segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana 38Figura 20 ndash IRV terceiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana 38Figura 21 ndash AVS - Cenaacuterio 1 20 de voto taacutetico na Ana 39Figura 22 ndash BC - Cenaacuterio 1 20 de voto taacutetico na Ana 39Figura 23 ndash SVS - Cenaacuterio 1 20 de voto taacutetico na Ana 39Figura 24 ndash BC - Cenaacuterio 1 100 de voto taacutetico na Ana e Beto 40Figura 25 ndash IRV primeiro turno - Cenaacuterio 2 41Figura 26 ndash IRV segundo turno - Cenaacuterio 2 41Figura 27 ndash IRV primeiro turno com voto taacutetico - Cenaacuterio 2 42Figura 28 ndash IRV segundo turno com voto taacutetico - Cenaacuterio 2 42Figura 29 ndash IRV primeiro turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3 44Figura 30 ndash IRV segundo turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3 44Figura 31 ndash TRS turno 1 - Cenaacuterio 4 45Figura 32 ndash TRS turno 2 - Cenaacuterio 4 46Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4 46Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4 46Figura 35 ndash FPTP - Cenaacuterio 5 48Figura 36 ndash TRS segundo turno - Cenaacuterio 5 48

      Figura 37 ndash AVS - Cenaacuterio 5 49Figura 38 ndash BC - Cenaacuterio 5 49Figura 39 ndash SVS - Cenaacuterio 5 50Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria 50Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego 51Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego 51Figura 43 ndash BV - Cenaacuterio 6 52Figura 44 ndash estrutura candidates 53Figura 45 ndash estrutura voters 54Figura 46 ndash estrutura votes 54Figura 47 ndash PDF - Distribuiccedilatildeo Neutral 55Figura 48 ndash CDF - Distribuiccedilatildeo Neutral 55Figura 49 ndash PDF - Distribuiccedilatildeo Liked 56Figura 50 ndash CDF - Distribuiccedilatildeo Liked 56Figura 51 ndash PDF - Distribuiccedilatildeo Disliked 57Figura 52 ndash CDF - Distribuiccedilatildeo Disliked 57Figura 53 ndash PDF - Distribuiccedilatildeo Loved 58Figura 54 ndash CDF - Distribuiccedilatildeo Loved 58Figura 55 ndash PDF - Distribuiccedilatildeo Hated 59Figura 56 ndash CDF - Distribuiccedilatildeo Hated 59Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer 60Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer 60Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer 61Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer 61

      LISTA DE COacuteDIGOS

      A1 Meacutetodo create_voters 67B1 Meacutetodo create_candidates 68C1 Meacutetodo calculate_means 68D1 Meacutetodo get_mean 68E1 Meacutetodo calculate_mean 69F1 Meacutetodo set_leading_candidates 69G1 Meacutetodo irv_set_leading_candidates 69H1 Meacutetodo sort_ranks 70I1 Meacutetodo fptp_count_tactical_votes 71J1 Meacutetodo fptp_count_minority_votes 72K1 Meacutetodo trs_second_round 73L1 Meacutetodo trs_account_for_coalitions 74M1 Meacutetodo irv_count_votes 75N1 Meacutetodo avs_count_votes 76O1 Meacutetodo avs_count_votes_with_tactical 76P1 Meacutetodo irv_apply_tactical_votes 77Q1 Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo) 78R1 Meacutetodo bc_sum_candidates_scores 79S1 Meacutetodo svs_apply_tactical_votes 79T1 Meacutetodo svs_sum_candidates_scores 80U1 Meacutetodo bv_count_votes 80

      LISTA DE TABELAS

      Tabela 1 ndash Exemplo FPTP 18Tabela 2 ndash 2deg turno do TRS 20Tabela 3 ndash Exemplo IRV 22Tabela 4 ndash Desenvolvimento do IRV 22Tabela 5 ndash Exemplo AVS 24Tabela 6 ndash Resultado AVS 24Tabela 7 ndash Resultado BC 26Tabela 8 ndash Exemplo SVS 27Tabela 9 ndash Resultado SVS 27Tabela 10 ndash Exemplo BV 28Tabela 11 ndash Resultado BV 28Tabela 12 ndash Distribuiccedilatildeo de notas - Cenaacuterio 2 41Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2 42Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3 43Tabela 15 ndash Resultados do Cenaacuterio 3 44Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5 47Tabela 17 ndash Resultados do Cenaacuterio 5 48Tabela 18 ndash Resultados do Cenaacuterio 6 52

      LISTA DE ABREVIATURAS E SIGLAS

      FPTP First Past The Post

      TRS Two-Round System

      IRV Instant Runoff Voting

      AVS Approval Voting System

      BC Borda Count

      SVS Score Voting System

      BV Bloc Vote

      SUMAacuteRIO

      1 INTRODUCcedilAtildeO 1511 MOTIVACcedilAtildeO E OBJETIVO 1512 MEacuteTODO 1513 ESTRUTURA 15

      2 SISTEMAS ELEITORAIS 1721 FISRT PAST THE POST 17211 Exemplo 18212 Vantagens e Desvantagens do FPTP 18213 Voto Uacutetil no FPTP 1922 TWO-ROUND SYSTEM 19221 Exemplo 20222 Vantagens e Desvantagens do TRS 20223 Voto Uacutetil no TRS 2123 INSTANT-RUNOFF VOTING 21231 Exemplo 22232 Vantagens e Desvantagens do IRV 22233 Voto Uacutetil no IRV 2324 APPROVAL VOTING SYSTEM 24241 Exemplo 24242 Vantagens e Desvantagens do AVS 24243 Voto Uacutetil no AVS 2525 THE BORDA COUNT 25251 Exemplo 25252 Vantagens e Desvantagens do BC 26253 Voto Uacutetil no BC 2626 SCORE VOTING SYSTEM 26261 Exemplo 27262 Vantagens e Desvantagens do SVS 27263 Voto Uacutetil no SVS 2727 BLOC VOTE 28271 Exemplo 28272 Voto Uacutetil no BV 29

      3 O SIMULADOR 30

      4 CENAacuteRIOS PERTINENTES 3441 CENAacuteRIO 1 VOTO TAacuteTICO 3442 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV 4143 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE 4344 CENAacuteRIO 4 COALIZOtildeES 4545 CENAacuteRIO 5 DILEMA DO PRISIONEIRO 4746 CENAacuteRIO 6 VOTO DE MINORIA 50

      5 COMO FUNCIONA O SIMULADOR 5351 CLASSE Elections 5352 CLASSE FirstPastThePost 6053 CLASSE TwoRoundSystem 6254 CLASSE InstantRunoffVoting 6255 CLASSE ApprovalVoting 6356 CLASSE BordaCount 6357 CLASSE ScoreVoting 6358 CLASSE BlocVote 6459 TECNOLOGIAS UTILIZADAS 64

      6 CONCLUSAtildeO 65

      REFEREcircNCIAS 66

      APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS 67

      APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES 68

      APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS 68

      APEcircNDICE D ndash MEacuteTODO GET_MEAN 68

      APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN 69

      APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES 69

      APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES 69

      APEcircNDICE H ndash MEacuteTODO SORT_RANKS 70

      APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES 71

      APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES 72

      APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND 73

      APEcircNDICE L ndash MEacuteTODOTRS_ACCOUNT_FOR_COALITIONS 74

      APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES 75

      APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES 76

      APEcircNDICE O ndash MEacuteTODOAVS_COUNT_VOTES_WITH_TACTICAL 76

      APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES 77

      APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES (CON-TINUACcedilAtildeO) 78

      APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES 79

      APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES 79

      APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES 80

      APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES 80

      15

      1 INTRODUCcedilAtildeO

      Em toda eleiccedilatildeo existe pelo menos um grupo de indiviacuteduos que sai completamentedesfavorecido e insatisfeito com o resultado O contentamento completo de uma populaccedilatildeoeacute certamente improvaacutevel e muitas vezes impossiacutevel considerando a gama de candidatosque se dispotildee a concorrer Em todo caso o miacutenimo que pode ser feito eacute escolher demaneira eficiente o melhor candidato ao cargo dentre as opccedilotildees disponiacuteveis Diante dissoeacute necessaacuterio avaliar como essa escolha eacute feita e quais meacutetodos satildeo capazes de tornaacute-larealidade

      11 MOTIVACcedilAtildeO E OBJETIVO

      Em conformidade com o extenso nuacutemero de sistemas eleitorais pelo mundo este tra-balho tem como objetivo testar uma porccedilatildeo desses sistemas sob a simulaccedilatildeo de diferentescenaacuterios especiacuteficos a fim de determinar quais deles podem ser considerados como os maisjustos perante a taxa de satisfaccedilatildeo meacutedia da populaccedilatildeo

      12 MEacuteTODO

      Para que essa anaacutelise seja possiacutevel foi desenvolvido um programa que permite a criaccedilatildeoe configuraccedilatildeo de diferentes cenaacuterios onde os sistemas eleitorais seratildeo simulados Nele eacutepossiacutevel definir o nuacutemero total de eleitores e candidatos como esses eleitores iratildeo votar eo niacutevel de popularidade de cada candidato Aleacutem disso eacute possiacutevel formar coalizotildees entreos candidatos e escolher a porcentagem dos eleitores que optaratildeo pelo voto uacutetil Dessamaneira seraacute possiacutevel elaborar cenaacuterios que buscam expor os pontos fortes e fracos decada sistema

      13 ESTRUTURA

      Este trabalho eacute relatado ao longo de seis capiacutetulos No Capiacutetulo 2 seratildeo apresentados ossistemas eleitorais implementados no simulador suas vantagens e desvantagens conhecidase outras caracteriacutesticas especiacuteficas de cada um A intenccedilatildeo do capiacutetulo eacute tornar o textomais autocontido trazendo conceitos jaacute estudados que ajudaratildeo na melhor compreensatildeodos capiacutetulos seguintes por isso grande parte de sua composiccedilatildeo eacute oriunda de diferentesfontes consultadas

      O Capiacutetulo 3 eacute uma apresentaccedilatildeo das funcionalidades que o simulador possui Seratildeoexplicados todos os campos de entrada e os dois modos distintos nos quais o programaopera

      16

      No Capiacutetulo 4 os sistemas seratildeo colocados em teste Todos seratildeo simulados em cenaacuteriosespeciacuteficos a fim de fazer sobressair aqueles com as maiores taxas de satisfaccedilatildeo meacutedia

      A estrutura e implementaccedilatildeo do simulador seratildeo abordadas em detalhes no Capiacutetulo5 assim como uma breve descriccedilatildeo da stack utilizada Todos os meacutetodos relevantes aofuncionamento das simulaccedilotildees seratildeo explicados passo a passo

      No Capiacutetulo 6 seratildeo apresentadas as conclusotildees referentes agrave anaacutelise dos resultadosobtidos no Capiacutetulo 4 e as consideraccedilotildees finais do projeto como um todo

      17

      2 SISTEMAS ELEITORAIS

      Atualmente mais e mais paiacuteses estatildeo adotando sistemas democraacuteticos de governoCerca de 6 em 10 governos no mundo satildeo democracias (Pew Research Center 2017) o quepode ser observado na Figura 1 abaixo Em um sistema democraacutetico a populaccedilatildeo escolheseus liacutederes atraveacutes de seu sistema eleitoral Existem diversos sistemas eleitorais em usono mundo muitos dos quais satildeo usados em conjunto para eleger um uacutenico candidato Emvaacuterios paiacuteses mais de um sistema eleitoral pode ser utilizado tambeacutem em diferentes niacuteveisde governo tanto presidencial quanto estadual ou municipal Natildeo apenas imersos nomeio poliacutetico eles tambeacutem podem ser usados em escopos menores como em esportes oucompeticcedilotildees artiacutesticas poreacutem sempre com a finalidade de alocar um ou mais indiviacuteduosa determinado cargo ou tiacutetulo

      Figura 1 ndash de paiacuteses de cada tipo de regime 1946-2016

      Fonte Center of Systemic Peacersquos Polity IV Project

      Os proacuteximos trecircs toacutepicos discutidos neste capiacutetulo referentes aos meacutetodos First Pastthe Post Two-Round System e Instant Runoff Voting possuem seus conceitos e infor-maccedilotildees relevantes com exceccedilatildeo dos exemplos traduzidos livremente do livro Behind theBallot Box A Citizenrsquos Guide to Voting Systems (AMY 2000)

      21 FISRT PAST THE POST

      O meacutetodo First Past the Post tambeacutem conhecido como Plurality Voting ou WinnerTakes All eacute o meacutetodo mais simples e direto e provavelmente o primeiro meacutetodo que sepensa quando se fala de eleiccedilotildees Os eleitores escolhem apenas um candidato e apoacutes a

      18

      contagem dos votos o candidato com o maior nuacutemero de votos eacute eleito O vencedor natildeonecessita da aprovaccedilatildeo de mais de 50 dos eleitores ele apenas precisa de uma pluralidadedos votos ou seja apenas possuir mais votos que os outros candidatos

      Esse sistema eacute utilizado em escala nos Estados Unidos para a maior parte das eleiccedilotildeesvoltadas a eleger apenas um candidato como prefeitos e governadores aleacutem de ser usadana disputa presidencial Dentre outros paiacuteses que empregam o sistema em suas corridaspresidenciais estatildeo listados o Meacutexico as Filipinas a Coreia do Sul e a Venezuela

      211 Exemplo

      Tabela 1 ndash Exemplo FPTP

      Candidatos VotosA 36B 25C 22D 17

      Neste exemplo o candidato A possui uma pluralidade dos votos com 36 e ele eacute ocandidato eleito mesmo natildeo tendo uma maioria

      212 Vantagens e Desvantagens do FPTP

      A vantagem do FPTP eacute a sua simplicidade Natildeo eacute difiacutecil para um eleitor comumcompreender o seu funcionamento eles apenas precisam se decidir por um candidato Eletambeacutem eacute muito simples e direto na sua contagem e seleccedilatildeo do vencedor

      Esse meacutetodo tambeacutem tende a criar listas de candidatos concorrentes mais curtasCandidatos independentes ou de partidos menores frequentemente acabam se sentindodesencorajados a concorrer devido agraves suas baixas chances de vitoacuteria Isso normalmentefornece aos eleitores uma faacutecil decisatildeo entre um ou dois candidatos dos maiores partidosao mesmo tempo poreacutem limitando suas opccedilotildees

      No entanto sua essecircncia eacute sua principal desvantagem a pluralidade O fato do can-didato eleito natildeo necessitar de uma maioridade dos votos da populaccedilatildeo parece violaros princiacutepios baacutesicos da democracia Democracia eacute em sua origem o poder(kratos) nopovo(demos) poreacutem na pluralidade o poder de eleger um candidato pode residir emapenas uma fraccedilatildeo relativamente pequena do povo Em um cenaacuterio hipoteacutetico comapenas trecircs candidatos um deles apenas poderia necessitar de natildeo mais do que 34 dosvotos para ser eleito o que significa que no pior dos casos 66 da populaccedilatildeo rejeitao candidato eleito O cenaacuterio soacute piora com mais e mais candidatos concorrendo Paraquatro candidatos satildeo necessaacuterios 26 dos votos no pior dos casos para cinco satildeo 21 eassim por diante

      19

      213 Voto Uacutetil no FPTP

      No FPTP tambeacutem existe a possibilidade de os eleitores evitarem votar em sua prefe-recircncia verdadeira No caso de sua preferecircncia natildeo aparentar ter boas chances de vitoacuteriamuitas vezes opta-se por uma segunda opccedilatildeo que esteja mais bem colocada nas eleiccedilotildeesO motivo disso eacute que nessas situaccedilotildees votar em sua preferecircncia pode parecer um des-perdiacutecio do seu voto e no pior dos cenaacuterios optar por natildeo transferir seu voto para umasegunda opccedilatildeo pode acabar resultando na eleiccedilatildeo de um candidato de seu desgosto As-sim votar de maneira verdadeira muitas vezes pode acabar prejudicando o eleitor que sevecirc forccedilado a abandonar seus interesses poliacuteticos mais imediatos e escolher o menor entredois(ou mais) males Os candidatos de partidos menores satildeo os que mais sofrem com essetipo de voto estrateacutegico por natildeo conseguirem agregar as maiores quantidades de votos

      Entretanto ao mesmo tempo que partidos maiores roubam votos de partidos meno-res com os votos taacuteticos partidos menores tambeacutem tem a oportunidade de ganhar algunsvotos com o denominado spoiler effect Ao entrarem na eleiccedilatildeo candidatos de partidosmenores podem adquirir votos de candidatos mais populares que possuem inclinaccedilatildeo po-liacutetica semelhante Logo eacute possiacutevel que haja certo equiliacutebrio ao se contrapor as mudanccedilasde voto devido aos votos uacuteteis agraves mudanccedilas oriundas do spoiler effect

      Poreacutem o spoiler effect natildeo necessariamente ocorre apenas entre partidos maiores emenores mas pode prejudicar candidatos de popularidades proacuteximas Por exemplo entretrecircs candidatos A B e C onde A representa determinada posiccedilatildeo no espectro poliacuteticoenquanto B e C possuem posiccedilotildees parecidas o que pode acontecer eacute B e C se prejudicaremmutuamente jaacute que ambos dividem os eleitores de um mesmo espectro poliacutetico Se esseespectro tem a maioria com 60 por exemplo com B e C compartilhando cada um 30dos votos o candidato A sairia vencedor com 40 mesmo que todos os eleitores de Bprefiram C e todos os eleitores de C prefiram B Esse exemplo demonstra claramente oproblema com os sistemas de pluralidade

      22 TWO-ROUND SYSTEM

      Uma das primeiras tentativas de lidar com a desvantagem dos sistemas por pluralidadeo Two-round System eacute usado desde o seacuteculo XIX no ocidente e atualmente ainda eacute utilizadoem corridas presidecircncias de paiacuteses como o Brasil Bulgaacuteria Chile Colocircmbia FinlacircndiaPolocircnia Portugal Ruacutessia e em inuacutemeras eleiccedilotildees locais nos Estados Unidos

      O principal objetivo do TRS eacute garantir que o vencedor tenha conseguido uma maioriados votos Para isso as eleiccedilotildees satildeo estruturadas em duas rodadas de votaccedilatildeo Na primeirarodada os eleitores se dirigem agraves urnas e votam no candidato de sua preferecircncia Apoacutesa contagem se a quantidade de votos do candidato mais votado superar a proporccedilatildeo de50 natildeo haacute a necessidade de uma segunda rodada e este candidato eacute eleito No entantose este natildeo for o caso haveraacute uma segunda rodada com apenas os dois candidatos mais

      20

      votados Nesta rodada os eleitores retornam as urnas para escolher uma das duas opccedilotildeessendo eleito o candidato mais votado agora definitivamente com uma maioria dos votos

      221 Exemplo

      Utilizando a mesma distribuiccedilatildeo de votos descrita na tabela 1 Neste caso como ocandidato A natildeo possui uma maioria dos votos ele e o candidato B iratildeo concorrer em umsegundo turno Digamos que as distribuiccedilotildees dos votos dos eleitores dos candidatos C eD em relaccedilatildeo aos candidatos A e B satildeo as seguintes

      Tabela 2 ndash 2deg turno do TRS

      Candidatos Votos dos eleitoresde C

      Votos dos eleitoresde D

      Votos do 1degturno

      A 7 5 36B 15 12 25

      O candidato B agora eacute eleito com uma maioria dos votos 52 contra 48 do candidatoA

      222 Vantagens e Desvantagens do TRS

      Por ser parecido com o FPTP esse sistema tambeacutem eacute de faacutecil compreensatildeo do eleitorcomum poreacutem a maior vantagem do TRS eacute a garantia de que o candidato vencedor teraacute oapoio da maioria dos eleitores no segundo turno eliminando a pluralidade Argumenta-seque isso daacute maior legitimidade poliacutetica ao mandato do candidato eleito

      O TRS tende a abrigar uma lista maior de candidatos sendo mais convidativo acandidatos de partidos menores mesmo que suas chances natildeo sejam maiores quandocomparadas agraves eleiccedilotildees sob o FPTP Mesmo assim essa listagem mais abrangente eacute umavantagem do sistema pois daacute aos eleitores uma variedade maior de opccedilotildees de voto

      Em relaccedilatildeo agraves suas desvantagens o TRS possui duas principais A primeira satildeo oscustos elevados do sistema decorrentes da necessidade da organizaccedilatildeo de um segundoturno de votaccedilotildees A segunda eacute o aumento no iacutendice de ausecircncias dos eleitores agraves urnasEssa ampliaccedilatildeo no natildeo comparecimento dos eleitores se daacute tambeacutem devido ao segundoturno por pura fatiga eleitoral bem como consequecircncia da desistecircncia de eleitores queapoiam candidatos que jaacute foram eliminados

      Outro ponto negativo do TRS eacute a sua natildeo-monotonicidade Isso significa que umcandidato pode ser prejudicado com um aumento em sua popularidade e suporte e domesmo modo um candidato pode se beneficiar com a perda de popularidade e suporteSe os candidatos A e B satildeo os esperados para ir ao segundo turno onde A eacute mais fortedo que B um aumento no suporte pelo candidato A pode resultar na sua derrota quandoesse aumento causa uma alteraccedilatildeo nos candidatos que satildeo selecionados para ir ao segundoturno Se esse aumento na popularidade de A resultar na eliminaccedilatildeo preacutevia de B um

      21

      terceiro candidato C pode ser vitorioso sobre A no segundo turno caso os eleitores de Bprefiram C ao candidato A Se natildeo houvesse esse crescimento de popularidade A teriaderrotado B no segundo turno Essa situaccedilatildeo seraacute vista em melhores detalhes na seccedilatildeo 43

      223 Voto Uacutetil no TRS

      Esse sistema minimiza os efeitos do voto uacutetil em relaccedilatildeo ao FPTP pois um eleitorqualquer pode tranquilamente votar em sua preferecircncia sem se preocupar em desperdiccedilaacute-lo mesmo que seu candidato natildeo tenha chances de vitoacuteria Se este natildeo for eleito aindapoderaacute escolher a sua preferecircncia dentre os dois candidatos que prosseguirem para osegundo turno

      Apesar disso ainda existe um cenaacuterio em que o eleitor pode ser tentado a natildeo votar emsua preferecircncia Eacute possiacutevel que ele opte pela sua segunda opccedilatildeo se souber que sua primeiraopccedilatildeo possui miacutenimas chances de ir ao segundo turno ou ateacute mesmo por saber que issodiminuiraacute as chances de algum outro candidato ser eleito Mesmo assim eacute evidente queo TRS natildeo proporciona o mesmo apelo ao voto taacutetico que o FPTP

      Outra caracteriacutestica do TRS eacute o incentivo a formaccedilatildeo de coalizotildees entre candidatosde partidos mais populares com candidatos de partidos menos populares As coalizotildeesfornecem benefiacutecios agrave ambas as partes onde os candidatos classificados para o segundoturno em geral se juntam a candidatos jaacute eliminados com a intenccedilatildeo de agregar maisvotos enquanto os candidatos jaacute eliminados apoiam um dos dois classificados na esperanccedilade inserir propostas proacuteprias ou modificaccedilotildees agrave chapa deles

      23 INSTANT-RUNOFF VOTING

      Instant Runoff Voting foi uma alternativa aos meacutetodos FPTP e TRS desenvolvidanos anos 70 por um professor do Instituto de Tecnologia de Massachusetts(MIT) O IRVelimina as principais desvantagens desses outros dois sistemas a pluralidade do FPTP e anecessidade de mais de uma rodada de votaccedilatildeo do TRS Este meacutetodo tambeacutem opera emmais de uma rodada poreacutem como o proacuteprio nome sugere essas rodadas satildeo instantacircneasnatildeo sendo necessaacuterio o retorno dos eleitores agraves urnas Atualmente ele eacute utilizado naIrlanda nas eleiccedilotildees presidenciais em Londres na eleiccedilatildeo de seu prefeito e em distritosindividuais na Austraacutelia para eleger membros de sua cacircmara baixa do parlamento OIRV tambeacutem eacute usado por vaacuterias organizaccedilotildees privadas nos Estados Unidos incluindoa American Political Science Association e a American Psychological Association paraeleger seus funcionaacuterios

      Nesse sistema os eleitores natildeo satildeo solicitados a votar em um uacutenico candidato aoinveacutes disso eles listam todos os candidatos concorrentes na ordem de sua preferecircnciaA partir dessas listas as primeiras opccedilotildees de cada eleitor recebem o seu voto e apoacutes acontagem se um candidato obtiver 50 dos votos mais um este candidato eacute eleito Se

      22

      isso natildeo ocorrer o candidato menos votado eacute eliminado das eleiccedilotildees e seus votos satildeotransferidos para a segunda opccedilatildeo de cada um de seus eleitores Esse procedimento serepete eliminando o candidato menos votado a cada rodada ateacute que algum dos candidatospossuam a maioridade dos votos

      231 Exemplo

      Na tabela 3 pode-se verificar a distribuiccedilatildeo de votos por perfil de eleitor e na tabela4 vecirc-se o desenvolvimento do IRV para essas distribuiccedilotildees O candidato D eacute o menosvotado e por consequecircncia eacute o primeiro a ser eliminado A segunda opccedilatildeo de todos oseleitores que votaram no candidato D eacute o candidato C por isso este recebe todos os votosdistribuiacutedos na segunda rodada Com isso o candidato B eacute eliminado com 25 dos votos eos candidatos A e C concorrem na uacuteltima rodada Mesmo com o candidato C na lideranccedilana segunda rodada a maior parte dos eleitores do B tem como preferecircncia o candidatoA por isso A eacute eleito com 55 dos votos contra 45 do C

      Tabela 3 ndash Exemplo IRV

      Rankings Ndeg de eleitoresABCD 20ABDC 16BDAC 19BDCA 6CABD 7CDBA 15DCAB 5DCBA 12

      Tabela 4 ndash Desenvolvimento do IRVTurnos D C B A

      1 17 22 25 362 eliminado 39 25 363 eliminado 45 eliminado 55

      232 Vantagens e Desvantagens do IRV

      Assim como no TRS a pluralidade eacute irrelevante no IRV e um candidato soacute eacute eleitocom a maioridade dos votos dando maior legitimidade ao mandato deste No entantopode-se argumentar que o IRV faz isso com mais eficiecircncia pois natildeo requer a execuccedilatildeode mais de uma rodada de votaccedilotildees Isso diminui os custos das eleiccedilotildees como um todoao mesmo tempo que proporciona um nuacutemero menor de isenccedilotildees por parte dos eleitoresdevido ao desgaste de todo o processo eleitoral

      23

      Aleacutem disso candidatos de partidos menores tendem a receber mais votos do queno FPTP e portanto satildeo mais encorajados a se candidatar Com uma lista maior decandidatos eleitores desfrutam de uma variedade maior de opccedilotildees de voto Contudomesmo com mais candidatos menos populares o spoiler effect mencionado anteriormentetambeacutem natildeo possui espaccedilo nesse sistema de votaccedilatildeo Partidos menores natildeo tem comoroubar votos de partidos maiores visto que esses votos eventualmente seratildeo transferidosde volta a eles durante o desenvolvimento das rodadas do IRV

      Em virtude de sua estrutura acredita-se que esse meacutetodo tende a encorajar os can-didatos tambeacutem a elaborar suas campanhas de forma mais abrangente ampliando suainfluecircncia para mais do que apenas um grupo especiacutefico de maneira que ele consiga agre-gar votos de segunda ou terceira opccedilatildeo aleacutem dos votos de seus eleitores principais

      A principal desvantagem do IRV eacute o fato de ele ainda natildeo ser amplamente utilizado aoredor do mundo Essa falta de familiaridade do sistema pode causar confusatildeo ao eleitorcomum em suas primeiras ocorrecircncias No entanto nos paiacuteses em que este eacute utilizadonatildeo parece haver confusatildeo entre os eleitores Aleacutem disso na maioria dos casos haveraacute umcusto potencialmente alto da substituiccedilatildeo ou alteraccedilatildeo dos sistemas das urnas eletrocircnicaspara que seja possiacutevel haver a implementaccedilatildeo do meacutetodo

      Aleacutem disso assim como o TRS este sistema tambeacutem possui natildeo-monotonicidade ouseja um candidato pode ser prejudicado ao ser ranqueado mais alto enquanto que outropode se beneficiar sendo ranqueado mais baixo pelos eleitores (ORNSTEIN 2018) issopode ocorrer quando esse ranqueamento causa alteraccedilotildees na ordem em que os candidatossatildeo eliminados Essa caracteriacutestica se manifesta em fenocircmenos complexos e especiacuteficos epor isso um exemplo de sua ocorrecircncia seraacute abordada em detalhes na seccedilatildeo 43

      233 Voto Uacutetil no IRV

      Como os sistemas de votaccedilatildeo anteriores o IRV natildeo eacute completamente imune ao vototaacutetico No entanto este meacutetodo se mostra bem resistente a eles quando comparado aoutros meacutetodos como o FPTP e o Borda Count (Bartholdi John J III and Orlin JamesB 1990) Distintivamente o IRV requer um maior esforccedilo do eleitor para elaborar umaestrateacutegia que melhor ajuste os resultados da eleiccedilatildeo de acordo com a sua preferecircnciaAleacutem disso eacute necessaacuterio que ele tenha informaccedilatildeo suficiente sobre os rankings de outroseleitores naturalmente obtida atraveacutes de pesquisas eleitorais

      Existe tambeacutem a possibilidade de ocorrer uma exaustatildeo dos votos quando natildeo haacuteo completo preenchimento do ranking por parte dos eleitores Nessas ocasiotildees o votonatildeo pode continuar a ser transferido a outros candidatos e ele eacute descartado Isso afetaa legitimidade do mandato do candidato eleito pois o resultado final natildeo representaraacute100 da populaccedilatildeo votante Essas ocorrecircncias no entanto podem ser minimizadas comuma melhor educaccedilatildeo eleitoral ou como foi implementado na Austraacutelia requerer que osrankings incluam uma totalidade dos candidatos concorrentes

      24

      24 APPROVAL VOTING SYSTEM

      No meacutetodo Approval Voting os eleitores natildeo satildeo limitados pelo nuacutemero de candidatosem que podem votar por isso approval cada eleitor pode votar em todos os candidatos osquais ele aprova Apoacutes as votaccedilotildees o candidato com a maior quantidade de votos eacute eleitoSegundo Hamlin (2015) a cidade de Fargo na Dakota do Norte se tornou a primeiracidade nos EUA a colocar em praacutetica este sistema em suas eleiccedilotildees gerais em novembrode 2018 AVS tambeacutem eacute utilizado para eleger o secretaacuterio-geral das Naccedilotildees Unidas e emdiversas outras organizaccedilotildees

      241 Exemplo

      Na tabela 5 abaixo pode-se encontrar 8 perfis de eleitores com seus candidatos apro-vados e quantidade de eleitores que se encaixam no perfil Na tabela 6 temos o resultadoda contabilizaccedilatildeo dos votos destes perfis O candidato mais popular eacute o B que se encontraaprovado em 5 perfis distintos totalizando 60 votos ou aproximadamente 32

      Tabela 5 ndash Exemplo AVS

      Aprovaccedilotildees Ndeg de eleitoresA 20AB 16B 19

      BDC 6CAB 7CD 15DC 5DCB 12

      Tabela 6 ndash Resultado AVSCandidatos Total de votos

      A 43B 60C 45D 38

      242 Vantagens e Desvantagens do AVS

      Aleacutem de simples este meacutetodo permite um niacutevel maior de expressividade aos eleitoresOnde no FPTP e TRS eles satildeo limitados pelo seu uacutenico voto aqui os eleitores tecircm aliberdade de demonstrar exatamente quais candidatos consideram aptos ou aceitaacuteveis aocargo

      25

      Outro efeito dessa liberdade trazida pelo AVS eacute a dizimaccedilatildeo do spoiler effect Can-didatos de partidos menores natildeo tem como roubar votos de partidos maiores nessesistema ambos os candidatos contabilizariam o voto

      243 Voto Uacutetil no AVS

      O tipo de voto uacutetil no AVS eacute denominado bullet voting Segundo The Center forElection Science (2015) esta taacutetica envolve simplesmente ignorar a possibilidade de votarem mais de um candidato e votar apenas em sua primeira opccedilatildeo Um eleitor pode serlevado a adotar essa estrateacutegia quando percebe que sua preferecircncia pode ser prejudicadacom o voto em alguma segunda opccedilatildeo sua Em um cenaacuterio extremo onde 100 doseleitores adotam esta estrateacutegia as eleiccedilotildees satildeo convertidas a um simples First Past ThePost

      25 THE BORDA COUNT

      Este meacutetodo carrega o nome em homenagem a seu criador Jean-Charles de Bordaque o desenvolveu em 1770 (LIPPMAN 2012) A contagem de Borda utiliza a abordagemde ranqueamento dos candidatos poreacutem de maneira diferente ao IRV Este eacute um sistemaque atribui uma pontuaccedilatildeo aos candidatos com base nestes rankings O candidato na basedo ranking natildeo recebe pontos o candidato imediatamente acima deste recebe 1 pontoo proacuteximo recebe 2 pontos e assim por diante ateacute o topo do ranking As pontuaccedilotildees detodos os rankings satildeo contabilizadas e o candidato com maior pontuaccedilatildeo eacute eleito Deacordo com Lippman variaccedilotildees deste meacutetodo satildeo encontradas em uso na premiaccedilatildeo dediversos esportes como na seleccedilatildeo do MVP(Most Valuable Player) da MLB(principal ligade beisebol dos EUA) e no Trofeacuteu Heisman de futebol americano universitaacuterio

      251 Exemplo

      Neste exemplo seratildeo aproveitados os mesmos rankings apresentados na tabela 3 Porserem 4 candidatos o primeiro colocado de cada ranking receberaacute 3 pontos o segundo 2pontos o terceiro 1 e o quarto 0 Assim o nuacutemero maacuteximo de pontos que um candidatopode atingir eacute igual a 300(se ficar na primeira posiccedilatildeo em todos os rankings) e o nuacutemerototal de pontos no sistema eacute 600 O nuacutemero maacuteximo de pontos que um candidato podeatingir eacute calculado com

      (cminus 1)times e

      Sendo c igual ao nuacutemero de candidatos e e o nuacutemero de eleitores Por sua vez onuacutemero total de pontos no sistema eacute

      26

      (cminus 1)times c2

      times e

      A contagem final dos pontos eacute apresentada na tabela 7 abaixo

      Tabela 7 ndash Resultado BCCandidatos Total de pontos

      A 146B 181C 126D 147

      O candidato eleito eacute o B com 181 pontos ou aproximadamente 60 da pontuaccedilatildeomaacutexima

      252 Vantagens e Desvantagens do BC

      Em comparaccedilatildeo com os meacutetodos abordados anteriormente que apenas consideramas primeiras opccedilotildees de cada eleitor este meacutetodo regularmente escolhe candidatos comaceitaccedilatildeo mais ampla ao inveacutes de uma preferecircncia direta dos eleitores (Electoral ReformSociety 2017b)

      Ele tambeacutem encoraja uma abordagem estrateacutegica por parte dos partidos onde seriade seu interesse nomear mais de um candidato para concorrer pois quanto mais candi-datos estatildeo no paacutereo maior eacute a pontuaccedilatildeo dos primeiros colocados Logo a nomeaccedilatildeo decandidatos menos populares pode beneficiar os principais candidatos de um partido

      253 Voto Uacutetil no BC

      Existem duas estrateacutegias aplicaacuteveis a esse sistema A primeira denominada compromi-sing de maneira similar a outros meacutetodos de votaccedilatildeo se resume em ranquear em primeirolugar um dos candidatos que estejam liderando as eleiccedilotildees mesmo que este natildeo seja suapreferecircncia real A segunda estrateacutegia burying eacute o oposto esta se baseia em ranquearem uacuteltimo lugar um dos candidatos liacutederes mesmo que este natildeo seja o seu candidato demaior desgosto Ambas estrateacutegias podem ser aplicadas ao mesmo tempo por um eleitor

      26 SCORE VOTING SYSTEM

      Score Voting ou Range Voting como tambeacutem eacute conhecido eacute mais um meacutetodo quetenta trazer maior liberdade de expressatildeo aos eleitores Assim como o Borda Counteste sistema funciona baseado na pontuaccedilatildeo dos candidatos no entanto ao inveacutes dessapontuaccedilatildeo ser relativa agrave posiccedilatildeo do candidato no ranking de cada eleitor este por sua veztem completa liberdade de atribuir qualquer quantidade de pontos aos candidatos dentro

      27

      de determinada escala Um eleitor pode dar o mesmo nuacutemero de pontos para diferentescandidatos e apoacutes o somatoacuterio de todas as pontuaccedilotildees o candidato com a pontuaccedilatildeo maisalta eacute eleito Incorporado ao escopo poliacutetico o SVS eacute utilizado no Partido Pirata Alematildeobem como em diversas organizaccedilotildees tais como o Fedora Project e Mozilla e tambeacutem emvariados esportes oliacutempicos e reality shows como o American Idol aponta Hamlin (2015)

      261 Exemplo

      Neste exemplo temos apresentados na tabela 8 abaixo 4 perfis distintos de eleitorese suas respectivas atribuiccedilotildees de pontos aos 4 candidatos Cada eleitor pode atribuirqualquer pontuaccedilatildeo a um candidato dentro da escala de -10 a 10 O resultado da eleiccedilatildeoapoacutes a soma de todos os pontos por candidato se encontra na tabela 9 onde o candidatoA eacute eleito com um total de 605 pontos

      Tabela 8 ndash Exemplo SVS

      Perfil A B C D Ndeg de eleitores1 10 -1 5 2 362 6 9 -3 4 253 2 0 8 4 224 3 3 3 10 17

      Tabela 9 ndash Resultado SVSCandidatos Total de pontos

      A 605B 240C 332D 430

      262 Vantagens e Desvantagens do SVS

      A grande vantagem do SVS eacute como ele proporciona aos eleitores expressar de maneiramuito proacutexima potencialmente exata suas impressotildees poliacuteticas de cada candidato Eleeacute ainda mais expressivo que o AVS Dessa maneira o spoiler effect tambeacutem se torna nuloao passo que toda intenccedilatildeo de voto eacute precisamente representada neste sistema

      Assim como outros meacutetodos eleitorais este sofre igualmente dos males produzidos pelovoto taacutetico Sua principal desvantagem eacute discutida na seccedilatildeo abaixo

      263 Voto Uacutetil no SVS

      Da mesma maneira que no Approval Voting atraveacutes do bullet voting o SVS tambeacutempode ser convertido em uma eleiccedilatildeo sob o meacutetodo FPTP em um cenaacuterio com um grande

      28

      volume de eleitores maliciosos O voto uacutetil sob este sistema se manifesta pontuando-seapenas um candidato com uma nota positiva e todos os outros com as notas mais baixasda escala Se todos os eleitores se aproveitarem dessa abordagem natildeo existiraacute distinccedilatildeoefetiva entre uma eleiccedilatildeo sob SVS e FPTP Essencialmente cada eleitor estaacute votando emapenas um candidato Essa eacute a principal desvantagem do SVS e ela consegue eliminarsua principal vantagem dar ao eleitor um poder maior de expressatildeo

      27 BLOC VOTE

      O Bloc Vote eacute um meacutetodo utilizado para a eleiccedilatildeo de candidatos a cargos no governocom mais de uma vacacircncia Pode ser considerado um meio-termo entre o FPTP e oAVS pois os eleitores podem votar em mais de um candidato poreacutem satildeo limitados pelonuacutemero de vagas Em uma eleiccedilatildeo com duas vagas por exemplo cada eleitor selecionaraacutedois candidatos ou menos Sensatamente o candidato mais votado eacute eleito Ele possuialgumas utilizaccedilotildees em eleiccedilotildees locais em algumas partes da Inglaterra (Electoral ReformSociety 2017a)

      271 Exemplo

      Neste exemplo dois candidatos seratildeo eleitos logo cada eleitor votaraacute em no maacuteximodois candidatos A distribuiccedilatildeo de votos pode ser conferida na tabela 10 e o resultado dacontagem de votos na tabela 11 abaixo Os candidatos eleitos satildeo o C totalizando 78do maacuteximo de votos possiacuteveis para um candidato e o A com 43

      Tabela 10 ndash Exemplo BV

      Aprovaccedilotildees Ndeg de eleitoresAC 20AB 16BC 19BD 6CA 7CD 15DC 17

      Tabela 11 ndash Resultado BVCandidatos Total de votos

      A 43B 41C 78D 38

      29

      272 Voto Uacutetil no BV

      Neste sistema eacute possiacutevel que um eleitor evite votar em sua primeira opccedilatildeo quandoeste natildeo tem chances de vitoacuteria e se fazendo isto ele diminuiraacute as chances de algum outrocandidato de seu desgosto ganhar Poreacutem o sistema previne um outro tipo de voto uacutetilEm eleiccedilotildees com mais de uma vaga onde os eleitores soacute podem votar em um candidatose um eleitor sabe que sua primeira opccedilatildeo tambeacutem eacute a primeira opccedilatildeo da maior parteda populaccedilatildeo e portanto muito provavelmente seraacute um dos candidatos eleitos eacute possiacutevelque ele arrisque votar em uma segunda opccedilatildeo sua na esperanccedila de a longo prazo elegersuas duas principais opccedilotildees de voto Com os eleitores podendo votar no nuacutemero exato devagas disponiacuteveis esse tipo de pensamento taacutetico perde o sentido

      30

      3 O SIMULADOR

      Para este trabalho foi implementado um simulador eleitoral na forma de uma aplicaccedilatildeoweb para que a interaccedilatildeo do usuaacuterio fosse facilitada Veremos a seguir como se daacute suautilizaccedilatildeo de forma geral

      Figura 2 ndash Captura de tela 1

      Figura 3 ndash Captura de tela 2

      A primeira opccedilatildeo encontrada pelo usuaacuterio eacute a escolha de quais sistemas de votaccedilatildeo se-ratildeo simulados (Figura 2) Todos eles podem ser selecionados para rodar simultaneamentePoreacutem natildeo eacute permitido rodar uma simulaccedilatildeo do Bloc Vote para uma eleiccedilatildeo onde apenasum candidato eacute eleito aleacutem disso natildeo existe implementaccedilatildeo dos meacutetodos TRS e IRV para

      31

      eleiccedilotildees com mais de um candidato eleito jaacute que eles se comportariam exatamente comono FPTP

      A maioria das linguagens de programaccedilatildeo senatildeo todas possuem um gerador de nuacuteme-ros pseudoaleatoacuterios que fornece a possibilidade de definir uma seed para o gerador Estaseed funciona como um ponto de partida para a geraccedilatildeo dos nuacutemero e portanto todasimulaccedilatildeo que rodar com a mesma seed sempre teraacute os mesmos resultados Se nenhumvalor for fornecido pelo usuaacuterio o tempo atual do sistema eacute utilizado As opccedilotildees subse-quentes satildeo a escolha do nuacutemero de eleitores gerados e o nuacutemero de vagas (Figura 3) Senenhum valor for fornecido o nuacutemero de eleitores padratildeo utilizado eacute 1000 e o nuacutemero devagas igual a 1

      Figura 4 ndash Captura de tela 3

      Este simulador possui dois modos para a criaccedilatildeo dos rankings dos eleitores No modoManipulate (Figura 4) primeiramente se define o nuacutemero de candidatos atraveacutes do campode entrada ao lado do tiacutetulo Candidates ou alternativamente pode-se adicionar candida-tos um a um atraveacutes do sinal de mais na parte inferior da paacutegina Para cada candidatoeacute possiacutevel definir a porcentagem de seus eleitores que optaraacute pelo voto taacutetico e pelovoto de minoria Tambeacutem eacute possiacutevel alterar o nome dos candidatos se for do interessedo usuaacuterio

      32

      Figura 5 ndash Captura de tela 4

      Figura 6 ndash Captura de tela 5

      33

      Figura 7 ndash Captura de tela 6

      Apoacutes a criaccedilatildeo dos candidatos o usuaacuterio pode criar perfis de eleitores que definiratildeo demaneira exata como partes da populaccedilatildeo iraacute votar (Figura 5) Em cada perfil se defineo valor em porcentos da populaccedilatildeo votante que o adotaraacute e a nota de cada candidatoTambeacutem eacute possiacutevel nomear cada perfil livremente

      No modo Generate (Figura 6) eacute onde o gerador de nuacutemeros pseudoaleatoacuterios eacute usadoNesse modo ao inveacutes do usuaacuterio criar perfis de eleitores ele define qual seraacute a distribuiccedilatildeoadotada para a geraccedilatildeo de notas de cada candidato Essas distribuiccedilotildees seratildeo mais bemdetalhadas no Capiacutetulo 5 Da mesma maneira que no modo Manipulate nesse modotambeacutem eacute possiacutevel definir os valores para os dois tipos de voto uacutetil os votos taacuteticos eos votos de minoria No primeiro estatildeo incluiacutedas as estrateacutegias de mudanccedila de votoespeciacuteficas de cada sistema como o bullet voting no AVS e SVS ou quando a preferecircnciade um eleitor claramente natildeo possui chances de vitoacuteria e ele muda seu voto para um doscandidatos que esteja na lideranccedila o que ocorre no FPTP e TRS O voto de minoriase apresenta apenas no FPTP em eleiccedilotildees onde mais de um candidato eacute eleito Se apreferecircncia de um eleitor claramente lidera a eleiccedilatildeo por ser tambeacutem a preferecircncia damaior parte da populaccedilatildeo esse eleitor pode mudar o seu voto para uma segunda opccedilatildeona esperanccedila de eleger dois de seus candidatos favoritos

      Por fim em ambos os modos o usuaacuterio tem a opccedilatildeo de definir coalizotildees entre oscandidatos se o sistema TRS estiver habilitado pois as coalizotildees apenas se manifestamnesse sistema Essas coalizotildees alteraratildeo as notas dos candidatos dependendo dos outroscandidatos pertencentes a elas (Figura 7)

      A aplicaccedilatildeo pode ser encontrada na paacutegina httpelectionsimpythonanywherecom

      34

      4 CENAacuteRIOS PERTINENTES

      Para todos os cenaacuterios deste capiacutetulo seraacute usada a seed do simulador igual a 100 e apopulaccedilatildeo de eleitores igual a 1000 para que exista consistecircncia na anaacutelise e tambeacutem paraque possa haver replicaccedilatildeo dos resultados se necessaacuterio

      41 CENAacuteRIO 1 VOTO TAacuteTICO

      Neste exemplo teremos quatro candidatos Ana Beto Carla e Diego Ana e Betoseratildeo gerados a partir da distribuiccedilatildeo Neutral (Figura 47) Carla da distribuiccedilatildeo Disliked(Figura 51) e Diego da Hated (Figura 55) Para a simulaccedilatildeo com a seed 100 o melhorcandidato a ser eleito ou seja aquele que maximiza a meacutedia das notas dos eleitores eacute oBeto com uma meacutedia de 0073 Para cada sistema seratildeo comparados os resultados semvoto taacutetico aos com 20 de voto taacutetico a favor da Ana Abaixo se encontram osresultados para o sistema FPTP

      Figura 8 ndash FPTP - Cenaacuterio 1 sem voto taacutetico

      Figura 9 ndash TRS segundo turno - Cenaacuterio 1 sem voto taacutetico

      35

      Figura 10 ndash IRV primeiro turno - Cenaacuterio 1

      Figura 11 ndash IRV segundo turno - Cenaacuterio 1

      Figura 12 ndash IRV terceiro turno - Cenaacuterio 1

      36

      Figura 13 ndash AVS - Cenaacuterio 1 sem voto taacutetico

      Figura 14 ndash BC - Cenaacuterio 1 sem voto taacutetico

      Figura 15 ndash SVS - Cenaacuterio 1 sem voto taacutetico

      37

      Nesse cenaacuterio sem voto taacutetico o uacutenico sistema que natildeo elege o Beto eacute o AVS Todosos outros elegem o melhor candidato Ou seja apesar de Beto ter uma melhor meacutediadas notas dos eleitores existem mais eleitores que ranqueiam Ana com uma nota acimade 0 No entanto apenas 20 dos eleitores de Diego e Carla que preferem a Ana aoinveacutes do Beto satildeo o suficiente para fazer Beto natildeo ser eleito se eles decidirem abandonarsua primeira opccedilatildeo e votar na Ana Considerando a vantagem que os votos taacuteticosproporcionam agrave Ana esta eacute eleita em todos os sistemas menos o TRS e o IRV

      Figura 16 ndash FPTP - Cenaacuterio 1 - 20 de voto taacutetico na Ana

      Figura 17 ndash TRS segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

      38

      Figura 18 ndash IRV primeiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

      Figura 19 ndash IRV segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

      Figura 20 ndash IRV terceiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

      39

      Figura 21 ndash AVS - Cenaacuterio 1 20 de voto taacutetico na Ana

      Figura 22 ndash BC - Cenaacuterio 1 20 de voto taacutetico na Ana

      Figura 23 ndash SVS - Cenaacuterio 1 20 de voto taacutetico na Ana

      40

      Eacute claro que se os eleitores que preferem o Beto tambeacutem votassem de maneira estra-teacutegica a situaccedilatildeo se equilibraria e haveria o mesmo niacutevel de concorrecircncia entre os doiscandidatos que ocorre quando natildeo haacute voto taacutetico Poreacutem no Borda Count esse equiliacute-brio pode natildeo acontecer e as estrateacutegias de compromising e burying podem acabar saindopela culatra se uma porcentagem elevada dos eleitores as adotarem Abaixo encontram-seos resultados para esse sistema quando 100 dos eleitores de Carla e Diego se comportammaliciosamente

      Figura 24 ndash BC - Cenaacuterio 1 100 de voto taacutetico na Ana e Beto

      Por causa do uso demasiado da estrateacutegia burying Ana e Beto perdem muitos pontose isso abre espaccedilo para uma vitoacuteria da Carla No entanto para porcentagens menores que100 o Beto ainda eacute o vencedor

      Essas duas estrateacutegias tambeacutem foram implementadas nesse simulador para o sistemaIRV e eacute possiacutevel ver como ele eacute resistente a elas Para que seja possiacutevel mudar os resultadosde uma eleiccedilatildeo sob o IRV eacute necessaacuterio mudar a ordem de eliminaccedilatildeo dos candidatos paraque o seu candidato preferido acabe enfrentando um candidato mais fraco nas rodadasfinais Isso natildeo ocorre com compromising e burying No proacuteximo cenaacuterio seraacute analisadacomo eacute possiacutevel modificar os resultados de uma eleiccedilatildeo sob o IRV

      Esses resultados podem ser replicados acessando os linksSem votos taacuteticos lthttpelectionsimpythonanywherecomdirect_res1111110

      --[0021][22Ana2222Beto222022Carla2222Diego22]------100gt

      Com 20 de voto taacutetico lthttpelectionsimpythonanywherecomdirect_res1111110--[0021][22Ana222022Beto2222Carla2222Diego22]1-[02000]---100gt

      Com 100 de voto taacuteticona Ana e Beto lthttpelectionsimpythonanywherecomdirect_res0000100--[0021][22Ana222022Beto222022Carla2222Diego22]1-[101000]---100gt

      41

      42 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV

      Neste cenaacuterio teremos Ana Carla e Beto concorrendo e trecircs perfis distintos que apoiamcada candidato As distribuiccedilotildees de notas dos perfis se encontram na tabela abaixo

      Tabela 12 ndash Distribuiccedilatildeo de notas - Cenaacuterio 2

      Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

      deeleitores

      1 10 5 0 422 0 10 5 303 5 0 10 28

      Com essas distribuiccedilotildees Carla eacute eliminada na primeira rodada e seus 28 de votossatildeo transferidos para a segunda opccedilatildeo de seus eleitores Ana que eacute eleita com 70 dosvotos e uma meacutedia de 56

      Figura 25 ndash IRV primeiro turno - Cenaacuterio 2

      Figura 26 ndash IRV segundo turno - Cenaacuterio 2

      42

      Cientes desse provaacutevel futuro cenaacuterio onde Ana eacute eleita uma pequena parte dos elei-tores de Beto estrategicamente o abandona e decide apoiar Carla na esperanccedila de leva-laao segundo turno contra Ana As novas distribuiccedilotildees de notas se encontram na tabelaabaixo com essa porccedilatildeo de eleitores representada pelo perfil 4

      Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2

      Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

      deeleitores

      1 10 5 0 422 0 10 5 283 5 0 10 284 0 8 10 2

      Essa mudanccedila estrateacutegica de voto altera a ordem de eliminaccedilotildees do sistema com Betosendo o primeiro a ser eliminado Com isso seus votos satildeo naturalmente transferidos paraCarla que derrota Ana no segundo turno com 58 dos votos

      Figura 27 ndash IRV primeiro turno com voto taacutetico - Cenaacuterio 2

      Figura 28 ndash IRV segundo turno com voto taacutetico - Cenaacuterio 2

      43

      Percebendo que a eleiccedilatildeo de Beto natildeo era provaacutevel seus eleitores conseguiram aomenos impedir a eleiccedilatildeo do pior candidato para eles Mas para isso foi necessaacuterio queeles tivessem a informaccedilatildeo de como os outros eleitores votariam Uma aproximaccedilatildeo dessasinformaccedilotildees poderia ser obtida em um cenaacuterio real com poucos candidatos atraveacutes depesquisas eleitorais poreacutem se o nuacutemero de candidatos eacute significativo uma noccedilatildeo completadas distribuiccedilotildees dos rankings dos eleitores se torna muito menos viaacutevel e dificulta aformulaccedilatildeo de estrateacutegias para alterar a ordem em que os candidatos satildeo eliminados

      Esses resultados podem ser replicados acessando os linksSem voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana22

      22Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

      Com voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana

      2222Beto2222Carla22]-----42Voter20Profile2001020520028Voter20Profile2010201020528Voter20Profile202520020102Voter20Profile20302082010100gt

      43 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE

      O interessante dos sistemas IRV e TRS eacute que os resultados do cenaacuterio anterior po-deriam ter sido obtidos ao inveacutes do voto taacutetico pela sua natildeo-monotonicidade Seriapossiacutevel que a Carla derrotasse a Ana no segundo turno atraveacutes do proacuteprio aumento depopularidade da Ana Assumindo que essa popularizaccedilatildeo ocorresse entre os candidatosdo perfil 2 onde 3 passasse a apoiar a Ana ao inveacutes do Beto as novas distribuiccedilotildeesseguiriam a tabela abaixo

      Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

      Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

      deeleitores

      1 10 5 0 452 0 10 5 273 5 0 10 28

      Dessa maneira Beto agora com uma porcentagem dos eleitores menor do que a deCarla seraacute eliminado na primeira rodada e como seus eleitores tecircm a Carla como segundaopccedilatildeo ela receberaacute todos os seus votos e seraacute eleita na segunda rodada As rodadas doIRV podem ser vistas nas figuras 29 e 30

      44

      Figura 29 ndash IRV primeiro turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

      Figura 30 ndash IRV segundo turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

      Tabela 15 ndash Resultados do Cenaacuterio 3Candidato

      eleitoMeacutedia das

      notasAntes da

      popularizaccedilatildeode Ana

      Ana 56

      Apoacutespopularizaccedilatildeo

      de AnaCarla 415

      Os efeitos dessa caracteriacutestica se refletem na satisfaccedilatildeo meacutedia da populaccedilatildeo A Ana eacuteclaramente a melhor candidata e mesmo com o seu ganho de popularidade (ou devido aele) a Carla eacute eleita

      Esses resultados podem ser replicados acessando os linksAntes da popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecom

      direct_res0010000---[22Ana2222Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

      45

      Apoacutes popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana2222Beto2222Carla22]-----45Voter20Profile2001020520027Voter20Profile2010201020528Voter20Profile20252002010100gt

      44 CENAacuteRIO 4 COALIZOtildeES

      O TRS por ser organizado em dois turnos separados normalmente a semanas dedistacircncia um do outro acaba abrindo brecha agrave mudanccedila de opiniatildeo por parte dos eleitorese o desenvolvimento de novas estrateacutegias por parte dos candidatos tais como a coalizatildeocom candidatos jaacute eliminados Com isso em mente nesse cenaacuterio teremos novamenteos quatro candidatos Ana Beto Carla e Diego Os trecircs primeiros seratildeo gerados dadistribuiccedilatildeo Neutral e Diego da distribuiccedilatildeo Disliked

      Figura 31 ndash TRS turno 1 - Cenaacuterio 4

      No TRS normal Ana Beto e Carla possuem com essas distribuiccedilotildees quantidades devotos muito proacuteximas com Beto e Carla indo para o segundo turno Carla estaacute 10 votosatraacutes de Beto e decide aproveitar o espaccedilo de tempo entre os dois turnos para tentaragregar mais votos Com isso Carla se aproxima de Diego e juntos formam uma coalizatildeoNo entanto com sua baixa popularidade Diego acaba ferindo a reputaccedilatildeo de Carla etorna o segundo turno muito mais faacutecil para Beto (Figura 33) Se Carla tivesse buscado osuporte de Ana por outro lado ela se veria vitoriosa no segundo turno e com uma amplavantagem sobre o Beto (Figura 34) Ou ateacute mesmo sem buscar uma coalizatildeo mesmosendo uma corrida apertada Carla teria naturalmente sido eleita (Figura 32)

      Esses resultados podem ser replicados acessando os linksSem coalizotildees lthttpelectionsimpythonanywherecomdirect_res0100000

      --[0002][22Ana222022Beto2222Carla2222Diego22]------100gt

      46

      Figura 32 ndash TRS turno 2 - Cenaacuterio 4

      Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4

      Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4

      47

      Coalizatildeo Carla e Diego lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2203Carla20Diego-100gt

      Coalizatildeo Carla e Ana lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2200Carla20Ana-100gt

      45 CENAacuteRIO 5 DILEMA DO PRISIONEIRO

      Neste cenaacuterio temos uma eleiccedilatildeo de uma vaga com trecircs candidatos concorrentes e trecircsperfis distintos de eleitores que seguiratildeo as seguintes distribuiccedilotildees

      Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5

      Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

      deeleitores

      1 10 -10 5 362 -10 10 5 343 -10 -10 5 30

      Esse contexto nos remete ao notaacutevel dilema do prisioneiro Nele dois prisioneiroscuacutemplices satildeo interrogados individualmente sem poder se comunicar um com o outro ecada um enfrenta o dilema de delatar ou natildeo o seu parceiro Se os dois prisioneirosdecidem se manter calados sobre o crime ambos satildeo sentenciados a um ano de prisatildeo Seapenas um deles dedurar o outro o traidor sai livre enquanto seu parceiro eacute condenadoa trecircs anos Se ambos dedurarem um ao outro eles satildeo condenados juntos a dois anosde prisatildeo Esse dilema eacute uma ideia claacutessica presente no estudo da teoria dos jogos sendooriginalmente elaborada por Merrill Flood e Melvin Dresher em 1950 e mais tarde sendonomeada de dilema dos prisioneiros por Albert W Tucker (POUNDSTONE 1992)

      O que esse dilema nos mostra eacute a tentaccedilatildeo que o indiviacuteduo deteacutem se sua racionalizaccedilatildeoestiver voltada para seus proacuteprios interesses e somente eles em oposiccedilatildeo a pensar no bemdo grupo como um todo Neste cenaacuterio encontramos dois grupos de eleitores expressiva-mente opostos os perfis 1 e 2 Se qualquer uma das preferecircncias desses perfis fosse eleitaisso significaria uma alta rejeiccedilatildeo de maior parte da populaccedilatildeo No entanto eles possuema segunda opccedilatildeo em comum a Carla que por sua vez eacute a preferecircncia do terceiro perfilPortanto a eleiccedilatildeo da Carla seria logicamente o resultado oacutetimo

      Mesmo assim a Ana eacute eleita nos dois sistemas acima o que natildeo parece justo poispela tabela 16 eacute evidente que apenas 36 da populaccedilatildeo a aprova enquanto que os outros64 a reprovam ao maacuteximo O sistema IRV se comporta de maneira idecircntica ao TRS

      48

      Figura 35 ndash FPTP - Cenaacuterio 5

      Figura 36 ndash TRS segundo turno - Cenaacuterio 5

      nesta situaccedilatildeo Com esse resultado a meacutedia das notas eacute -28 No entanto os trecircs sistemasseguintes nos apresentam resultados diferentes

      Tabela 17 ndash Resultados do Cenaacuterio 5

      Sistema Candidatoeleito

      Meacutedia dasnotas

      FPTP Ana -28TRS Ana -28IRV Ana -28AVS Carla 50BC Carla 50SVS Carla 50

      49

      Figura 37 ndash AVS - Cenaacuterio 5

      Figura 38 ndash BC - Cenaacuterio 5

      Tanto o AVS quanto o Borda Count e o SVS satildeo sistemas que consideram todasas opiniotildees de cada eleitor ao mesmo tempo e por isso satildeo capazes de eleger o melhorcandidato nesta situaccedilatildeo diferentemente do TRS que natildeo absorve completamente todosentimento do eleitor por todos os candidatos e o IRV que apesar de ser bem expressivoquebra esse processo em inuacutemeras rodadas o que permite a perda de informaccedilatildeo ao longodelas

      Esses resultados podem ser replicados acessando o linklthttpelectionsimpythonanywherecomdirect_res1111110---[22Ana

      222022Beto222022Carla22]-----36Voter20Profile2001020-1020534Voter20Profile201-10201020530Voter20Profile202-1020-10205100gt

      50

      Figura 39 ndash SVS - Cenaacuterio 5

      46 CENAacuteRIO 6 VOTO DE MINORIA

      Neste cenaacuterio temos uma eleiccedilatildeo com quatro candidatos e duas vagas A Ana seraacutea preferecircncia de uma extensa parte da populaccedilatildeo (distribuiccedilatildeo Loved Figura 53) Betoe Carla seratildeo candidatos razoavelmente populares (distribuiccedilatildeo Neutral Figura 47) eDiego seraacute a preferecircncia de apenas um pequeno grupo especiacutefico e rejeitado pela maioria(distribuiccedilatildeo Disliked Figura 51) Eacute intuitivo esperar que os dois candidatos eleitos seratildeoa Ana e ou o Beto ou a Carla e isso eacute exatamente o que ocorre na figura 40 no sistemaFPTP sem voto de minoria

      Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria

      Eacute evidente a discrepacircncia da quantidade de votos da Ana para os outros candidatose apesar de Beto e Carla serem mais populares que Diego os trecircs natildeo se encontrammuito afastados Poreacutem se a pequena fraccedilatildeo de candidatos que possuem a Ana como

      51

      Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego

      preferecircncia e Diego como segunda opccedilatildeo optarem pelo voto de minoria a situaccedilatildeo mudacompletamente (Figura 41) Assim apesar de extensamente rejeitado Diego conquistaa segunda vaga e a meacutedia das notas despenca de 2929 para 0505 No entanto aindaexiste um cenaacuterio pior Se os outros grupos de eleitores pensarem da mesma forma eevitarem votar na Ana achando que sua eleiccedilatildeo jaacute estaacute assegurada apenas 80 de votode minoria para esses grupos jaacute eacute o suficiente para eliminaacute-la das eleiccedilotildees (Figura 42)Com a Ana eliminada a meacutedia das notas cai ainda mais para 0058

      Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego

      O sistema Bloc Vote eacute uma das soluccedilotildees para o voto de minoria Permitindo queos eleitores votem no mesmo nuacutemero de candidatos que de vagas a serem preenchidasnatildeo existe o iacutempeto a esse tipo de voto estrateacutegico O resultado desse sistema portantoretorna a meacutedia das notas a casa dos 29 (Figura 43) Os sistemas AVS Borda Count eSVS tambeacutem impedem a presenccedila do voto de minoria e atingem resultados semelhantes

      52

      Figura 43 ndash BV - Cenaacuterio 6

      Tabela 18 ndash Resultados do Cenaacuterio 6

      Sistema Candidatoseleitos

      Meacutedia dasnotas

      FPTP sem voto de minoriaAna eBeto 2929

      FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

      FPTP com 80 de voto de minoriaBeto eCarla 0058

      Bloc VoteAna eCarla 2913

      Esses resultados podem ser replicados acessando os links

      Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

      100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

      80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

      53

      5 COMO FUNCIONA O SIMULADOR

      O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

      51 CLASSE ELECTIONS

      Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

      bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

      Figura 44 ndash estrutura candidates

      bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

      bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

      Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

      Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

      54

      Figura 45 ndash estrutura voters

      Figura 46 ndash estrutura votes

      daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

      Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

      55

      Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

      Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

      na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

      56

      Figura 49 ndash PDF - Distribuiccedilatildeo Liked

      Figura 50 ndash CDF - Distribuiccedilatildeo Liked

      (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

      Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

      57

      Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

      Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

      candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

      Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

      58

      Figura 53 ndash PDF - Distribuiccedilatildeo Loved

      Figura 54 ndash CDF - Distribuiccedilatildeo Loved

      funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

      59

      Figura 55 ndash PDF - Distribuiccedilatildeo Hated

      Figura 56 ndash CDF - Distribuiccedilatildeo Hated

      Meacutedia das Notas sumei

      sumvj nij

      etimes v

      Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

      Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

      60

      Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

      Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

      52 CLASSE FIRSTPASTTHEPOST

      Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

      Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

      61

      Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

      Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

      mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

      62

      53 CLASSE TWOROUNDSYSTEM

      A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

      54 CLASSE INSTANTRUNOFFVOTING

      A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

      Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

      63

      cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

      55 CLASSE APPROVALVOTING

      Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

      56 CLASSE BORDACOUNT

      Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

      57 CLASSE SCOREVOTING

      De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

      64

      58 CLASSE BLOCVOTE

      O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

      59 TECNOLOGIAS UTILIZADAS

      A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

      Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

      O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

      Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

      65

      6 CONCLUSAtildeO

      Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

      Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

      Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

      Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

      Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

      66

      REFEREcircNCIAS

      AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

      Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

      Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

      Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

      HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

      LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

      ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

      Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

      POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

      The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

      67

      APEcircNDICES

      APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

      Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

      if(not len(selfvoter_profiles))

      for voter in range(selfN_VOTERS)

      candidates_rank = dict()

      for candidate in reversed(range(selfN_CANDIDATES))

      if(selfBIAS_VECTOR[candidate]==4)

      candidates_rank[candidate] = self_sortear(selfloved)

      elif(selfBIAS_VECTOR[candidate]==3)

      candidates_rank[candidate] = self_sortear(selfliked)

      elif(selfBIAS_VECTOR[candidate]==2)

      candidates_rank[candidate] = self_sortear(selfdisliked)

      elif(selfBIAS_VECTOR[candidate]==1)

      candidates_rank[candidate] = self_sortear(selfhated)

      elif(selfBIAS_VECTOR[candidate]==-1)

      candidates_rank[candidate] = self_sortear(selfpolarizer

      )

      elif(selfBIAS_VECTOR[candidate]==-2)

      candidates_rank[candidate] = self_sortear(self

      more_polarizer)

      else

      candidates_rank[candidate] = self_sortear(selfneutral)

      selfvotersappend(candidates_rank)

      else

      ranges = []

      ranks = []

      for prof in selfvoter_profiles

      rangesappend(int(prof[pop_percentage]))

      rank =

      for index score in enumerate(prof[scores])

      rank[index] = score

      ranksappend(rank)

      for index _range in enumerate(ranges)

      for _ in range(int(selfN_VOTERS(_range100)))

      selfvotersappend(ranks[index])

      68

      APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

      Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

      for i in range(selfN_CANDIDATES)

      selfcandidates[i] = 0

      selfvotes[i] = set()

      APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

      Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

      for candidate in range(selfN_CANDIDATES)

      rating_sum = 0

      for voter in selfvoters

      rating_sum += voter[candidate]

      selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

      APEcircNDICE D ndash MEacuteTODO GET_MEAN

      Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

      if len(winners) gt 1 or selfN_CANDIDATES gt 10

      return selfcalculate_mean(winners)

      else

      chose_best = True if winners[0] == selfbest_candidate else

      False

      return selfstats[rsquomeansrsquo][winners[0]] chose_best

      69

      APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

      Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

      rating_sum = 0

      for voter in selfvoters

      for candidate in winners

      rating_sum += voter[candidate]

      return rating_sum(selfN_VOTERSselfN_VACANCIES) False

      APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

      Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

      for i in range(1 selfN_VACANCIES + 2)

      selfleading_candidatesappend(selfsorted_candidates[-i][self

      CANDIDATE_INDEX])

      APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

      Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

      for leader in selfelecrounds[-1]

      selfleading_candidatesappend(leader[0])

      70

      APEcircNDICE H ndash MEacuteTODO SORT_RANKS

      Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

      self_account_for_coalitions()

      for voter in selfvoters

      selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

      (1)))

      temp = []

      for voter in selfsorted_voters

      new_dict = defaultdict(list)

      for k in voter

      new_dict[k[1]]append(k[0])

      tempappend(new_dict)

      selfsorted_voters = []

      for voter_index current_voter in enumerate(temp)

      new_voter = []

      for rating candidate_indexes in current_voteritems()

      if len(current_voter[rating]) gt 1

      shuffle(current_voter[rating])

      for e in candidate_indexes

      new_voterappend((e rating))

      else

      new_voterappend((candidate_indexes[0] rating))

      selfsorted_votersappend(new_voter)

      selfcandidates[new_voter[-1][0]] += 1

      selfvotes[new_voter[-1][0]]add(voter_index)

      71

      APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

      Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

      for candidate in selfvotes_copy

      if candidate not in selfelecleading_candidates

      for voter_index in selfvotes_copy[candidate]

      for index _candidate in enumerate(reversed(selfelec

      sorted_voters[voter_index]))

      if _candidate[selfelecCANDIDATE_INDEX] in selfelec

      leading_candidates

      if randomrandom() lt selfelec

      tactical_vote_percentages[_candidate[selfelec

      CANDIDATE_INDEX]]

      selfrankings_changed[voter_index] = copy

      deepcopy(selfelecsorted_voters[voter_index])

      selfrankings_changed[voter_index][-(index + 1)]

      selfrankings_changed[voter_index][-1] = self

      rankings_changed[voter_index][-1] self

      rankings_changed[voter_index][-(index + 1)]

      selfcandidates[candidate] -= 1

      selfcandidates[_candidate[selfelec

      CANDIDATE_INDEX]] += 1

      selfvotes[candidate]remove(voter_index)

      selfvotes[_candidate[selfelecCANDIDATE_INDEX

      ]]add(voter_index)

      break

      break

      72

      APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

      Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

      half_vacancies = mathfloor(selfelecN_VACANCIES2)

      for candidate in selfelecleading_candidates

      if selfelecleading_candidatesindex(candidate) gt= half_vacancies

      continue

      for voter_index in selfvotes_copy[candidate]

      if voter_index in selfrankings_changed

      ranking = selfrankings_changed[voter_index]

      else

      ranking = copydeepcopy(selfelecsorted_voters[voter_index

      ])

      for index _candidate in enumerate(reversed(ranking))

      if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

      leading_candidates or (_candidate[selfelec

      CANDIDATE_INDEX] in selfelecleading_candidates and

      selfelecleading_candidatesindex(_candidate[selfelec

      CANDIDATE_INDEX]) gt= half_vacancies)

      if _candidate[selfelecCANDIDATE_RANK] gt= 0

      if randomrandom() lt selfelec

      minority_vote_percentages[_candidate[selfelec

      CANDIDATE_INDEX]]

      selfcandidates[candidate] -= 1

      selfcandidates[_candidate[selfelec

      CANDIDATE_INDEX]] += 1

      break

      break

      break

      73

      APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

      Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

      self_account_for_coalitions()

      for candidate in selfvotes

      if candidate = selfwinner and candidate = selfsecond_place

      for voter_index in selfvotes[candidate]

      if voter_index in selfrankings_changed

      ranking = selfrankings_changed[voter_index]

      else

      ranking = copydeepcopy(selfelecsorted_voters[

      voter_index])

      for index2 candidate in enumerate(reversed(ranking))

      if candidate[selfelecCANDIDATE_INDEX] == selfwinner

      selfcandidates[selfwinner] += 1

      selfvotes[selfwinner]add(voter_index)

      break

      elif candidate[selfelecCANDIDATE_INDEX] == self

      second_place

      selfcandidates[selfsecond_place] += 1

      selfvotes[selfsecond_place]add(voter_index)

      break

      selfsorted_candidates = selfelecsort_candidates(selfcandidates)

      winners = []

      vacancies = selfelecN_VACANCIES

      for candidate in reversed(selfsorted_candidates)

      if vacancies == 0

      break

      winnersappend(candidate[0])

      vacancies -= 1

      mean chose_best = selfelecget_mean(winners = winners)

      74

      APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

      Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

      for voter_index voter in enumerate(selfelecsorted_voters)

      voter_dict = dict()

      og_voter_dict = dict()

      for tup in voter

      voter_dict[tup[0]] = tup[1]

      og_voter_dict[tup[0]] = tup[1]

      for coalition in selfeleccoalitions

      for candidate in coalition

      add_to_score = 0

      for candidate2 in coalition

      if candidate == candidate2

      continue

      half = og_voter_dict[candidate2[rsquovaluersquo]]2

      if half lt 0

      add_to_score += mathceil(half)

      else

      add_to_score += mathfloor(half)

      if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

      voter_dict[candidate[rsquovaluersquo]] = 10

      elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

      voter_dict[candidate[rsquovaluersquo]] = -10

      else

      voter_dict[candidate[rsquovaluersquo]] += add_to_score

      selfrankings_changed[voter_index] = []

      for candidate in voter_dict

      selfrankings_changed[voter_index]append((candidate voter_dict[

      candidate]))

      selfrankings_changed[voter_index] = sorted(selfrankings_changed[

      voter_index] key=lambda x x[1])

      75

      APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

      Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

      selfelecroundsappend(selfsorted_candidates[_round])

      if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

      N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

      N_VACANCIES - 1)

      return 2

      elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

      N_VOTERS gt 05)

      return 1

      else

      selfelecexcludedadd(selfsorted_candidates[_round][selfelec

      CANDIDATE_INDEX])

      for voter_index in selfvotes[selfsorted_candidates[_round][self

      elecCANDIDATE_INDEX]]

      if voter_index in selfrankings_changed

      for candidate in reversed(selfrankings_changed[voter_index

      ])

      if candidate[selfelecCANDIDATE_INDEX] not in selfelec

      excluded

      selfcandidates[candidate[selfelecCANDIDATE_INDEX

      ]] += 1

      selfvotes[candidate[selfelecCANDIDATE_INDEX]]

      add(voter_index)

      break

      else

      continue

      else

      for candidate in reversed(selfelecsorted_voters[

      voter_index])

      if candidate[selfelecCANDIDATE_INDEX] not in selfelec

      excluded

      selfcandidates[candidate[selfelecCANDIDATE_INDEX

      ]] += 1

      selfvotes[candidate[selfelecCANDIDATE_INDEX]]

      add(voter_index)

      break

      else

      continue

      selfsorted_candidates = selfelecsort_candidates(selfcandidates)

      return 0

      76

      APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

      Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

      for index in range(selfelecN_CANDIDATES)

      selfcandidates[index] = 0

      for voter in selfelecsorted_voters

      for candidate in reversed(voter)

      if candidate[selfelecCANDIDATE_SCORE] gt 0

      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

      else

      break

      APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

      Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

      for index in range(selfelecN_CANDIDATES)

      selfcandidates[index] = 0

      for voter in selfelecsorted_voters

      if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

      elecCANDIDATE_INDEX]]

      selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

      else

      for candidate in reversed(voter)

      if candidate[selfelecCANDIDATE_SCORE] gt 0

      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

      else

      break

      77

      APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

      Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

      pos = set()

      for index perc in enumerate(selfelectactical_vote_percentages)

      if perc gt 0

      posadd(index)

      for candidate in selfeleccandidates

      if candidate not in selfleading_candidates

      for voter_index in selfvotes[candidate]

      raised = None

      for candidate_tuple in reversed(selfelecsorted_voters[voter_index

      ])

      if candidate_tuple[selfelecCANDIDATE_INDEX] in self

      leading_candidates

      if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

      if randomrandom() lt selfelectactical_vote_percentages[

      candidate_tuple[selfelecCANDIDATE_INDEX]]

      ranking = [None]selfelecN_CANDIDATES

      ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

      selfelecvoters[voter_index][candidate_tuple[selfelec

      CANDIDATE_INDEX]])

      raised = candidate_tuple[selfelecCANDIDATE_INDEX]

      break

      break

      break

      if raised = None

      for _candidate in selfleading_candidates

      if _candidate = ranking[-1][0]

      ranking[0] = (_candidate selfelecvoters[voter_index][

      _candidate])

      buried = _candidate

      break

      i = 1

      for candidate_tuple in selfelecsorted_voters[voter_index]

      if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

      buried]

      continue

      else

      ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

      selfelecvoters[voter_index][candidate_tuple[selfelec

      CANDIDATE_INDEX]])

      i += 1

      selfrankings_changed[voter_index] = ranking

      78

      APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

      Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

      for voter_index in selfvotes[candidate]

      if randomrandom() lt selfelectactical_vote_percentages[candidate

      ]

      for _candidate in selfleading_candidates

      if _candidate = candidate

      ranking = [None]selfelecN_CANDIDATES

      ranking[0] = (_candidate selfelecvoters[voter_index][

      _candidate])

      buried = _candidate

      break

      i = 1

      for candidate_tuple in selfelecsorted_voters[voter_index]

      if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

      continue

      else

      ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

      selfelecvoters[voter_index][candidate_tuple[selfelec

      CANDIDATE_INDEX]])

      i += 1

      selfrankings_changed[voter_index] = ranking

      79

      APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

      Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

      for index in range(selfelecN_CANDIDATES)

      selfcandidates[index] = 0

      for voter_index voter in enumerate(selfelecsorted_voters)

      score = 0

      if voter_index in selfrankings_changed

      for candidate in selfrankings_changed[voter_index]

      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

      score += 1

      else

      for candidate in voter

      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

      score += 1

      APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

      Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

      for voter_index voter in enumerate(selfelecsorted_voters)

      if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

      elecCANDIDATE_INDEX]]

      selfrankings_changed[voter_index] = copydeepcopy(selfelec

      sorted_voters[voter_index])

      for candidate_index candidate in enumerate(reversed(voter))

      if candidate_index == 0

      selfrankings_changed[voter_index][-(candidate_index + 1)] = (

      voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

      else

      selfrankings_changed[voter_index][-(candidate_index + 1)] = (

      voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

      80

      APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

      Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

      for index in range(selfelecN_CANDIDATES)

      selfcandidates[index] = 0

      for voter_index voter in enumerate(selfelecsorted_voters)

      if voter_index in selfrankings_changed

      for candidate in selfrankings_changed[voter_index]

      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

      selfelecCANDIDATE_RANK]

      else

      for candidate in voter

      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

      selfelecCANDIDATE_RANK]

      APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

      Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

      for index in range(selfelecN_CANDIDATES)

      selfcandidates[index] = 0

      for voter in selfelecsorted_voters

      votes = selfelecN_VACANCIES

      for candidate in reversed(voter)

      if votes == 0

      break

      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

      votes -= 1

      • Folha de aprovaccedilatildeo
      • Agradecimentos
      • Epiacutegrafe
      • Resumo
      • Abstract
      • Lista de ilustraccedilotildees
      • Lista de Coacutedigos
      • Lista de tabelas
      • Lista de abreviaturas e siglas
      • Sumaacuterio
      • INTRODUCcedilAtildeO
        • MOTIVACcedilAtildeO E OBJETIVO
        • MEacuteTODO
        • ESTRUTURA
          • SISTEMAS ELEITORAIS
            • FISRT PAST THE POST
              • Exemplo
              • Vantagens e Desvantagens do FPTP
              • Voto Uacutetil no FPTP
                • TWO-ROUND SYSTEM
                  • Exemplo
                  • Vantagens e Desvantagens do TRS
                  • Voto Uacutetil no TRS
                    • INSTANT-RUNOFF VOTING
                      • Exemplo
                      • Vantagens e Desvantagens do IRV
                      • Voto Uacutetil no IRV
                        • APPROVAL VOTING SYSTEM
                          • Exemplo
                          • Vantagens e Desvantagens do AVS
                          • Voto Uacutetil no AVS
                            • THE BORDA COUNT
                              • Exemplo
                              • Vantagens e Desvantagens do BC
                              • Voto Uacutetil no BC
                                • SCORE VOTING SYSTEM
                                  • Exemplo
                                  • Vantagens e Desvantagens do SVS
                                  • Voto Uacutetil no SVS
                                    • BLOC VOTE
                                      • Exemplo
                                      • Voto Uacutetil no BV
                                          • O SIMULADOR
                                          • CENAacuteRIOS PERTINENTES
                                            • CENAacuteRIO 1 VOTO TAacuteTICO
                                            • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                            • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                            • CENAacuteRIO 4 COALIZOtildeES
                                            • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                            • CENAacuteRIO 6 VOTO DE MINORIA
                                              • COMO FUNCIONA O SIMULADOR
                                                • CLASSE Elections
                                                • CLASSE FirstPastThePost
                                                • CLASSE TwoRoundSystem
                                                • CLASSE InstantRunoffVoting
                                                • CLASSE ApprovalVoting
                                                • CLASSE BordaCount
                                                • CLASSE ScoreVoting
                                                • CLASSE BlocVote
                                                • TECNOLOGIAS UTILIZADAS
                                                  • CONCLUSAtildeO
                                                  • Referecircncias
                                                  • Meacutetodo create_voters
                                                  • Meacutetodo create_candidates
                                                  • Meacutetodo calculate_means
                                                  • Meacutetodo get_mean
                                                  • Meacutetodo calculate_mean
                                                  • Meacutetodo set_leading_candidates
                                                  • Meacutetodo irv_set_leading_candidates
                                                  • Meacutetodo sort_ranks
                                                  • Meacutetodo fptp_count_tactical_votes
                                                  • Meacutetodo fptp_count_minority_votes
                                                  • Meacutetodo trs_second_round
                                                  • Meacutetodo trs_account_for_coalitions
                                                  • Meacutetodo irv_count_votes
                                                  • Meacutetodo avs_count_votes
                                                  • Meacutetodo avs_count_votes_with_tactical
                                                  • Meacutetodo irv_apply_tactical_votes
                                                  • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                  • Meacutetodo bc_sum_candidates_scores
                                                  • Meacutetodo svs_apply_tactical_votes
                                                  • Meacutetodo svs_sum_candidates_scores
                                                  • Meacutetodo bv_count_votes

        ldquoElections are won by men and women chiefly because most people vote against somebodyrather than for somebody

        Franklin P Adams

        RESUMO

        Existem diversos tipos de sistemas eleitorais em uso ao redor do mundo Cada paiacutes optapelo meacutetodo que melhor se adequa ao seu modo de governar muitas vezes utilizandovariaccedilotildees de um mesmo meacutetodo ou ateacute uma combinaccedilatildeo destes dependendo do cargopoliacutetico em questatildeo Atraveacutes da implementaccedilatildeo de um programa que permite simular umextenso nuacutemero de eleitores esta tese procura descobrir quais meacutetodos trazem resultadosque maximizam a taxa de satisfaccedilatildeo meacutedia da populaccedilatildeo quando testados sob diferentescenaacuterios poliacuteticos Cada eleitor simulado atribuiraacute notas para os candidatos que seratildeogeradas dependendo do cenaacuterio de maneira aleatoacuteria seguindo certa distribuiccedilatildeo de pro-babilidade ou deterministicamente atraveacutes de perfis eleitorais Tambeacutem seratildeo incluiacutedosnas simulaccedilotildees fatores reais de uma eleiccedilatildeo como o voto uacutetil e as coalizotildees entre can-didatos para que seja possiacutevel determinar de que maneira esses paracircmetros influenciamno resultado final Seraacute possiacutevel perceber que alguns dos sistemas satildeo muito eficazes naseleccedilatildeo dos melhores candidatos poreacutem afetados pelos votos taacuteticos enquanto outros satildeoresistentes a esses mas pecam em eficiecircncia

        Palavras-chave Simulaccedilotildees Sistemas Eleitorais Satisfaccedilatildeo Meacutedia

        ABSTRACT

        There are several types of electoral systems in use around the world Each country choosesthe method that best fits their governance often using variations of the same method oreven a combination of these depending on the political position in question Through theimplementation of a program that simulates an extensive number of voters this thesisseeks to find out which methods bring results that maximize the rate of population sat-isfaction when tested under different political scenarios Each simulated voter will assignnotes to the candidates that will be generated depending on the scenario in randomfashion following a certain probability distribution or deterministically through electoralprofiles Also included in the simulations are the real factors of an election such as tacti-cal votes and coalitions between candidates so that it is possible to determine how theseparameters influence the final result It will be possible to see that some of the systemsare very effective in the selection of the best candidates however affected by tactical voteswhile others are resistant to these but lack efficiency

        Keywords Simulations Electoral Systems Satisfaction Rate

        LISTA DE ILUSTRACcedilOtildeES

        Figura 1 ndash de paiacuteses de cada tipo de regime 1946-2016 17Figura 2 ndash Captura de tela 1 30Figura 3 ndash Captura de tela 2 30Figura 4 ndash Captura de tela 3 31Figura 5 ndash Captura de tela 4 32Figura 6 ndash Captura de tela 5 32Figura 7 ndash Captura de tela 6 33Figura 8 ndash FPTP - Cenaacuterio 1 sem voto taacutetico 34Figura 9 ndash TRS segundo turno - Cenaacuterio 1 sem voto taacutetico 34Figura 10 ndash IRV primeiro turno - Cenaacuterio 1 35Figura 11 ndash IRV segundo turno - Cenaacuterio 1 35Figura 12 ndash IRV terceiro turno - Cenaacuterio 1 35Figura 13 ndash AVS - Cenaacuterio 1 sem voto taacutetico 36Figura 14 ndash BC - Cenaacuterio 1 sem voto taacutetico 36Figura 15 ndash SVS - Cenaacuterio 1 sem voto taacutetico 36Figura 16 ndash FPTP - Cenaacuterio 1 - 20 de voto taacutetico na Ana 37Figura 17 ndash TRS segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana 37Figura 18 ndash IRV primeiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana 38Figura 19 ndash IRV segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana 38Figura 20 ndash IRV terceiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana 38Figura 21 ndash AVS - Cenaacuterio 1 20 de voto taacutetico na Ana 39Figura 22 ndash BC - Cenaacuterio 1 20 de voto taacutetico na Ana 39Figura 23 ndash SVS - Cenaacuterio 1 20 de voto taacutetico na Ana 39Figura 24 ndash BC - Cenaacuterio 1 100 de voto taacutetico na Ana e Beto 40Figura 25 ndash IRV primeiro turno - Cenaacuterio 2 41Figura 26 ndash IRV segundo turno - Cenaacuterio 2 41Figura 27 ndash IRV primeiro turno com voto taacutetico - Cenaacuterio 2 42Figura 28 ndash IRV segundo turno com voto taacutetico - Cenaacuterio 2 42Figura 29 ndash IRV primeiro turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3 44Figura 30 ndash IRV segundo turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3 44Figura 31 ndash TRS turno 1 - Cenaacuterio 4 45Figura 32 ndash TRS turno 2 - Cenaacuterio 4 46Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4 46Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4 46Figura 35 ndash FPTP - Cenaacuterio 5 48Figura 36 ndash TRS segundo turno - Cenaacuterio 5 48

        Figura 37 ndash AVS - Cenaacuterio 5 49Figura 38 ndash BC - Cenaacuterio 5 49Figura 39 ndash SVS - Cenaacuterio 5 50Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria 50Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego 51Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego 51Figura 43 ndash BV - Cenaacuterio 6 52Figura 44 ndash estrutura candidates 53Figura 45 ndash estrutura voters 54Figura 46 ndash estrutura votes 54Figura 47 ndash PDF - Distribuiccedilatildeo Neutral 55Figura 48 ndash CDF - Distribuiccedilatildeo Neutral 55Figura 49 ndash PDF - Distribuiccedilatildeo Liked 56Figura 50 ndash CDF - Distribuiccedilatildeo Liked 56Figura 51 ndash PDF - Distribuiccedilatildeo Disliked 57Figura 52 ndash CDF - Distribuiccedilatildeo Disliked 57Figura 53 ndash PDF - Distribuiccedilatildeo Loved 58Figura 54 ndash CDF - Distribuiccedilatildeo Loved 58Figura 55 ndash PDF - Distribuiccedilatildeo Hated 59Figura 56 ndash CDF - Distribuiccedilatildeo Hated 59Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer 60Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer 60Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer 61Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer 61

        LISTA DE COacuteDIGOS

        A1 Meacutetodo create_voters 67B1 Meacutetodo create_candidates 68C1 Meacutetodo calculate_means 68D1 Meacutetodo get_mean 68E1 Meacutetodo calculate_mean 69F1 Meacutetodo set_leading_candidates 69G1 Meacutetodo irv_set_leading_candidates 69H1 Meacutetodo sort_ranks 70I1 Meacutetodo fptp_count_tactical_votes 71J1 Meacutetodo fptp_count_minority_votes 72K1 Meacutetodo trs_second_round 73L1 Meacutetodo trs_account_for_coalitions 74M1 Meacutetodo irv_count_votes 75N1 Meacutetodo avs_count_votes 76O1 Meacutetodo avs_count_votes_with_tactical 76P1 Meacutetodo irv_apply_tactical_votes 77Q1 Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo) 78R1 Meacutetodo bc_sum_candidates_scores 79S1 Meacutetodo svs_apply_tactical_votes 79T1 Meacutetodo svs_sum_candidates_scores 80U1 Meacutetodo bv_count_votes 80

        LISTA DE TABELAS

        Tabela 1 ndash Exemplo FPTP 18Tabela 2 ndash 2deg turno do TRS 20Tabela 3 ndash Exemplo IRV 22Tabela 4 ndash Desenvolvimento do IRV 22Tabela 5 ndash Exemplo AVS 24Tabela 6 ndash Resultado AVS 24Tabela 7 ndash Resultado BC 26Tabela 8 ndash Exemplo SVS 27Tabela 9 ndash Resultado SVS 27Tabela 10 ndash Exemplo BV 28Tabela 11 ndash Resultado BV 28Tabela 12 ndash Distribuiccedilatildeo de notas - Cenaacuterio 2 41Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2 42Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3 43Tabela 15 ndash Resultados do Cenaacuterio 3 44Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5 47Tabela 17 ndash Resultados do Cenaacuterio 5 48Tabela 18 ndash Resultados do Cenaacuterio 6 52

        LISTA DE ABREVIATURAS E SIGLAS

        FPTP First Past The Post

        TRS Two-Round System

        IRV Instant Runoff Voting

        AVS Approval Voting System

        BC Borda Count

        SVS Score Voting System

        BV Bloc Vote

        SUMAacuteRIO

        1 INTRODUCcedilAtildeO 1511 MOTIVACcedilAtildeO E OBJETIVO 1512 MEacuteTODO 1513 ESTRUTURA 15

        2 SISTEMAS ELEITORAIS 1721 FISRT PAST THE POST 17211 Exemplo 18212 Vantagens e Desvantagens do FPTP 18213 Voto Uacutetil no FPTP 1922 TWO-ROUND SYSTEM 19221 Exemplo 20222 Vantagens e Desvantagens do TRS 20223 Voto Uacutetil no TRS 2123 INSTANT-RUNOFF VOTING 21231 Exemplo 22232 Vantagens e Desvantagens do IRV 22233 Voto Uacutetil no IRV 2324 APPROVAL VOTING SYSTEM 24241 Exemplo 24242 Vantagens e Desvantagens do AVS 24243 Voto Uacutetil no AVS 2525 THE BORDA COUNT 25251 Exemplo 25252 Vantagens e Desvantagens do BC 26253 Voto Uacutetil no BC 2626 SCORE VOTING SYSTEM 26261 Exemplo 27262 Vantagens e Desvantagens do SVS 27263 Voto Uacutetil no SVS 2727 BLOC VOTE 28271 Exemplo 28272 Voto Uacutetil no BV 29

        3 O SIMULADOR 30

        4 CENAacuteRIOS PERTINENTES 3441 CENAacuteRIO 1 VOTO TAacuteTICO 3442 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV 4143 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE 4344 CENAacuteRIO 4 COALIZOtildeES 4545 CENAacuteRIO 5 DILEMA DO PRISIONEIRO 4746 CENAacuteRIO 6 VOTO DE MINORIA 50

        5 COMO FUNCIONA O SIMULADOR 5351 CLASSE Elections 5352 CLASSE FirstPastThePost 6053 CLASSE TwoRoundSystem 6254 CLASSE InstantRunoffVoting 6255 CLASSE ApprovalVoting 6356 CLASSE BordaCount 6357 CLASSE ScoreVoting 6358 CLASSE BlocVote 6459 TECNOLOGIAS UTILIZADAS 64

        6 CONCLUSAtildeO 65

        REFEREcircNCIAS 66

        APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS 67

        APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES 68

        APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS 68

        APEcircNDICE D ndash MEacuteTODO GET_MEAN 68

        APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN 69

        APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES 69

        APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES 69

        APEcircNDICE H ndash MEacuteTODO SORT_RANKS 70

        APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES 71

        APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES 72

        APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND 73

        APEcircNDICE L ndash MEacuteTODOTRS_ACCOUNT_FOR_COALITIONS 74

        APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES 75

        APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES 76

        APEcircNDICE O ndash MEacuteTODOAVS_COUNT_VOTES_WITH_TACTICAL 76

        APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES 77

        APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES (CON-TINUACcedilAtildeO) 78

        APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES 79

        APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES 79

        APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES 80

        APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES 80

        15

        1 INTRODUCcedilAtildeO

        Em toda eleiccedilatildeo existe pelo menos um grupo de indiviacuteduos que sai completamentedesfavorecido e insatisfeito com o resultado O contentamento completo de uma populaccedilatildeoeacute certamente improvaacutevel e muitas vezes impossiacutevel considerando a gama de candidatosque se dispotildee a concorrer Em todo caso o miacutenimo que pode ser feito eacute escolher demaneira eficiente o melhor candidato ao cargo dentre as opccedilotildees disponiacuteveis Diante dissoeacute necessaacuterio avaliar como essa escolha eacute feita e quais meacutetodos satildeo capazes de tornaacute-larealidade

        11 MOTIVACcedilAtildeO E OBJETIVO

        Em conformidade com o extenso nuacutemero de sistemas eleitorais pelo mundo este tra-balho tem como objetivo testar uma porccedilatildeo desses sistemas sob a simulaccedilatildeo de diferentescenaacuterios especiacuteficos a fim de determinar quais deles podem ser considerados como os maisjustos perante a taxa de satisfaccedilatildeo meacutedia da populaccedilatildeo

        12 MEacuteTODO

        Para que essa anaacutelise seja possiacutevel foi desenvolvido um programa que permite a criaccedilatildeoe configuraccedilatildeo de diferentes cenaacuterios onde os sistemas eleitorais seratildeo simulados Nele eacutepossiacutevel definir o nuacutemero total de eleitores e candidatos como esses eleitores iratildeo votar eo niacutevel de popularidade de cada candidato Aleacutem disso eacute possiacutevel formar coalizotildees entreos candidatos e escolher a porcentagem dos eleitores que optaratildeo pelo voto uacutetil Dessamaneira seraacute possiacutevel elaborar cenaacuterios que buscam expor os pontos fortes e fracos decada sistema

        13 ESTRUTURA

        Este trabalho eacute relatado ao longo de seis capiacutetulos No Capiacutetulo 2 seratildeo apresentados ossistemas eleitorais implementados no simulador suas vantagens e desvantagens conhecidase outras caracteriacutesticas especiacuteficas de cada um A intenccedilatildeo do capiacutetulo eacute tornar o textomais autocontido trazendo conceitos jaacute estudados que ajudaratildeo na melhor compreensatildeodos capiacutetulos seguintes por isso grande parte de sua composiccedilatildeo eacute oriunda de diferentesfontes consultadas

        O Capiacutetulo 3 eacute uma apresentaccedilatildeo das funcionalidades que o simulador possui Seratildeoexplicados todos os campos de entrada e os dois modos distintos nos quais o programaopera

        16

        No Capiacutetulo 4 os sistemas seratildeo colocados em teste Todos seratildeo simulados em cenaacuteriosespeciacuteficos a fim de fazer sobressair aqueles com as maiores taxas de satisfaccedilatildeo meacutedia

        A estrutura e implementaccedilatildeo do simulador seratildeo abordadas em detalhes no Capiacutetulo5 assim como uma breve descriccedilatildeo da stack utilizada Todos os meacutetodos relevantes aofuncionamento das simulaccedilotildees seratildeo explicados passo a passo

        No Capiacutetulo 6 seratildeo apresentadas as conclusotildees referentes agrave anaacutelise dos resultadosobtidos no Capiacutetulo 4 e as consideraccedilotildees finais do projeto como um todo

        17

        2 SISTEMAS ELEITORAIS

        Atualmente mais e mais paiacuteses estatildeo adotando sistemas democraacuteticos de governoCerca de 6 em 10 governos no mundo satildeo democracias (Pew Research Center 2017) o quepode ser observado na Figura 1 abaixo Em um sistema democraacutetico a populaccedilatildeo escolheseus liacutederes atraveacutes de seu sistema eleitoral Existem diversos sistemas eleitorais em usono mundo muitos dos quais satildeo usados em conjunto para eleger um uacutenico candidato Emvaacuterios paiacuteses mais de um sistema eleitoral pode ser utilizado tambeacutem em diferentes niacuteveisde governo tanto presidencial quanto estadual ou municipal Natildeo apenas imersos nomeio poliacutetico eles tambeacutem podem ser usados em escopos menores como em esportes oucompeticcedilotildees artiacutesticas poreacutem sempre com a finalidade de alocar um ou mais indiviacuteduosa determinado cargo ou tiacutetulo

        Figura 1 ndash de paiacuteses de cada tipo de regime 1946-2016

        Fonte Center of Systemic Peacersquos Polity IV Project

        Os proacuteximos trecircs toacutepicos discutidos neste capiacutetulo referentes aos meacutetodos First Pastthe Post Two-Round System e Instant Runoff Voting possuem seus conceitos e infor-maccedilotildees relevantes com exceccedilatildeo dos exemplos traduzidos livremente do livro Behind theBallot Box A Citizenrsquos Guide to Voting Systems (AMY 2000)

        21 FISRT PAST THE POST

        O meacutetodo First Past the Post tambeacutem conhecido como Plurality Voting ou WinnerTakes All eacute o meacutetodo mais simples e direto e provavelmente o primeiro meacutetodo que sepensa quando se fala de eleiccedilotildees Os eleitores escolhem apenas um candidato e apoacutes a

        18

        contagem dos votos o candidato com o maior nuacutemero de votos eacute eleito O vencedor natildeonecessita da aprovaccedilatildeo de mais de 50 dos eleitores ele apenas precisa de uma pluralidadedos votos ou seja apenas possuir mais votos que os outros candidatos

        Esse sistema eacute utilizado em escala nos Estados Unidos para a maior parte das eleiccedilotildeesvoltadas a eleger apenas um candidato como prefeitos e governadores aleacutem de ser usadana disputa presidencial Dentre outros paiacuteses que empregam o sistema em suas corridaspresidenciais estatildeo listados o Meacutexico as Filipinas a Coreia do Sul e a Venezuela

        211 Exemplo

        Tabela 1 ndash Exemplo FPTP

        Candidatos VotosA 36B 25C 22D 17

        Neste exemplo o candidato A possui uma pluralidade dos votos com 36 e ele eacute ocandidato eleito mesmo natildeo tendo uma maioria

        212 Vantagens e Desvantagens do FPTP

        A vantagem do FPTP eacute a sua simplicidade Natildeo eacute difiacutecil para um eleitor comumcompreender o seu funcionamento eles apenas precisam se decidir por um candidato Eletambeacutem eacute muito simples e direto na sua contagem e seleccedilatildeo do vencedor

        Esse meacutetodo tambeacutem tende a criar listas de candidatos concorrentes mais curtasCandidatos independentes ou de partidos menores frequentemente acabam se sentindodesencorajados a concorrer devido agraves suas baixas chances de vitoacuteria Isso normalmentefornece aos eleitores uma faacutecil decisatildeo entre um ou dois candidatos dos maiores partidosao mesmo tempo poreacutem limitando suas opccedilotildees

        No entanto sua essecircncia eacute sua principal desvantagem a pluralidade O fato do can-didato eleito natildeo necessitar de uma maioridade dos votos da populaccedilatildeo parece violaros princiacutepios baacutesicos da democracia Democracia eacute em sua origem o poder(kratos) nopovo(demos) poreacutem na pluralidade o poder de eleger um candidato pode residir emapenas uma fraccedilatildeo relativamente pequena do povo Em um cenaacuterio hipoteacutetico comapenas trecircs candidatos um deles apenas poderia necessitar de natildeo mais do que 34 dosvotos para ser eleito o que significa que no pior dos casos 66 da populaccedilatildeo rejeitao candidato eleito O cenaacuterio soacute piora com mais e mais candidatos concorrendo Paraquatro candidatos satildeo necessaacuterios 26 dos votos no pior dos casos para cinco satildeo 21 eassim por diante

        19

        213 Voto Uacutetil no FPTP

        No FPTP tambeacutem existe a possibilidade de os eleitores evitarem votar em sua prefe-recircncia verdadeira No caso de sua preferecircncia natildeo aparentar ter boas chances de vitoacuteriamuitas vezes opta-se por uma segunda opccedilatildeo que esteja mais bem colocada nas eleiccedilotildeesO motivo disso eacute que nessas situaccedilotildees votar em sua preferecircncia pode parecer um des-perdiacutecio do seu voto e no pior dos cenaacuterios optar por natildeo transferir seu voto para umasegunda opccedilatildeo pode acabar resultando na eleiccedilatildeo de um candidato de seu desgosto As-sim votar de maneira verdadeira muitas vezes pode acabar prejudicando o eleitor que sevecirc forccedilado a abandonar seus interesses poliacuteticos mais imediatos e escolher o menor entredois(ou mais) males Os candidatos de partidos menores satildeo os que mais sofrem com essetipo de voto estrateacutegico por natildeo conseguirem agregar as maiores quantidades de votos

        Entretanto ao mesmo tempo que partidos maiores roubam votos de partidos meno-res com os votos taacuteticos partidos menores tambeacutem tem a oportunidade de ganhar algunsvotos com o denominado spoiler effect Ao entrarem na eleiccedilatildeo candidatos de partidosmenores podem adquirir votos de candidatos mais populares que possuem inclinaccedilatildeo po-liacutetica semelhante Logo eacute possiacutevel que haja certo equiliacutebrio ao se contrapor as mudanccedilasde voto devido aos votos uacuteteis agraves mudanccedilas oriundas do spoiler effect

        Poreacutem o spoiler effect natildeo necessariamente ocorre apenas entre partidos maiores emenores mas pode prejudicar candidatos de popularidades proacuteximas Por exemplo entretrecircs candidatos A B e C onde A representa determinada posiccedilatildeo no espectro poliacuteticoenquanto B e C possuem posiccedilotildees parecidas o que pode acontecer eacute B e C se prejudicaremmutuamente jaacute que ambos dividem os eleitores de um mesmo espectro poliacutetico Se esseespectro tem a maioria com 60 por exemplo com B e C compartilhando cada um 30dos votos o candidato A sairia vencedor com 40 mesmo que todos os eleitores de Bprefiram C e todos os eleitores de C prefiram B Esse exemplo demonstra claramente oproblema com os sistemas de pluralidade

        22 TWO-ROUND SYSTEM

        Uma das primeiras tentativas de lidar com a desvantagem dos sistemas por pluralidadeo Two-round System eacute usado desde o seacuteculo XIX no ocidente e atualmente ainda eacute utilizadoem corridas presidecircncias de paiacuteses como o Brasil Bulgaacuteria Chile Colocircmbia FinlacircndiaPolocircnia Portugal Ruacutessia e em inuacutemeras eleiccedilotildees locais nos Estados Unidos

        O principal objetivo do TRS eacute garantir que o vencedor tenha conseguido uma maioriados votos Para isso as eleiccedilotildees satildeo estruturadas em duas rodadas de votaccedilatildeo Na primeirarodada os eleitores se dirigem agraves urnas e votam no candidato de sua preferecircncia Apoacutesa contagem se a quantidade de votos do candidato mais votado superar a proporccedilatildeo de50 natildeo haacute a necessidade de uma segunda rodada e este candidato eacute eleito No entantose este natildeo for o caso haveraacute uma segunda rodada com apenas os dois candidatos mais

        20

        votados Nesta rodada os eleitores retornam as urnas para escolher uma das duas opccedilotildeessendo eleito o candidato mais votado agora definitivamente com uma maioria dos votos

        221 Exemplo

        Utilizando a mesma distribuiccedilatildeo de votos descrita na tabela 1 Neste caso como ocandidato A natildeo possui uma maioria dos votos ele e o candidato B iratildeo concorrer em umsegundo turno Digamos que as distribuiccedilotildees dos votos dos eleitores dos candidatos C eD em relaccedilatildeo aos candidatos A e B satildeo as seguintes

        Tabela 2 ndash 2deg turno do TRS

        Candidatos Votos dos eleitoresde C

        Votos dos eleitoresde D

        Votos do 1degturno

        A 7 5 36B 15 12 25

        O candidato B agora eacute eleito com uma maioria dos votos 52 contra 48 do candidatoA

        222 Vantagens e Desvantagens do TRS

        Por ser parecido com o FPTP esse sistema tambeacutem eacute de faacutecil compreensatildeo do eleitorcomum poreacutem a maior vantagem do TRS eacute a garantia de que o candidato vencedor teraacute oapoio da maioria dos eleitores no segundo turno eliminando a pluralidade Argumenta-seque isso daacute maior legitimidade poliacutetica ao mandato do candidato eleito

        O TRS tende a abrigar uma lista maior de candidatos sendo mais convidativo acandidatos de partidos menores mesmo que suas chances natildeo sejam maiores quandocomparadas agraves eleiccedilotildees sob o FPTP Mesmo assim essa listagem mais abrangente eacute umavantagem do sistema pois daacute aos eleitores uma variedade maior de opccedilotildees de voto

        Em relaccedilatildeo agraves suas desvantagens o TRS possui duas principais A primeira satildeo oscustos elevados do sistema decorrentes da necessidade da organizaccedilatildeo de um segundoturno de votaccedilotildees A segunda eacute o aumento no iacutendice de ausecircncias dos eleitores agraves urnasEssa ampliaccedilatildeo no natildeo comparecimento dos eleitores se daacute tambeacutem devido ao segundoturno por pura fatiga eleitoral bem como consequecircncia da desistecircncia de eleitores queapoiam candidatos que jaacute foram eliminados

        Outro ponto negativo do TRS eacute a sua natildeo-monotonicidade Isso significa que umcandidato pode ser prejudicado com um aumento em sua popularidade e suporte e domesmo modo um candidato pode se beneficiar com a perda de popularidade e suporteSe os candidatos A e B satildeo os esperados para ir ao segundo turno onde A eacute mais fortedo que B um aumento no suporte pelo candidato A pode resultar na sua derrota quandoesse aumento causa uma alteraccedilatildeo nos candidatos que satildeo selecionados para ir ao segundoturno Se esse aumento na popularidade de A resultar na eliminaccedilatildeo preacutevia de B um

        21

        terceiro candidato C pode ser vitorioso sobre A no segundo turno caso os eleitores de Bprefiram C ao candidato A Se natildeo houvesse esse crescimento de popularidade A teriaderrotado B no segundo turno Essa situaccedilatildeo seraacute vista em melhores detalhes na seccedilatildeo 43

        223 Voto Uacutetil no TRS

        Esse sistema minimiza os efeitos do voto uacutetil em relaccedilatildeo ao FPTP pois um eleitorqualquer pode tranquilamente votar em sua preferecircncia sem se preocupar em desperdiccedilaacute-lo mesmo que seu candidato natildeo tenha chances de vitoacuteria Se este natildeo for eleito aindapoderaacute escolher a sua preferecircncia dentre os dois candidatos que prosseguirem para osegundo turno

        Apesar disso ainda existe um cenaacuterio em que o eleitor pode ser tentado a natildeo votar emsua preferecircncia Eacute possiacutevel que ele opte pela sua segunda opccedilatildeo se souber que sua primeiraopccedilatildeo possui miacutenimas chances de ir ao segundo turno ou ateacute mesmo por saber que issodiminuiraacute as chances de algum outro candidato ser eleito Mesmo assim eacute evidente queo TRS natildeo proporciona o mesmo apelo ao voto taacutetico que o FPTP

        Outra caracteriacutestica do TRS eacute o incentivo a formaccedilatildeo de coalizotildees entre candidatosde partidos mais populares com candidatos de partidos menos populares As coalizotildeesfornecem benefiacutecios agrave ambas as partes onde os candidatos classificados para o segundoturno em geral se juntam a candidatos jaacute eliminados com a intenccedilatildeo de agregar maisvotos enquanto os candidatos jaacute eliminados apoiam um dos dois classificados na esperanccedilade inserir propostas proacuteprias ou modificaccedilotildees agrave chapa deles

        23 INSTANT-RUNOFF VOTING

        Instant Runoff Voting foi uma alternativa aos meacutetodos FPTP e TRS desenvolvidanos anos 70 por um professor do Instituto de Tecnologia de Massachusetts(MIT) O IRVelimina as principais desvantagens desses outros dois sistemas a pluralidade do FPTP e anecessidade de mais de uma rodada de votaccedilatildeo do TRS Este meacutetodo tambeacutem opera emmais de uma rodada poreacutem como o proacuteprio nome sugere essas rodadas satildeo instantacircneasnatildeo sendo necessaacuterio o retorno dos eleitores agraves urnas Atualmente ele eacute utilizado naIrlanda nas eleiccedilotildees presidenciais em Londres na eleiccedilatildeo de seu prefeito e em distritosindividuais na Austraacutelia para eleger membros de sua cacircmara baixa do parlamento OIRV tambeacutem eacute usado por vaacuterias organizaccedilotildees privadas nos Estados Unidos incluindoa American Political Science Association e a American Psychological Association paraeleger seus funcionaacuterios

        Nesse sistema os eleitores natildeo satildeo solicitados a votar em um uacutenico candidato aoinveacutes disso eles listam todos os candidatos concorrentes na ordem de sua preferecircnciaA partir dessas listas as primeiras opccedilotildees de cada eleitor recebem o seu voto e apoacutes acontagem se um candidato obtiver 50 dos votos mais um este candidato eacute eleito Se

        22

        isso natildeo ocorrer o candidato menos votado eacute eliminado das eleiccedilotildees e seus votos satildeotransferidos para a segunda opccedilatildeo de cada um de seus eleitores Esse procedimento serepete eliminando o candidato menos votado a cada rodada ateacute que algum dos candidatospossuam a maioridade dos votos

        231 Exemplo

        Na tabela 3 pode-se verificar a distribuiccedilatildeo de votos por perfil de eleitor e na tabela4 vecirc-se o desenvolvimento do IRV para essas distribuiccedilotildees O candidato D eacute o menosvotado e por consequecircncia eacute o primeiro a ser eliminado A segunda opccedilatildeo de todos oseleitores que votaram no candidato D eacute o candidato C por isso este recebe todos os votosdistribuiacutedos na segunda rodada Com isso o candidato B eacute eliminado com 25 dos votos eos candidatos A e C concorrem na uacuteltima rodada Mesmo com o candidato C na lideranccedilana segunda rodada a maior parte dos eleitores do B tem como preferecircncia o candidatoA por isso A eacute eleito com 55 dos votos contra 45 do C

        Tabela 3 ndash Exemplo IRV

        Rankings Ndeg de eleitoresABCD 20ABDC 16BDAC 19BDCA 6CABD 7CDBA 15DCAB 5DCBA 12

        Tabela 4 ndash Desenvolvimento do IRVTurnos D C B A

        1 17 22 25 362 eliminado 39 25 363 eliminado 45 eliminado 55

        232 Vantagens e Desvantagens do IRV

        Assim como no TRS a pluralidade eacute irrelevante no IRV e um candidato soacute eacute eleitocom a maioridade dos votos dando maior legitimidade ao mandato deste No entantopode-se argumentar que o IRV faz isso com mais eficiecircncia pois natildeo requer a execuccedilatildeode mais de uma rodada de votaccedilotildees Isso diminui os custos das eleiccedilotildees como um todoao mesmo tempo que proporciona um nuacutemero menor de isenccedilotildees por parte dos eleitoresdevido ao desgaste de todo o processo eleitoral

        23

        Aleacutem disso candidatos de partidos menores tendem a receber mais votos do queno FPTP e portanto satildeo mais encorajados a se candidatar Com uma lista maior decandidatos eleitores desfrutam de uma variedade maior de opccedilotildees de voto Contudomesmo com mais candidatos menos populares o spoiler effect mencionado anteriormentetambeacutem natildeo possui espaccedilo nesse sistema de votaccedilatildeo Partidos menores natildeo tem comoroubar votos de partidos maiores visto que esses votos eventualmente seratildeo transferidosde volta a eles durante o desenvolvimento das rodadas do IRV

        Em virtude de sua estrutura acredita-se que esse meacutetodo tende a encorajar os can-didatos tambeacutem a elaborar suas campanhas de forma mais abrangente ampliando suainfluecircncia para mais do que apenas um grupo especiacutefico de maneira que ele consiga agre-gar votos de segunda ou terceira opccedilatildeo aleacutem dos votos de seus eleitores principais

        A principal desvantagem do IRV eacute o fato de ele ainda natildeo ser amplamente utilizado aoredor do mundo Essa falta de familiaridade do sistema pode causar confusatildeo ao eleitorcomum em suas primeiras ocorrecircncias No entanto nos paiacuteses em que este eacute utilizadonatildeo parece haver confusatildeo entre os eleitores Aleacutem disso na maioria dos casos haveraacute umcusto potencialmente alto da substituiccedilatildeo ou alteraccedilatildeo dos sistemas das urnas eletrocircnicaspara que seja possiacutevel haver a implementaccedilatildeo do meacutetodo

        Aleacutem disso assim como o TRS este sistema tambeacutem possui natildeo-monotonicidade ouseja um candidato pode ser prejudicado ao ser ranqueado mais alto enquanto que outropode se beneficiar sendo ranqueado mais baixo pelos eleitores (ORNSTEIN 2018) issopode ocorrer quando esse ranqueamento causa alteraccedilotildees na ordem em que os candidatossatildeo eliminados Essa caracteriacutestica se manifesta em fenocircmenos complexos e especiacuteficos epor isso um exemplo de sua ocorrecircncia seraacute abordada em detalhes na seccedilatildeo 43

        233 Voto Uacutetil no IRV

        Como os sistemas de votaccedilatildeo anteriores o IRV natildeo eacute completamente imune ao vototaacutetico No entanto este meacutetodo se mostra bem resistente a eles quando comparado aoutros meacutetodos como o FPTP e o Borda Count (Bartholdi John J III and Orlin JamesB 1990) Distintivamente o IRV requer um maior esforccedilo do eleitor para elaborar umaestrateacutegia que melhor ajuste os resultados da eleiccedilatildeo de acordo com a sua preferecircnciaAleacutem disso eacute necessaacuterio que ele tenha informaccedilatildeo suficiente sobre os rankings de outroseleitores naturalmente obtida atraveacutes de pesquisas eleitorais

        Existe tambeacutem a possibilidade de ocorrer uma exaustatildeo dos votos quando natildeo haacuteo completo preenchimento do ranking por parte dos eleitores Nessas ocasiotildees o votonatildeo pode continuar a ser transferido a outros candidatos e ele eacute descartado Isso afetaa legitimidade do mandato do candidato eleito pois o resultado final natildeo representaraacute100 da populaccedilatildeo votante Essas ocorrecircncias no entanto podem ser minimizadas comuma melhor educaccedilatildeo eleitoral ou como foi implementado na Austraacutelia requerer que osrankings incluam uma totalidade dos candidatos concorrentes

        24

        24 APPROVAL VOTING SYSTEM

        No meacutetodo Approval Voting os eleitores natildeo satildeo limitados pelo nuacutemero de candidatosem que podem votar por isso approval cada eleitor pode votar em todos os candidatos osquais ele aprova Apoacutes as votaccedilotildees o candidato com a maior quantidade de votos eacute eleitoSegundo Hamlin (2015) a cidade de Fargo na Dakota do Norte se tornou a primeiracidade nos EUA a colocar em praacutetica este sistema em suas eleiccedilotildees gerais em novembrode 2018 AVS tambeacutem eacute utilizado para eleger o secretaacuterio-geral das Naccedilotildees Unidas e emdiversas outras organizaccedilotildees

        241 Exemplo

        Na tabela 5 abaixo pode-se encontrar 8 perfis de eleitores com seus candidatos apro-vados e quantidade de eleitores que se encaixam no perfil Na tabela 6 temos o resultadoda contabilizaccedilatildeo dos votos destes perfis O candidato mais popular eacute o B que se encontraaprovado em 5 perfis distintos totalizando 60 votos ou aproximadamente 32

        Tabela 5 ndash Exemplo AVS

        Aprovaccedilotildees Ndeg de eleitoresA 20AB 16B 19

        BDC 6CAB 7CD 15DC 5DCB 12

        Tabela 6 ndash Resultado AVSCandidatos Total de votos

        A 43B 60C 45D 38

        242 Vantagens e Desvantagens do AVS

        Aleacutem de simples este meacutetodo permite um niacutevel maior de expressividade aos eleitoresOnde no FPTP e TRS eles satildeo limitados pelo seu uacutenico voto aqui os eleitores tecircm aliberdade de demonstrar exatamente quais candidatos consideram aptos ou aceitaacuteveis aocargo

        25

        Outro efeito dessa liberdade trazida pelo AVS eacute a dizimaccedilatildeo do spoiler effect Can-didatos de partidos menores natildeo tem como roubar votos de partidos maiores nessesistema ambos os candidatos contabilizariam o voto

        243 Voto Uacutetil no AVS

        O tipo de voto uacutetil no AVS eacute denominado bullet voting Segundo The Center forElection Science (2015) esta taacutetica envolve simplesmente ignorar a possibilidade de votarem mais de um candidato e votar apenas em sua primeira opccedilatildeo Um eleitor pode serlevado a adotar essa estrateacutegia quando percebe que sua preferecircncia pode ser prejudicadacom o voto em alguma segunda opccedilatildeo sua Em um cenaacuterio extremo onde 100 doseleitores adotam esta estrateacutegia as eleiccedilotildees satildeo convertidas a um simples First Past ThePost

        25 THE BORDA COUNT

        Este meacutetodo carrega o nome em homenagem a seu criador Jean-Charles de Bordaque o desenvolveu em 1770 (LIPPMAN 2012) A contagem de Borda utiliza a abordagemde ranqueamento dos candidatos poreacutem de maneira diferente ao IRV Este eacute um sistemaque atribui uma pontuaccedilatildeo aos candidatos com base nestes rankings O candidato na basedo ranking natildeo recebe pontos o candidato imediatamente acima deste recebe 1 pontoo proacuteximo recebe 2 pontos e assim por diante ateacute o topo do ranking As pontuaccedilotildees detodos os rankings satildeo contabilizadas e o candidato com maior pontuaccedilatildeo eacute eleito Deacordo com Lippman variaccedilotildees deste meacutetodo satildeo encontradas em uso na premiaccedilatildeo dediversos esportes como na seleccedilatildeo do MVP(Most Valuable Player) da MLB(principal ligade beisebol dos EUA) e no Trofeacuteu Heisman de futebol americano universitaacuterio

        251 Exemplo

        Neste exemplo seratildeo aproveitados os mesmos rankings apresentados na tabela 3 Porserem 4 candidatos o primeiro colocado de cada ranking receberaacute 3 pontos o segundo 2pontos o terceiro 1 e o quarto 0 Assim o nuacutemero maacuteximo de pontos que um candidatopode atingir eacute igual a 300(se ficar na primeira posiccedilatildeo em todos os rankings) e o nuacutemerototal de pontos no sistema eacute 600 O nuacutemero maacuteximo de pontos que um candidato podeatingir eacute calculado com

        (cminus 1)times e

        Sendo c igual ao nuacutemero de candidatos e e o nuacutemero de eleitores Por sua vez onuacutemero total de pontos no sistema eacute

        26

        (cminus 1)times c2

        times e

        A contagem final dos pontos eacute apresentada na tabela 7 abaixo

        Tabela 7 ndash Resultado BCCandidatos Total de pontos

        A 146B 181C 126D 147

        O candidato eleito eacute o B com 181 pontos ou aproximadamente 60 da pontuaccedilatildeomaacutexima

        252 Vantagens e Desvantagens do BC

        Em comparaccedilatildeo com os meacutetodos abordados anteriormente que apenas consideramas primeiras opccedilotildees de cada eleitor este meacutetodo regularmente escolhe candidatos comaceitaccedilatildeo mais ampla ao inveacutes de uma preferecircncia direta dos eleitores (Electoral ReformSociety 2017b)

        Ele tambeacutem encoraja uma abordagem estrateacutegica por parte dos partidos onde seriade seu interesse nomear mais de um candidato para concorrer pois quanto mais candi-datos estatildeo no paacutereo maior eacute a pontuaccedilatildeo dos primeiros colocados Logo a nomeaccedilatildeo decandidatos menos populares pode beneficiar os principais candidatos de um partido

        253 Voto Uacutetil no BC

        Existem duas estrateacutegias aplicaacuteveis a esse sistema A primeira denominada compromi-sing de maneira similar a outros meacutetodos de votaccedilatildeo se resume em ranquear em primeirolugar um dos candidatos que estejam liderando as eleiccedilotildees mesmo que este natildeo seja suapreferecircncia real A segunda estrateacutegia burying eacute o oposto esta se baseia em ranquearem uacuteltimo lugar um dos candidatos liacutederes mesmo que este natildeo seja o seu candidato demaior desgosto Ambas estrateacutegias podem ser aplicadas ao mesmo tempo por um eleitor

        26 SCORE VOTING SYSTEM

        Score Voting ou Range Voting como tambeacutem eacute conhecido eacute mais um meacutetodo quetenta trazer maior liberdade de expressatildeo aos eleitores Assim como o Borda Counteste sistema funciona baseado na pontuaccedilatildeo dos candidatos no entanto ao inveacutes dessapontuaccedilatildeo ser relativa agrave posiccedilatildeo do candidato no ranking de cada eleitor este por sua veztem completa liberdade de atribuir qualquer quantidade de pontos aos candidatos dentro

        27

        de determinada escala Um eleitor pode dar o mesmo nuacutemero de pontos para diferentescandidatos e apoacutes o somatoacuterio de todas as pontuaccedilotildees o candidato com a pontuaccedilatildeo maisalta eacute eleito Incorporado ao escopo poliacutetico o SVS eacute utilizado no Partido Pirata Alematildeobem como em diversas organizaccedilotildees tais como o Fedora Project e Mozilla e tambeacutem emvariados esportes oliacutempicos e reality shows como o American Idol aponta Hamlin (2015)

        261 Exemplo

        Neste exemplo temos apresentados na tabela 8 abaixo 4 perfis distintos de eleitorese suas respectivas atribuiccedilotildees de pontos aos 4 candidatos Cada eleitor pode atribuirqualquer pontuaccedilatildeo a um candidato dentro da escala de -10 a 10 O resultado da eleiccedilatildeoapoacutes a soma de todos os pontos por candidato se encontra na tabela 9 onde o candidatoA eacute eleito com um total de 605 pontos

        Tabela 8 ndash Exemplo SVS

        Perfil A B C D Ndeg de eleitores1 10 -1 5 2 362 6 9 -3 4 253 2 0 8 4 224 3 3 3 10 17

        Tabela 9 ndash Resultado SVSCandidatos Total de pontos

        A 605B 240C 332D 430

        262 Vantagens e Desvantagens do SVS

        A grande vantagem do SVS eacute como ele proporciona aos eleitores expressar de maneiramuito proacutexima potencialmente exata suas impressotildees poliacuteticas de cada candidato Eleeacute ainda mais expressivo que o AVS Dessa maneira o spoiler effect tambeacutem se torna nuloao passo que toda intenccedilatildeo de voto eacute precisamente representada neste sistema

        Assim como outros meacutetodos eleitorais este sofre igualmente dos males produzidos pelovoto taacutetico Sua principal desvantagem eacute discutida na seccedilatildeo abaixo

        263 Voto Uacutetil no SVS

        Da mesma maneira que no Approval Voting atraveacutes do bullet voting o SVS tambeacutempode ser convertido em uma eleiccedilatildeo sob o meacutetodo FPTP em um cenaacuterio com um grande

        28

        volume de eleitores maliciosos O voto uacutetil sob este sistema se manifesta pontuando-seapenas um candidato com uma nota positiva e todos os outros com as notas mais baixasda escala Se todos os eleitores se aproveitarem dessa abordagem natildeo existiraacute distinccedilatildeoefetiva entre uma eleiccedilatildeo sob SVS e FPTP Essencialmente cada eleitor estaacute votando emapenas um candidato Essa eacute a principal desvantagem do SVS e ela consegue eliminarsua principal vantagem dar ao eleitor um poder maior de expressatildeo

        27 BLOC VOTE

        O Bloc Vote eacute um meacutetodo utilizado para a eleiccedilatildeo de candidatos a cargos no governocom mais de uma vacacircncia Pode ser considerado um meio-termo entre o FPTP e oAVS pois os eleitores podem votar em mais de um candidato poreacutem satildeo limitados pelonuacutemero de vagas Em uma eleiccedilatildeo com duas vagas por exemplo cada eleitor selecionaraacutedois candidatos ou menos Sensatamente o candidato mais votado eacute eleito Ele possuialgumas utilizaccedilotildees em eleiccedilotildees locais em algumas partes da Inglaterra (Electoral ReformSociety 2017a)

        271 Exemplo

        Neste exemplo dois candidatos seratildeo eleitos logo cada eleitor votaraacute em no maacuteximodois candidatos A distribuiccedilatildeo de votos pode ser conferida na tabela 10 e o resultado dacontagem de votos na tabela 11 abaixo Os candidatos eleitos satildeo o C totalizando 78do maacuteximo de votos possiacuteveis para um candidato e o A com 43

        Tabela 10 ndash Exemplo BV

        Aprovaccedilotildees Ndeg de eleitoresAC 20AB 16BC 19BD 6CA 7CD 15DC 17

        Tabela 11 ndash Resultado BVCandidatos Total de votos

        A 43B 41C 78D 38

        29

        272 Voto Uacutetil no BV

        Neste sistema eacute possiacutevel que um eleitor evite votar em sua primeira opccedilatildeo quandoeste natildeo tem chances de vitoacuteria e se fazendo isto ele diminuiraacute as chances de algum outrocandidato de seu desgosto ganhar Poreacutem o sistema previne um outro tipo de voto uacutetilEm eleiccedilotildees com mais de uma vaga onde os eleitores soacute podem votar em um candidatose um eleitor sabe que sua primeira opccedilatildeo tambeacutem eacute a primeira opccedilatildeo da maior parteda populaccedilatildeo e portanto muito provavelmente seraacute um dos candidatos eleitos eacute possiacutevelque ele arrisque votar em uma segunda opccedilatildeo sua na esperanccedila de a longo prazo elegersuas duas principais opccedilotildees de voto Com os eleitores podendo votar no nuacutemero exato devagas disponiacuteveis esse tipo de pensamento taacutetico perde o sentido

        30

        3 O SIMULADOR

        Para este trabalho foi implementado um simulador eleitoral na forma de uma aplicaccedilatildeoweb para que a interaccedilatildeo do usuaacuterio fosse facilitada Veremos a seguir como se daacute suautilizaccedilatildeo de forma geral

        Figura 2 ndash Captura de tela 1

        Figura 3 ndash Captura de tela 2

        A primeira opccedilatildeo encontrada pelo usuaacuterio eacute a escolha de quais sistemas de votaccedilatildeo se-ratildeo simulados (Figura 2) Todos eles podem ser selecionados para rodar simultaneamentePoreacutem natildeo eacute permitido rodar uma simulaccedilatildeo do Bloc Vote para uma eleiccedilatildeo onde apenasum candidato eacute eleito aleacutem disso natildeo existe implementaccedilatildeo dos meacutetodos TRS e IRV para

        31

        eleiccedilotildees com mais de um candidato eleito jaacute que eles se comportariam exatamente comono FPTP

        A maioria das linguagens de programaccedilatildeo senatildeo todas possuem um gerador de nuacuteme-ros pseudoaleatoacuterios que fornece a possibilidade de definir uma seed para o gerador Estaseed funciona como um ponto de partida para a geraccedilatildeo dos nuacutemero e portanto todasimulaccedilatildeo que rodar com a mesma seed sempre teraacute os mesmos resultados Se nenhumvalor for fornecido pelo usuaacuterio o tempo atual do sistema eacute utilizado As opccedilotildees subse-quentes satildeo a escolha do nuacutemero de eleitores gerados e o nuacutemero de vagas (Figura 3) Senenhum valor for fornecido o nuacutemero de eleitores padratildeo utilizado eacute 1000 e o nuacutemero devagas igual a 1

        Figura 4 ndash Captura de tela 3

        Este simulador possui dois modos para a criaccedilatildeo dos rankings dos eleitores No modoManipulate (Figura 4) primeiramente se define o nuacutemero de candidatos atraveacutes do campode entrada ao lado do tiacutetulo Candidates ou alternativamente pode-se adicionar candida-tos um a um atraveacutes do sinal de mais na parte inferior da paacutegina Para cada candidatoeacute possiacutevel definir a porcentagem de seus eleitores que optaraacute pelo voto taacutetico e pelovoto de minoria Tambeacutem eacute possiacutevel alterar o nome dos candidatos se for do interessedo usuaacuterio

        32

        Figura 5 ndash Captura de tela 4

        Figura 6 ndash Captura de tela 5

        33

        Figura 7 ndash Captura de tela 6

        Apoacutes a criaccedilatildeo dos candidatos o usuaacuterio pode criar perfis de eleitores que definiratildeo demaneira exata como partes da populaccedilatildeo iraacute votar (Figura 5) Em cada perfil se defineo valor em porcentos da populaccedilatildeo votante que o adotaraacute e a nota de cada candidatoTambeacutem eacute possiacutevel nomear cada perfil livremente

        No modo Generate (Figura 6) eacute onde o gerador de nuacutemeros pseudoaleatoacuterios eacute usadoNesse modo ao inveacutes do usuaacuterio criar perfis de eleitores ele define qual seraacute a distribuiccedilatildeoadotada para a geraccedilatildeo de notas de cada candidato Essas distribuiccedilotildees seratildeo mais bemdetalhadas no Capiacutetulo 5 Da mesma maneira que no modo Manipulate nesse modotambeacutem eacute possiacutevel definir os valores para os dois tipos de voto uacutetil os votos taacuteticos eos votos de minoria No primeiro estatildeo incluiacutedas as estrateacutegias de mudanccedila de votoespeciacuteficas de cada sistema como o bullet voting no AVS e SVS ou quando a preferecircnciade um eleitor claramente natildeo possui chances de vitoacuteria e ele muda seu voto para um doscandidatos que esteja na lideranccedila o que ocorre no FPTP e TRS O voto de minoriase apresenta apenas no FPTP em eleiccedilotildees onde mais de um candidato eacute eleito Se apreferecircncia de um eleitor claramente lidera a eleiccedilatildeo por ser tambeacutem a preferecircncia damaior parte da populaccedilatildeo esse eleitor pode mudar o seu voto para uma segunda opccedilatildeona esperanccedila de eleger dois de seus candidatos favoritos

        Por fim em ambos os modos o usuaacuterio tem a opccedilatildeo de definir coalizotildees entre oscandidatos se o sistema TRS estiver habilitado pois as coalizotildees apenas se manifestamnesse sistema Essas coalizotildees alteraratildeo as notas dos candidatos dependendo dos outroscandidatos pertencentes a elas (Figura 7)

        A aplicaccedilatildeo pode ser encontrada na paacutegina httpelectionsimpythonanywherecom

        34

        4 CENAacuteRIOS PERTINENTES

        Para todos os cenaacuterios deste capiacutetulo seraacute usada a seed do simulador igual a 100 e apopulaccedilatildeo de eleitores igual a 1000 para que exista consistecircncia na anaacutelise e tambeacutem paraque possa haver replicaccedilatildeo dos resultados se necessaacuterio

        41 CENAacuteRIO 1 VOTO TAacuteTICO

        Neste exemplo teremos quatro candidatos Ana Beto Carla e Diego Ana e Betoseratildeo gerados a partir da distribuiccedilatildeo Neutral (Figura 47) Carla da distribuiccedilatildeo Disliked(Figura 51) e Diego da Hated (Figura 55) Para a simulaccedilatildeo com a seed 100 o melhorcandidato a ser eleito ou seja aquele que maximiza a meacutedia das notas dos eleitores eacute oBeto com uma meacutedia de 0073 Para cada sistema seratildeo comparados os resultados semvoto taacutetico aos com 20 de voto taacutetico a favor da Ana Abaixo se encontram osresultados para o sistema FPTP

        Figura 8 ndash FPTP - Cenaacuterio 1 sem voto taacutetico

        Figura 9 ndash TRS segundo turno - Cenaacuterio 1 sem voto taacutetico

        35

        Figura 10 ndash IRV primeiro turno - Cenaacuterio 1

        Figura 11 ndash IRV segundo turno - Cenaacuterio 1

        Figura 12 ndash IRV terceiro turno - Cenaacuterio 1

        36

        Figura 13 ndash AVS - Cenaacuterio 1 sem voto taacutetico

        Figura 14 ndash BC - Cenaacuterio 1 sem voto taacutetico

        Figura 15 ndash SVS - Cenaacuterio 1 sem voto taacutetico

        37

        Nesse cenaacuterio sem voto taacutetico o uacutenico sistema que natildeo elege o Beto eacute o AVS Todosos outros elegem o melhor candidato Ou seja apesar de Beto ter uma melhor meacutediadas notas dos eleitores existem mais eleitores que ranqueiam Ana com uma nota acimade 0 No entanto apenas 20 dos eleitores de Diego e Carla que preferem a Ana aoinveacutes do Beto satildeo o suficiente para fazer Beto natildeo ser eleito se eles decidirem abandonarsua primeira opccedilatildeo e votar na Ana Considerando a vantagem que os votos taacuteticosproporcionam agrave Ana esta eacute eleita em todos os sistemas menos o TRS e o IRV

        Figura 16 ndash FPTP - Cenaacuterio 1 - 20 de voto taacutetico na Ana

        Figura 17 ndash TRS segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

        38

        Figura 18 ndash IRV primeiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

        Figura 19 ndash IRV segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

        Figura 20 ndash IRV terceiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

        39

        Figura 21 ndash AVS - Cenaacuterio 1 20 de voto taacutetico na Ana

        Figura 22 ndash BC - Cenaacuterio 1 20 de voto taacutetico na Ana

        Figura 23 ndash SVS - Cenaacuterio 1 20 de voto taacutetico na Ana

        40

        Eacute claro que se os eleitores que preferem o Beto tambeacutem votassem de maneira estra-teacutegica a situaccedilatildeo se equilibraria e haveria o mesmo niacutevel de concorrecircncia entre os doiscandidatos que ocorre quando natildeo haacute voto taacutetico Poreacutem no Borda Count esse equiliacute-brio pode natildeo acontecer e as estrateacutegias de compromising e burying podem acabar saindopela culatra se uma porcentagem elevada dos eleitores as adotarem Abaixo encontram-seos resultados para esse sistema quando 100 dos eleitores de Carla e Diego se comportammaliciosamente

        Figura 24 ndash BC - Cenaacuterio 1 100 de voto taacutetico na Ana e Beto

        Por causa do uso demasiado da estrateacutegia burying Ana e Beto perdem muitos pontose isso abre espaccedilo para uma vitoacuteria da Carla No entanto para porcentagens menores que100 o Beto ainda eacute o vencedor

        Essas duas estrateacutegias tambeacutem foram implementadas nesse simulador para o sistemaIRV e eacute possiacutevel ver como ele eacute resistente a elas Para que seja possiacutevel mudar os resultadosde uma eleiccedilatildeo sob o IRV eacute necessaacuterio mudar a ordem de eliminaccedilatildeo dos candidatos paraque o seu candidato preferido acabe enfrentando um candidato mais fraco nas rodadasfinais Isso natildeo ocorre com compromising e burying No proacuteximo cenaacuterio seraacute analisadacomo eacute possiacutevel modificar os resultados de uma eleiccedilatildeo sob o IRV

        Esses resultados podem ser replicados acessando os linksSem votos taacuteticos lthttpelectionsimpythonanywherecomdirect_res1111110

        --[0021][22Ana2222Beto222022Carla2222Diego22]------100gt

        Com 20 de voto taacutetico lthttpelectionsimpythonanywherecomdirect_res1111110--[0021][22Ana222022Beto2222Carla2222Diego22]1-[02000]---100gt

        Com 100 de voto taacuteticona Ana e Beto lthttpelectionsimpythonanywherecomdirect_res0000100--[0021][22Ana222022Beto222022Carla2222Diego22]1-[101000]---100gt

        41

        42 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV

        Neste cenaacuterio teremos Ana Carla e Beto concorrendo e trecircs perfis distintos que apoiamcada candidato As distribuiccedilotildees de notas dos perfis se encontram na tabela abaixo

        Tabela 12 ndash Distribuiccedilatildeo de notas - Cenaacuterio 2

        Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

        deeleitores

        1 10 5 0 422 0 10 5 303 5 0 10 28

        Com essas distribuiccedilotildees Carla eacute eliminada na primeira rodada e seus 28 de votossatildeo transferidos para a segunda opccedilatildeo de seus eleitores Ana que eacute eleita com 70 dosvotos e uma meacutedia de 56

        Figura 25 ndash IRV primeiro turno - Cenaacuterio 2

        Figura 26 ndash IRV segundo turno - Cenaacuterio 2

        42

        Cientes desse provaacutevel futuro cenaacuterio onde Ana eacute eleita uma pequena parte dos elei-tores de Beto estrategicamente o abandona e decide apoiar Carla na esperanccedila de leva-laao segundo turno contra Ana As novas distribuiccedilotildees de notas se encontram na tabelaabaixo com essa porccedilatildeo de eleitores representada pelo perfil 4

        Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2

        Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

        deeleitores

        1 10 5 0 422 0 10 5 283 5 0 10 284 0 8 10 2

        Essa mudanccedila estrateacutegica de voto altera a ordem de eliminaccedilotildees do sistema com Betosendo o primeiro a ser eliminado Com isso seus votos satildeo naturalmente transferidos paraCarla que derrota Ana no segundo turno com 58 dos votos

        Figura 27 ndash IRV primeiro turno com voto taacutetico - Cenaacuterio 2

        Figura 28 ndash IRV segundo turno com voto taacutetico - Cenaacuterio 2

        43

        Percebendo que a eleiccedilatildeo de Beto natildeo era provaacutevel seus eleitores conseguiram aomenos impedir a eleiccedilatildeo do pior candidato para eles Mas para isso foi necessaacuterio queeles tivessem a informaccedilatildeo de como os outros eleitores votariam Uma aproximaccedilatildeo dessasinformaccedilotildees poderia ser obtida em um cenaacuterio real com poucos candidatos atraveacutes depesquisas eleitorais poreacutem se o nuacutemero de candidatos eacute significativo uma noccedilatildeo completadas distribuiccedilotildees dos rankings dos eleitores se torna muito menos viaacutevel e dificulta aformulaccedilatildeo de estrateacutegias para alterar a ordem em que os candidatos satildeo eliminados

        Esses resultados podem ser replicados acessando os linksSem voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana22

        22Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

        Com voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana

        2222Beto2222Carla22]-----42Voter20Profile2001020520028Voter20Profile2010201020528Voter20Profile202520020102Voter20Profile20302082010100gt

        43 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE

        O interessante dos sistemas IRV e TRS eacute que os resultados do cenaacuterio anterior po-deriam ter sido obtidos ao inveacutes do voto taacutetico pela sua natildeo-monotonicidade Seriapossiacutevel que a Carla derrotasse a Ana no segundo turno atraveacutes do proacuteprio aumento depopularidade da Ana Assumindo que essa popularizaccedilatildeo ocorresse entre os candidatosdo perfil 2 onde 3 passasse a apoiar a Ana ao inveacutes do Beto as novas distribuiccedilotildeesseguiriam a tabela abaixo

        Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

        Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

        deeleitores

        1 10 5 0 452 0 10 5 273 5 0 10 28

        Dessa maneira Beto agora com uma porcentagem dos eleitores menor do que a deCarla seraacute eliminado na primeira rodada e como seus eleitores tecircm a Carla como segundaopccedilatildeo ela receberaacute todos os seus votos e seraacute eleita na segunda rodada As rodadas doIRV podem ser vistas nas figuras 29 e 30

        44

        Figura 29 ndash IRV primeiro turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

        Figura 30 ndash IRV segundo turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

        Tabela 15 ndash Resultados do Cenaacuterio 3Candidato

        eleitoMeacutedia das

        notasAntes da

        popularizaccedilatildeode Ana

        Ana 56

        Apoacutespopularizaccedilatildeo

        de AnaCarla 415

        Os efeitos dessa caracteriacutestica se refletem na satisfaccedilatildeo meacutedia da populaccedilatildeo A Ana eacuteclaramente a melhor candidata e mesmo com o seu ganho de popularidade (ou devido aele) a Carla eacute eleita

        Esses resultados podem ser replicados acessando os linksAntes da popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecom

        direct_res0010000---[22Ana2222Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

        45

        Apoacutes popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana2222Beto2222Carla22]-----45Voter20Profile2001020520027Voter20Profile2010201020528Voter20Profile20252002010100gt

        44 CENAacuteRIO 4 COALIZOtildeES

        O TRS por ser organizado em dois turnos separados normalmente a semanas dedistacircncia um do outro acaba abrindo brecha agrave mudanccedila de opiniatildeo por parte dos eleitorese o desenvolvimento de novas estrateacutegias por parte dos candidatos tais como a coalizatildeocom candidatos jaacute eliminados Com isso em mente nesse cenaacuterio teremos novamenteos quatro candidatos Ana Beto Carla e Diego Os trecircs primeiros seratildeo gerados dadistribuiccedilatildeo Neutral e Diego da distribuiccedilatildeo Disliked

        Figura 31 ndash TRS turno 1 - Cenaacuterio 4

        No TRS normal Ana Beto e Carla possuem com essas distribuiccedilotildees quantidades devotos muito proacuteximas com Beto e Carla indo para o segundo turno Carla estaacute 10 votosatraacutes de Beto e decide aproveitar o espaccedilo de tempo entre os dois turnos para tentaragregar mais votos Com isso Carla se aproxima de Diego e juntos formam uma coalizatildeoNo entanto com sua baixa popularidade Diego acaba ferindo a reputaccedilatildeo de Carla etorna o segundo turno muito mais faacutecil para Beto (Figura 33) Se Carla tivesse buscado osuporte de Ana por outro lado ela se veria vitoriosa no segundo turno e com uma amplavantagem sobre o Beto (Figura 34) Ou ateacute mesmo sem buscar uma coalizatildeo mesmosendo uma corrida apertada Carla teria naturalmente sido eleita (Figura 32)

        Esses resultados podem ser replicados acessando os linksSem coalizotildees lthttpelectionsimpythonanywherecomdirect_res0100000

        --[0002][22Ana222022Beto2222Carla2222Diego22]------100gt

        46

        Figura 32 ndash TRS turno 2 - Cenaacuterio 4

        Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4

        Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4

        47

        Coalizatildeo Carla e Diego lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2203Carla20Diego-100gt

        Coalizatildeo Carla e Ana lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2200Carla20Ana-100gt

        45 CENAacuteRIO 5 DILEMA DO PRISIONEIRO

        Neste cenaacuterio temos uma eleiccedilatildeo de uma vaga com trecircs candidatos concorrentes e trecircsperfis distintos de eleitores que seguiratildeo as seguintes distribuiccedilotildees

        Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5

        Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

        deeleitores

        1 10 -10 5 362 -10 10 5 343 -10 -10 5 30

        Esse contexto nos remete ao notaacutevel dilema do prisioneiro Nele dois prisioneiroscuacutemplices satildeo interrogados individualmente sem poder se comunicar um com o outro ecada um enfrenta o dilema de delatar ou natildeo o seu parceiro Se os dois prisioneirosdecidem se manter calados sobre o crime ambos satildeo sentenciados a um ano de prisatildeo Seapenas um deles dedurar o outro o traidor sai livre enquanto seu parceiro eacute condenadoa trecircs anos Se ambos dedurarem um ao outro eles satildeo condenados juntos a dois anosde prisatildeo Esse dilema eacute uma ideia claacutessica presente no estudo da teoria dos jogos sendooriginalmente elaborada por Merrill Flood e Melvin Dresher em 1950 e mais tarde sendonomeada de dilema dos prisioneiros por Albert W Tucker (POUNDSTONE 1992)

        O que esse dilema nos mostra eacute a tentaccedilatildeo que o indiviacuteduo deteacutem se sua racionalizaccedilatildeoestiver voltada para seus proacuteprios interesses e somente eles em oposiccedilatildeo a pensar no bemdo grupo como um todo Neste cenaacuterio encontramos dois grupos de eleitores expressiva-mente opostos os perfis 1 e 2 Se qualquer uma das preferecircncias desses perfis fosse eleitaisso significaria uma alta rejeiccedilatildeo de maior parte da populaccedilatildeo No entanto eles possuema segunda opccedilatildeo em comum a Carla que por sua vez eacute a preferecircncia do terceiro perfilPortanto a eleiccedilatildeo da Carla seria logicamente o resultado oacutetimo

        Mesmo assim a Ana eacute eleita nos dois sistemas acima o que natildeo parece justo poispela tabela 16 eacute evidente que apenas 36 da populaccedilatildeo a aprova enquanto que os outros64 a reprovam ao maacuteximo O sistema IRV se comporta de maneira idecircntica ao TRS

        48

        Figura 35 ndash FPTP - Cenaacuterio 5

        Figura 36 ndash TRS segundo turno - Cenaacuterio 5

        nesta situaccedilatildeo Com esse resultado a meacutedia das notas eacute -28 No entanto os trecircs sistemasseguintes nos apresentam resultados diferentes

        Tabela 17 ndash Resultados do Cenaacuterio 5

        Sistema Candidatoeleito

        Meacutedia dasnotas

        FPTP Ana -28TRS Ana -28IRV Ana -28AVS Carla 50BC Carla 50SVS Carla 50

        49

        Figura 37 ndash AVS - Cenaacuterio 5

        Figura 38 ndash BC - Cenaacuterio 5

        Tanto o AVS quanto o Borda Count e o SVS satildeo sistemas que consideram todasas opiniotildees de cada eleitor ao mesmo tempo e por isso satildeo capazes de eleger o melhorcandidato nesta situaccedilatildeo diferentemente do TRS que natildeo absorve completamente todosentimento do eleitor por todos os candidatos e o IRV que apesar de ser bem expressivoquebra esse processo em inuacutemeras rodadas o que permite a perda de informaccedilatildeo ao longodelas

        Esses resultados podem ser replicados acessando o linklthttpelectionsimpythonanywherecomdirect_res1111110---[22Ana

        222022Beto222022Carla22]-----36Voter20Profile2001020-1020534Voter20Profile201-10201020530Voter20Profile202-1020-10205100gt

        50

        Figura 39 ndash SVS - Cenaacuterio 5

        46 CENAacuteRIO 6 VOTO DE MINORIA

        Neste cenaacuterio temos uma eleiccedilatildeo com quatro candidatos e duas vagas A Ana seraacutea preferecircncia de uma extensa parte da populaccedilatildeo (distribuiccedilatildeo Loved Figura 53) Betoe Carla seratildeo candidatos razoavelmente populares (distribuiccedilatildeo Neutral Figura 47) eDiego seraacute a preferecircncia de apenas um pequeno grupo especiacutefico e rejeitado pela maioria(distribuiccedilatildeo Disliked Figura 51) Eacute intuitivo esperar que os dois candidatos eleitos seratildeoa Ana e ou o Beto ou a Carla e isso eacute exatamente o que ocorre na figura 40 no sistemaFPTP sem voto de minoria

        Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria

        Eacute evidente a discrepacircncia da quantidade de votos da Ana para os outros candidatose apesar de Beto e Carla serem mais populares que Diego os trecircs natildeo se encontrammuito afastados Poreacutem se a pequena fraccedilatildeo de candidatos que possuem a Ana como

        51

        Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego

        preferecircncia e Diego como segunda opccedilatildeo optarem pelo voto de minoria a situaccedilatildeo mudacompletamente (Figura 41) Assim apesar de extensamente rejeitado Diego conquistaa segunda vaga e a meacutedia das notas despenca de 2929 para 0505 No entanto aindaexiste um cenaacuterio pior Se os outros grupos de eleitores pensarem da mesma forma eevitarem votar na Ana achando que sua eleiccedilatildeo jaacute estaacute assegurada apenas 80 de votode minoria para esses grupos jaacute eacute o suficiente para eliminaacute-la das eleiccedilotildees (Figura 42)Com a Ana eliminada a meacutedia das notas cai ainda mais para 0058

        Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego

        O sistema Bloc Vote eacute uma das soluccedilotildees para o voto de minoria Permitindo queos eleitores votem no mesmo nuacutemero de candidatos que de vagas a serem preenchidasnatildeo existe o iacutempeto a esse tipo de voto estrateacutegico O resultado desse sistema portantoretorna a meacutedia das notas a casa dos 29 (Figura 43) Os sistemas AVS Borda Count eSVS tambeacutem impedem a presenccedila do voto de minoria e atingem resultados semelhantes

        52

        Figura 43 ndash BV - Cenaacuterio 6

        Tabela 18 ndash Resultados do Cenaacuterio 6

        Sistema Candidatoseleitos

        Meacutedia dasnotas

        FPTP sem voto de minoriaAna eBeto 2929

        FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

        FPTP com 80 de voto de minoriaBeto eCarla 0058

        Bloc VoteAna eCarla 2913

        Esses resultados podem ser replicados acessando os links

        Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

        100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

        80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

        53

        5 COMO FUNCIONA O SIMULADOR

        O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

        51 CLASSE ELECTIONS

        Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

        bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

        Figura 44 ndash estrutura candidates

        bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

        bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

        Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

        Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

        54

        Figura 45 ndash estrutura voters

        Figura 46 ndash estrutura votes

        daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

        Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

        55

        Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

        Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

        na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

        56

        Figura 49 ndash PDF - Distribuiccedilatildeo Liked

        Figura 50 ndash CDF - Distribuiccedilatildeo Liked

        (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

        Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

        57

        Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

        Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

        candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

        Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

        58

        Figura 53 ndash PDF - Distribuiccedilatildeo Loved

        Figura 54 ndash CDF - Distribuiccedilatildeo Loved

        funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

        59

        Figura 55 ndash PDF - Distribuiccedilatildeo Hated

        Figura 56 ndash CDF - Distribuiccedilatildeo Hated

        Meacutedia das Notas sumei

        sumvj nij

        etimes v

        Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

        Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

        60

        Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

        Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

        52 CLASSE FIRSTPASTTHEPOST

        Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

        Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

        61

        Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

        Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

        mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

        62

        53 CLASSE TWOROUNDSYSTEM

        A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

        54 CLASSE INSTANTRUNOFFVOTING

        A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

        Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

        63

        cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

        55 CLASSE APPROVALVOTING

        Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

        56 CLASSE BORDACOUNT

        Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

        57 CLASSE SCOREVOTING

        De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

        64

        58 CLASSE BLOCVOTE

        O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

        59 TECNOLOGIAS UTILIZADAS

        A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

        Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

        O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

        Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

        65

        6 CONCLUSAtildeO

        Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

        Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

        Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

        Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

        Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

        66

        REFEREcircNCIAS

        AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

        Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

        Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

        Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

        HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

        LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

        ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

        Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

        POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

        The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

        67

        APEcircNDICES

        APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

        Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

        if(not len(selfvoter_profiles))

        for voter in range(selfN_VOTERS)

        candidates_rank = dict()

        for candidate in reversed(range(selfN_CANDIDATES))

        if(selfBIAS_VECTOR[candidate]==4)

        candidates_rank[candidate] = self_sortear(selfloved)

        elif(selfBIAS_VECTOR[candidate]==3)

        candidates_rank[candidate] = self_sortear(selfliked)

        elif(selfBIAS_VECTOR[candidate]==2)

        candidates_rank[candidate] = self_sortear(selfdisliked)

        elif(selfBIAS_VECTOR[candidate]==1)

        candidates_rank[candidate] = self_sortear(selfhated)

        elif(selfBIAS_VECTOR[candidate]==-1)

        candidates_rank[candidate] = self_sortear(selfpolarizer

        )

        elif(selfBIAS_VECTOR[candidate]==-2)

        candidates_rank[candidate] = self_sortear(self

        more_polarizer)

        else

        candidates_rank[candidate] = self_sortear(selfneutral)

        selfvotersappend(candidates_rank)

        else

        ranges = []

        ranks = []

        for prof in selfvoter_profiles

        rangesappend(int(prof[pop_percentage]))

        rank =

        for index score in enumerate(prof[scores])

        rank[index] = score

        ranksappend(rank)

        for index _range in enumerate(ranges)

        for _ in range(int(selfN_VOTERS(_range100)))

        selfvotersappend(ranks[index])

        68

        APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

        Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

        for i in range(selfN_CANDIDATES)

        selfcandidates[i] = 0

        selfvotes[i] = set()

        APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

        Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

        for candidate in range(selfN_CANDIDATES)

        rating_sum = 0

        for voter in selfvoters

        rating_sum += voter[candidate]

        selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

        APEcircNDICE D ndash MEacuteTODO GET_MEAN

        Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

        if len(winners) gt 1 or selfN_CANDIDATES gt 10

        return selfcalculate_mean(winners)

        else

        chose_best = True if winners[0] == selfbest_candidate else

        False

        return selfstats[rsquomeansrsquo][winners[0]] chose_best

        69

        APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

        Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

        rating_sum = 0

        for voter in selfvoters

        for candidate in winners

        rating_sum += voter[candidate]

        return rating_sum(selfN_VOTERSselfN_VACANCIES) False

        APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

        Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

        for i in range(1 selfN_VACANCIES + 2)

        selfleading_candidatesappend(selfsorted_candidates[-i][self

        CANDIDATE_INDEX])

        APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

        Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

        for leader in selfelecrounds[-1]

        selfleading_candidatesappend(leader[0])

        70

        APEcircNDICE H ndash MEacuteTODO SORT_RANKS

        Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

        self_account_for_coalitions()

        for voter in selfvoters

        selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

        (1)))

        temp = []

        for voter in selfsorted_voters

        new_dict = defaultdict(list)

        for k in voter

        new_dict[k[1]]append(k[0])

        tempappend(new_dict)

        selfsorted_voters = []

        for voter_index current_voter in enumerate(temp)

        new_voter = []

        for rating candidate_indexes in current_voteritems()

        if len(current_voter[rating]) gt 1

        shuffle(current_voter[rating])

        for e in candidate_indexes

        new_voterappend((e rating))

        else

        new_voterappend((candidate_indexes[0] rating))

        selfsorted_votersappend(new_voter)

        selfcandidates[new_voter[-1][0]] += 1

        selfvotes[new_voter[-1][0]]add(voter_index)

        71

        APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

        Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

        for candidate in selfvotes_copy

        if candidate not in selfelecleading_candidates

        for voter_index in selfvotes_copy[candidate]

        for index _candidate in enumerate(reversed(selfelec

        sorted_voters[voter_index]))

        if _candidate[selfelecCANDIDATE_INDEX] in selfelec

        leading_candidates

        if randomrandom() lt selfelec

        tactical_vote_percentages[_candidate[selfelec

        CANDIDATE_INDEX]]

        selfrankings_changed[voter_index] = copy

        deepcopy(selfelecsorted_voters[voter_index])

        selfrankings_changed[voter_index][-(index + 1)]

        selfrankings_changed[voter_index][-1] = self

        rankings_changed[voter_index][-1] self

        rankings_changed[voter_index][-(index + 1)]

        selfcandidates[candidate] -= 1

        selfcandidates[_candidate[selfelec

        CANDIDATE_INDEX]] += 1

        selfvotes[candidate]remove(voter_index)

        selfvotes[_candidate[selfelecCANDIDATE_INDEX

        ]]add(voter_index)

        break

        break

        72

        APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

        Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

        half_vacancies = mathfloor(selfelecN_VACANCIES2)

        for candidate in selfelecleading_candidates

        if selfelecleading_candidatesindex(candidate) gt= half_vacancies

        continue

        for voter_index in selfvotes_copy[candidate]

        if voter_index in selfrankings_changed

        ranking = selfrankings_changed[voter_index]

        else

        ranking = copydeepcopy(selfelecsorted_voters[voter_index

        ])

        for index _candidate in enumerate(reversed(ranking))

        if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

        leading_candidates or (_candidate[selfelec

        CANDIDATE_INDEX] in selfelecleading_candidates and

        selfelecleading_candidatesindex(_candidate[selfelec

        CANDIDATE_INDEX]) gt= half_vacancies)

        if _candidate[selfelecCANDIDATE_RANK] gt= 0

        if randomrandom() lt selfelec

        minority_vote_percentages[_candidate[selfelec

        CANDIDATE_INDEX]]

        selfcandidates[candidate] -= 1

        selfcandidates[_candidate[selfelec

        CANDIDATE_INDEX]] += 1

        break

        break

        break

        73

        APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

        Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

        self_account_for_coalitions()

        for candidate in selfvotes

        if candidate = selfwinner and candidate = selfsecond_place

        for voter_index in selfvotes[candidate]

        if voter_index in selfrankings_changed

        ranking = selfrankings_changed[voter_index]

        else

        ranking = copydeepcopy(selfelecsorted_voters[

        voter_index])

        for index2 candidate in enumerate(reversed(ranking))

        if candidate[selfelecCANDIDATE_INDEX] == selfwinner

        selfcandidates[selfwinner] += 1

        selfvotes[selfwinner]add(voter_index)

        break

        elif candidate[selfelecCANDIDATE_INDEX] == self

        second_place

        selfcandidates[selfsecond_place] += 1

        selfvotes[selfsecond_place]add(voter_index)

        break

        selfsorted_candidates = selfelecsort_candidates(selfcandidates)

        winners = []

        vacancies = selfelecN_VACANCIES

        for candidate in reversed(selfsorted_candidates)

        if vacancies == 0

        break

        winnersappend(candidate[0])

        vacancies -= 1

        mean chose_best = selfelecget_mean(winners = winners)

        74

        APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

        Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

        for voter_index voter in enumerate(selfelecsorted_voters)

        voter_dict = dict()

        og_voter_dict = dict()

        for tup in voter

        voter_dict[tup[0]] = tup[1]

        og_voter_dict[tup[0]] = tup[1]

        for coalition in selfeleccoalitions

        for candidate in coalition

        add_to_score = 0

        for candidate2 in coalition

        if candidate == candidate2

        continue

        half = og_voter_dict[candidate2[rsquovaluersquo]]2

        if half lt 0

        add_to_score += mathceil(half)

        else

        add_to_score += mathfloor(half)

        if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

        voter_dict[candidate[rsquovaluersquo]] = 10

        elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

        voter_dict[candidate[rsquovaluersquo]] = -10

        else

        voter_dict[candidate[rsquovaluersquo]] += add_to_score

        selfrankings_changed[voter_index] = []

        for candidate in voter_dict

        selfrankings_changed[voter_index]append((candidate voter_dict[

        candidate]))

        selfrankings_changed[voter_index] = sorted(selfrankings_changed[

        voter_index] key=lambda x x[1])

        75

        APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

        Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

        selfelecroundsappend(selfsorted_candidates[_round])

        if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

        N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

        N_VACANCIES - 1)

        return 2

        elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

        N_VOTERS gt 05)

        return 1

        else

        selfelecexcludedadd(selfsorted_candidates[_round][selfelec

        CANDIDATE_INDEX])

        for voter_index in selfvotes[selfsorted_candidates[_round][self

        elecCANDIDATE_INDEX]]

        if voter_index in selfrankings_changed

        for candidate in reversed(selfrankings_changed[voter_index

        ])

        if candidate[selfelecCANDIDATE_INDEX] not in selfelec

        excluded

        selfcandidates[candidate[selfelecCANDIDATE_INDEX

        ]] += 1

        selfvotes[candidate[selfelecCANDIDATE_INDEX]]

        add(voter_index)

        break

        else

        continue

        else

        for candidate in reversed(selfelecsorted_voters[

        voter_index])

        if candidate[selfelecCANDIDATE_INDEX] not in selfelec

        excluded

        selfcandidates[candidate[selfelecCANDIDATE_INDEX

        ]] += 1

        selfvotes[candidate[selfelecCANDIDATE_INDEX]]

        add(voter_index)

        break

        else

        continue

        selfsorted_candidates = selfelecsort_candidates(selfcandidates)

        return 0

        76

        APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

        Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

        for index in range(selfelecN_CANDIDATES)

        selfcandidates[index] = 0

        for voter in selfelecsorted_voters

        for candidate in reversed(voter)

        if candidate[selfelecCANDIDATE_SCORE] gt 0

        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

        else

        break

        APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

        Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

        for index in range(selfelecN_CANDIDATES)

        selfcandidates[index] = 0

        for voter in selfelecsorted_voters

        if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

        elecCANDIDATE_INDEX]]

        selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

        else

        for candidate in reversed(voter)

        if candidate[selfelecCANDIDATE_SCORE] gt 0

        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

        else

        break

        77

        APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

        Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

        pos = set()

        for index perc in enumerate(selfelectactical_vote_percentages)

        if perc gt 0

        posadd(index)

        for candidate in selfeleccandidates

        if candidate not in selfleading_candidates

        for voter_index in selfvotes[candidate]

        raised = None

        for candidate_tuple in reversed(selfelecsorted_voters[voter_index

        ])

        if candidate_tuple[selfelecCANDIDATE_INDEX] in self

        leading_candidates

        if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

        if randomrandom() lt selfelectactical_vote_percentages[

        candidate_tuple[selfelecCANDIDATE_INDEX]]

        ranking = [None]selfelecN_CANDIDATES

        ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

        selfelecvoters[voter_index][candidate_tuple[selfelec

        CANDIDATE_INDEX]])

        raised = candidate_tuple[selfelecCANDIDATE_INDEX]

        break

        break

        break

        if raised = None

        for _candidate in selfleading_candidates

        if _candidate = ranking[-1][0]

        ranking[0] = (_candidate selfelecvoters[voter_index][

        _candidate])

        buried = _candidate

        break

        i = 1

        for candidate_tuple in selfelecsorted_voters[voter_index]

        if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

        buried]

        continue

        else

        ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

        selfelecvoters[voter_index][candidate_tuple[selfelec

        CANDIDATE_INDEX]])

        i += 1

        selfrankings_changed[voter_index] = ranking

        78

        APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

        Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

        for voter_index in selfvotes[candidate]

        if randomrandom() lt selfelectactical_vote_percentages[candidate

        ]

        for _candidate in selfleading_candidates

        if _candidate = candidate

        ranking = [None]selfelecN_CANDIDATES

        ranking[0] = (_candidate selfelecvoters[voter_index][

        _candidate])

        buried = _candidate

        break

        i = 1

        for candidate_tuple in selfelecsorted_voters[voter_index]

        if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

        continue

        else

        ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

        selfelecvoters[voter_index][candidate_tuple[selfelec

        CANDIDATE_INDEX]])

        i += 1

        selfrankings_changed[voter_index] = ranking

        79

        APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

        Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

        for index in range(selfelecN_CANDIDATES)

        selfcandidates[index] = 0

        for voter_index voter in enumerate(selfelecsorted_voters)

        score = 0

        if voter_index in selfrankings_changed

        for candidate in selfrankings_changed[voter_index]

        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

        score += 1

        else

        for candidate in voter

        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

        score += 1

        APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

        Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

        for voter_index voter in enumerate(selfelecsorted_voters)

        if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

        elecCANDIDATE_INDEX]]

        selfrankings_changed[voter_index] = copydeepcopy(selfelec

        sorted_voters[voter_index])

        for candidate_index candidate in enumerate(reversed(voter))

        if candidate_index == 0

        selfrankings_changed[voter_index][-(candidate_index + 1)] = (

        voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

        else

        selfrankings_changed[voter_index][-(candidate_index + 1)] = (

        voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

        80

        APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

        Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

        for index in range(selfelecN_CANDIDATES)

        selfcandidates[index] = 0

        for voter_index voter in enumerate(selfelecsorted_voters)

        if voter_index in selfrankings_changed

        for candidate in selfrankings_changed[voter_index]

        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

        selfelecCANDIDATE_RANK]

        else

        for candidate in voter

        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

        selfelecCANDIDATE_RANK]

        APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

        Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

        for index in range(selfelecN_CANDIDATES)

        selfcandidates[index] = 0

        for voter in selfelecsorted_voters

        votes = selfelecN_VACANCIES

        for candidate in reversed(voter)

        if votes == 0

        break

        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

        votes -= 1

        • Folha de aprovaccedilatildeo
        • Agradecimentos
        • Epiacutegrafe
        • Resumo
        • Abstract
        • Lista de ilustraccedilotildees
        • Lista de Coacutedigos
        • Lista de tabelas
        • Lista de abreviaturas e siglas
        • Sumaacuterio
        • INTRODUCcedilAtildeO
          • MOTIVACcedilAtildeO E OBJETIVO
          • MEacuteTODO
          • ESTRUTURA
            • SISTEMAS ELEITORAIS
              • FISRT PAST THE POST
                • Exemplo
                • Vantagens e Desvantagens do FPTP
                • Voto Uacutetil no FPTP
                  • TWO-ROUND SYSTEM
                    • Exemplo
                    • Vantagens e Desvantagens do TRS
                    • Voto Uacutetil no TRS
                      • INSTANT-RUNOFF VOTING
                        • Exemplo
                        • Vantagens e Desvantagens do IRV
                        • Voto Uacutetil no IRV
                          • APPROVAL VOTING SYSTEM
                            • Exemplo
                            • Vantagens e Desvantagens do AVS
                            • Voto Uacutetil no AVS
                              • THE BORDA COUNT
                                • Exemplo
                                • Vantagens e Desvantagens do BC
                                • Voto Uacutetil no BC
                                  • SCORE VOTING SYSTEM
                                    • Exemplo
                                    • Vantagens e Desvantagens do SVS
                                    • Voto Uacutetil no SVS
                                      • BLOC VOTE
                                        • Exemplo
                                        • Voto Uacutetil no BV
                                            • O SIMULADOR
                                            • CENAacuteRIOS PERTINENTES
                                              • CENAacuteRIO 1 VOTO TAacuteTICO
                                              • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                              • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                              • CENAacuteRIO 4 COALIZOtildeES
                                              • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                              • CENAacuteRIO 6 VOTO DE MINORIA
                                                • COMO FUNCIONA O SIMULADOR
                                                  • CLASSE Elections
                                                  • CLASSE FirstPastThePost
                                                  • CLASSE TwoRoundSystem
                                                  • CLASSE InstantRunoffVoting
                                                  • CLASSE ApprovalVoting
                                                  • CLASSE BordaCount
                                                  • CLASSE ScoreVoting
                                                  • CLASSE BlocVote
                                                  • TECNOLOGIAS UTILIZADAS
                                                    • CONCLUSAtildeO
                                                    • Referecircncias
                                                    • Meacutetodo create_voters
                                                    • Meacutetodo create_candidates
                                                    • Meacutetodo calculate_means
                                                    • Meacutetodo get_mean
                                                    • Meacutetodo calculate_mean
                                                    • Meacutetodo set_leading_candidates
                                                    • Meacutetodo irv_set_leading_candidates
                                                    • Meacutetodo sort_ranks
                                                    • Meacutetodo fptp_count_tactical_votes
                                                    • Meacutetodo fptp_count_minority_votes
                                                    • Meacutetodo trs_second_round
                                                    • Meacutetodo trs_account_for_coalitions
                                                    • Meacutetodo irv_count_votes
                                                    • Meacutetodo avs_count_votes
                                                    • Meacutetodo avs_count_votes_with_tactical
                                                    • Meacutetodo irv_apply_tactical_votes
                                                    • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                    • Meacutetodo bc_sum_candidates_scores
                                                    • Meacutetodo svs_apply_tactical_votes
                                                    • Meacutetodo svs_sum_candidates_scores
                                                    • Meacutetodo bv_count_votes

          RESUMO

          Existem diversos tipos de sistemas eleitorais em uso ao redor do mundo Cada paiacutes optapelo meacutetodo que melhor se adequa ao seu modo de governar muitas vezes utilizandovariaccedilotildees de um mesmo meacutetodo ou ateacute uma combinaccedilatildeo destes dependendo do cargopoliacutetico em questatildeo Atraveacutes da implementaccedilatildeo de um programa que permite simular umextenso nuacutemero de eleitores esta tese procura descobrir quais meacutetodos trazem resultadosque maximizam a taxa de satisfaccedilatildeo meacutedia da populaccedilatildeo quando testados sob diferentescenaacuterios poliacuteticos Cada eleitor simulado atribuiraacute notas para os candidatos que seratildeogeradas dependendo do cenaacuterio de maneira aleatoacuteria seguindo certa distribuiccedilatildeo de pro-babilidade ou deterministicamente atraveacutes de perfis eleitorais Tambeacutem seratildeo incluiacutedosnas simulaccedilotildees fatores reais de uma eleiccedilatildeo como o voto uacutetil e as coalizotildees entre can-didatos para que seja possiacutevel determinar de que maneira esses paracircmetros influenciamno resultado final Seraacute possiacutevel perceber que alguns dos sistemas satildeo muito eficazes naseleccedilatildeo dos melhores candidatos poreacutem afetados pelos votos taacuteticos enquanto outros satildeoresistentes a esses mas pecam em eficiecircncia

          Palavras-chave Simulaccedilotildees Sistemas Eleitorais Satisfaccedilatildeo Meacutedia

          ABSTRACT

          There are several types of electoral systems in use around the world Each country choosesthe method that best fits their governance often using variations of the same method oreven a combination of these depending on the political position in question Through theimplementation of a program that simulates an extensive number of voters this thesisseeks to find out which methods bring results that maximize the rate of population sat-isfaction when tested under different political scenarios Each simulated voter will assignnotes to the candidates that will be generated depending on the scenario in randomfashion following a certain probability distribution or deterministically through electoralprofiles Also included in the simulations are the real factors of an election such as tacti-cal votes and coalitions between candidates so that it is possible to determine how theseparameters influence the final result It will be possible to see that some of the systemsare very effective in the selection of the best candidates however affected by tactical voteswhile others are resistant to these but lack efficiency

          Keywords Simulations Electoral Systems Satisfaction Rate

          LISTA DE ILUSTRACcedilOtildeES

          Figura 1 ndash de paiacuteses de cada tipo de regime 1946-2016 17Figura 2 ndash Captura de tela 1 30Figura 3 ndash Captura de tela 2 30Figura 4 ndash Captura de tela 3 31Figura 5 ndash Captura de tela 4 32Figura 6 ndash Captura de tela 5 32Figura 7 ndash Captura de tela 6 33Figura 8 ndash FPTP - Cenaacuterio 1 sem voto taacutetico 34Figura 9 ndash TRS segundo turno - Cenaacuterio 1 sem voto taacutetico 34Figura 10 ndash IRV primeiro turno - Cenaacuterio 1 35Figura 11 ndash IRV segundo turno - Cenaacuterio 1 35Figura 12 ndash IRV terceiro turno - Cenaacuterio 1 35Figura 13 ndash AVS - Cenaacuterio 1 sem voto taacutetico 36Figura 14 ndash BC - Cenaacuterio 1 sem voto taacutetico 36Figura 15 ndash SVS - Cenaacuterio 1 sem voto taacutetico 36Figura 16 ndash FPTP - Cenaacuterio 1 - 20 de voto taacutetico na Ana 37Figura 17 ndash TRS segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana 37Figura 18 ndash IRV primeiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana 38Figura 19 ndash IRV segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana 38Figura 20 ndash IRV terceiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana 38Figura 21 ndash AVS - Cenaacuterio 1 20 de voto taacutetico na Ana 39Figura 22 ndash BC - Cenaacuterio 1 20 de voto taacutetico na Ana 39Figura 23 ndash SVS - Cenaacuterio 1 20 de voto taacutetico na Ana 39Figura 24 ndash BC - Cenaacuterio 1 100 de voto taacutetico na Ana e Beto 40Figura 25 ndash IRV primeiro turno - Cenaacuterio 2 41Figura 26 ndash IRV segundo turno - Cenaacuterio 2 41Figura 27 ndash IRV primeiro turno com voto taacutetico - Cenaacuterio 2 42Figura 28 ndash IRV segundo turno com voto taacutetico - Cenaacuterio 2 42Figura 29 ndash IRV primeiro turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3 44Figura 30 ndash IRV segundo turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3 44Figura 31 ndash TRS turno 1 - Cenaacuterio 4 45Figura 32 ndash TRS turno 2 - Cenaacuterio 4 46Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4 46Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4 46Figura 35 ndash FPTP - Cenaacuterio 5 48Figura 36 ndash TRS segundo turno - Cenaacuterio 5 48

          Figura 37 ndash AVS - Cenaacuterio 5 49Figura 38 ndash BC - Cenaacuterio 5 49Figura 39 ndash SVS - Cenaacuterio 5 50Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria 50Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego 51Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego 51Figura 43 ndash BV - Cenaacuterio 6 52Figura 44 ndash estrutura candidates 53Figura 45 ndash estrutura voters 54Figura 46 ndash estrutura votes 54Figura 47 ndash PDF - Distribuiccedilatildeo Neutral 55Figura 48 ndash CDF - Distribuiccedilatildeo Neutral 55Figura 49 ndash PDF - Distribuiccedilatildeo Liked 56Figura 50 ndash CDF - Distribuiccedilatildeo Liked 56Figura 51 ndash PDF - Distribuiccedilatildeo Disliked 57Figura 52 ndash CDF - Distribuiccedilatildeo Disliked 57Figura 53 ndash PDF - Distribuiccedilatildeo Loved 58Figura 54 ndash CDF - Distribuiccedilatildeo Loved 58Figura 55 ndash PDF - Distribuiccedilatildeo Hated 59Figura 56 ndash CDF - Distribuiccedilatildeo Hated 59Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer 60Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer 60Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer 61Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer 61

          LISTA DE COacuteDIGOS

          A1 Meacutetodo create_voters 67B1 Meacutetodo create_candidates 68C1 Meacutetodo calculate_means 68D1 Meacutetodo get_mean 68E1 Meacutetodo calculate_mean 69F1 Meacutetodo set_leading_candidates 69G1 Meacutetodo irv_set_leading_candidates 69H1 Meacutetodo sort_ranks 70I1 Meacutetodo fptp_count_tactical_votes 71J1 Meacutetodo fptp_count_minority_votes 72K1 Meacutetodo trs_second_round 73L1 Meacutetodo trs_account_for_coalitions 74M1 Meacutetodo irv_count_votes 75N1 Meacutetodo avs_count_votes 76O1 Meacutetodo avs_count_votes_with_tactical 76P1 Meacutetodo irv_apply_tactical_votes 77Q1 Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo) 78R1 Meacutetodo bc_sum_candidates_scores 79S1 Meacutetodo svs_apply_tactical_votes 79T1 Meacutetodo svs_sum_candidates_scores 80U1 Meacutetodo bv_count_votes 80

          LISTA DE TABELAS

          Tabela 1 ndash Exemplo FPTP 18Tabela 2 ndash 2deg turno do TRS 20Tabela 3 ndash Exemplo IRV 22Tabela 4 ndash Desenvolvimento do IRV 22Tabela 5 ndash Exemplo AVS 24Tabela 6 ndash Resultado AVS 24Tabela 7 ndash Resultado BC 26Tabela 8 ndash Exemplo SVS 27Tabela 9 ndash Resultado SVS 27Tabela 10 ndash Exemplo BV 28Tabela 11 ndash Resultado BV 28Tabela 12 ndash Distribuiccedilatildeo de notas - Cenaacuterio 2 41Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2 42Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3 43Tabela 15 ndash Resultados do Cenaacuterio 3 44Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5 47Tabela 17 ndash Resultados do Cenaacuterio 5 48Tabela 18 ndash Resultados do Cenaacuterio 6 52

          LISTA DE ABREVIATURAS E SIGLAS

          FPTP First Past The Post

          TRS Two-Round System

          IRV Instant Runoff Voting

          AVS Approval Voting System

          BC Borda Count

          SVS Score Voting System

          BV Bloc Vote

          SUMAacuteRIO

          1 INTRODUCcedilAtildeO 1511 MOTIVACcedilAtildeO E OBJETIVO 1512 MEacuteTODO 1513 ESTRUTURA 15

          2 SISTEMAS ELEITORAIS 1721 FISRT PAST THE POST 17211 Exemplo 18212 Vantagens e Desvantagens do FPTP 18213 Voto Uacutetil no FPTP 1922 TWO-ROUND SYSTEM 19221 Exemplo 20222 Vantagens e Desvantagens do TRS 20223 Voto Uacutetil no TRS 2123 INSTANT-RUNOFF VOTING 21231 Exemplo 22232 Vantagens e Desvantagens do IRV 22233 Voto Uacutetil no IRV 2324 APPROVAL VOTING SYSTEM 24241 Exemplo 24242 Vantagens e Desvantagens do AVS 24243 Voto Uacutetil no AVS 2525 THE BORDA COUNT 25251 Exemplo 25252 Vantagens e Desvantagens do BC 26253 Voto Uacutetil no BC 2626 SCORE VOTING SYSTEM 26261 Exemplo 27262 Vantagens e Desvantagens do SVS 27263 Voto Uacutetil no SVS 2727 BLOC VOTE 28271 Exemplo 28272 Voto Uacutetil no BV 29

          3 O SIMULADOR 30

          4 CENAacuteRIOS PERTINENTES 3441 CENAacuteRIO 1 VOTO TAacuteTICO 3442 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV 4143 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE 4344 CENAacuteRIO 4 COALIZOtildeES 4545 CENAacuteRIO 5 DILEMA DO PRISIONEIRO 4746 CENAacuteRIO 6 VOTO DE MINORIA 50

          5 COMO FUNCIONA O SIMULADOR 5351 CLASSE Elections 5352 CLASSE FirstPastThePost 6053 CLASSE TwoRoundSystem 6254 CLASSE InstantRunoffVoting 6255 CLASSE ApprovalVoting 6356 CLASSE BordaCount 6357 CLASSE ScoreVoting 6358 CLASSE BlocVote 6459 TECNOLOGIAS UTILIZADAS 64

          6 CONCLUSAtildeO 65

          REFEREcircNCIAS 66

          APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS 67

          APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES 68

          APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS 68

          APEcircNDICE D ndash MEacuteTODO GET_MEAN 68

          APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN 69

          APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES 69

          APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES 69

          APEcircNDICE H ndash MEacuteTODO SORT_RANKS 70

          APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES 71

          APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES 72

          APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND 73

          APEcircNDICE L ndash MEacuteTODOTRS_ACCOUNT_FOR_COALITIONS 74

          APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES 75

          APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES 76

          APEcircNDICE O ndash MEacuteTODOAVS_COUNT_VOTES_WITH_TACTICAL 76

          APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES 77

          APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES (CON-TINUACcedilAtildeO) 78

          APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES 79

          APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES 79

          APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES 80

          APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES 80

          15

          1 INTRODUCcedilAtildeO

          Em toda eleiccedilatildeo existe pelo menos um grupo de indiviacuteduos que sai completamentedesfavorecido e insatisfeito com o resultado O contentamento completo de uma populaccedilatildeoeacute certamente improvaacutevel e muitas vezes impossiacutevel considerando a gama de candidatosque se dispotildee a concorrer Em todo caso o miacutenimo que pode ser feito eacute escolher demaneira eficiente o melhor candidato ao cargo dentre as opccedilotildees disponiacuteveis Diante dissoeacute necessaacuterio avaliar como essa escolha eacute feita e quais meacutetodos satildeo capazes de tornaacute-larealidade

          11 MOTIVACcedilAtildeO E OBJETIVO

          Em conformidade com o extenso nuacutemero de sistemas eleitorais pelo mundo este tra-balho tem como objetivo testar uma porccedilatildeo desses sistemas sob a simulaccedilatildeo de diferentescenaacuterios especiacuteficos a fim de determinar quais deles podem ser considerados como os maisjustos perante a taxa de satisfaccedilatildeo meacutedia da populaccedilatildeo

          12 MEacuteTODO

          Para que essa anaacutelise seja possiacutevel foi desenvolvido um programa que permite a criaccedilatildeoe configuraccedilatildeo de diferentes cenaacuterios onde os sistemas eleitorais seratildeo simulados Nele eacutepossiacutevel definir o nuacutemero total de eleitores e candidatos como esses eleitores iratildeo votar eo niacutevel de popularidade de cada candidato Aleacutem disso eacute possiacutevel formar coalizotildees entreos candidatos e escolher a porcentagem dos eleitores que optaratildeo pelo voto uacutetil Dessamaneira seraacute possiacutevel elaborar cenaacuterios que buscam expor os pontos fortes e fracos decada sistema

          13 ESTRUTURA

          Este trabalho eacute relatado ao longo de seis capiacutetulos No Capiacutetulo 2 seratildeo apresentados ossistemas eleitorais implementados no simulador suas vantagens e desvantagens conhecidase outras caracteriacutesticas especiacuteficas de cada um A intenccedilatildeo do capiacutetulo eacute tornar o textomais autocontido trazendo conceitos jaacute estudados que ajudaratildeo na melhor compreensatildeodos capiacutetulos seguintes por isso grande parte de sua composiccedilatildeo eacute oriunda de diferentesfontes consultadas

          O Capiacutetulo 3 eacute uma apresentaccedilatildeo das funcionalidades que o simulador possui Seratildeoexplicados todos os campos de entrada e os dois modos distintos nos quais o programaopera

          16

          No Capiacutetulo 4 os sistemas seratildeo colocados em teste Todos seratildeo simulados em cenaacuteriosespeciacuteficos a fim de fazer sobressair aqueles com as maiores taxas de satisfaccedilatildeo meacutedia

          A estrutura e implementaccedilatildeo do simulador seratildeo abordadas em detalhes no Capiacutetulo5 assim como uma breve descriccedilatildeo da stack utilizada Todos os meacutetodos relevantes aofuncionamento das simulaccedilotildees seratildeo explicados passo a passo

          No Capiacutetulo 6 seratildeo apresentadas as conclusotildees referentes agrave anaacutelise dos resultadosobtidos no Capiacutetulo 4 e as consideraccedilotildees finais do projeto como um todo

          17

          2 SISTEMAS ELEITORAIS

          Atualmente mais e mais paiacuteses estatildeo adotando sistemas democraacuteticos de governoCerca de 6 em 10 governos no mundo satildeo democracias (Pew Research Center 2017) o quepode ser observado na Figura 1 abaixo Em um sistema democraacutetico a populaccedilatildeo escolheseus liacutederes atraveacutes de seu sistema eleitoral Existem diversos sistemas eleitorais em usono mundo muitos dos quais satildeo usados em conjunto para eleger um uacutenico candidato Emvaacuterios paiacuteses mais de um sistema eleitoral pode ser utilizado tambeacutem em diferentes niacuteveisde governo tanto presidencial quanto estadual ou municipal Natildeo apenas imersos nomeio poliacutetico eles tambeacutem podem ser usados em escopos menores como em esportes oucompeticcedilotildees artiacutesticas poreacutem sempre com a finalidade de alocar um ou mais indiviacuteduosa determinado cargo ou tiacutetulo

          Figura 1 ndash de paiacuteses de cada tipo de regime 1946-2016

          Fonte Center of Systemic Peacersquos Polity IV Project

          Os proacuteximos trecircs toacutepicos discutidos neste capiacutetulo referentes aos meacutetodos First Pastthe Post Two-Round System e Instant Runoff Voting possuem seus conceitos e infor-maccedilotildees relevantes com exceccedilatildeo dos exemplos traduzidos livremente do livro Behind theBallot Box A Citizenrsquos Guide to Voting Systems (AMY 2000)

          21 FISRT PAST THE POST

          O meacutetodo First Past the Post tambeacutem conhecido como Plurality Voting ou WinnerTakes All eacute o meacutetodo mais simples e direto e provavelmente o primeiro meacutetodo que sepensa quando se fala de eleiccedilotildees Os eleitores escolhem apenas um candidato e apoacutes a

          18

          contagem dos votos o candidato com o maior nuacutemero de votos eacute eleito O vencedor natildeonecessita da aprovaccedilatildeo de mais de 50 dos eleitores ele apenas precisa de uma pluralidadedos votos ou seja apenas possuir mais votos que os outros candidatos

          Esse sistema eacute utilizado em escala nos Estados Unidos para a maior parte das eleiccedilotildeesvoltadas a eleger apenas um candidato como prefeitos e governadores aleacutem de ser usadana disputa presidencial Dentre outros paiacuteses que empregam o sistema em suas corridaspresidenciais estatildeo listados o Meacutexico as Filipinas a Coreia do Sul e a Venezuela

          211 Exemplo

          Tabela 1 ndash Exemplo FPTP

          Candidatos VotosA 36B 25C 22D 17

          Neste exemplo o candidato A possui uma pluralidade dos votos com 36 e ele eacute ocandidato eleito mesmo natildeo tendo uma maioria

          212 Vantagens e Desvantagens do FPTP

          A vantagem do FPTP eacute a sua simplicidade Natildeo eacute difiacutecil para um eleitor comumcompreender o seu funcionamento eles apenas precisam se decidir por um candidato Eletambeacutem eacute muito simples e direto na sua contagem e seleccedilatildeo do vencedor

          Esse meacutetodo tambeacutem tende a criar listas de candidatos concorrentes mais curtasCandidatos independentes ou de partidos menores frequentemente acabam se sentindodesencorajados a concorrer devido agraves suas baixas chances de vitoacuteria Isso normalmentefornece aos eleitores uma faacutecil decisatildeo entre um ou dois candidatos dos maiores partidosao mesmo tempo poreacutem limitando suas opccedilotildees

          No entanto sua essecircncia eacute sua principal desvantagem a pluralidade O fato do can-didato eleito natildeo necessitar de uma maioridade dos votos da populaccedilatildeo parece violaros princiacutepios baacutesicos da democracia Democracia eacute em sua origem o poder(kratos) nopovo(demos) poreacutem na pluralidade o poder de eleger um candidato pode residir emapenas uma fraccedilatildeo relativamente pequena do povo Em um cenaacuterio hipoteacutetico comapenas trecircs candidatos um deles apenas poderia necessitar de natildeo mais do que 34 dosvotos para ser eleito o que significa que no pior dos casos 66 da populaccedilatildeo rejeitao candidato eleito O cenaacuterio soacute piora com mais e mais candidatos concorrendo Paraquatro candidatos satildeo necessaacuterios 26 dos votos no pior dos casos para cinco satildeo 21 eassim por diante

          19

          213 Voto Uacutetil no FPTP

          No FPTP tambeacutem existe a possibilidade de os eleitores evitarem votar em sua prefe-recircncia verdadeira No caso de sua preferecircncia natildeo aparentar ter boas chances de vitoacuteriamuitas vezes opta-se por uma segunda opccedilatildeo que esteja mais bem colocada nas eleiccedilotildeesO motivo disso eacute que nessas situaccedilotildees votar em sua preferecircncia pode parecer um des-perdiacutecio do seu voto e no pior dos cenaacuterios optar por natildeo transferir seu voto para umasegunda opccedilatildeo pode acabar resultando na eleiccedilatildeo de um candidato de seu desgosto As-sim votar de maneira verdadeira muitas vezes pode acabar prejudicando o eleitor que sevecirc forccedilado a abandonar seus interesses poliacuteticos mais imediatos e escolher o menor entredois(ou mais) males Os candidatos de partidos menores satildeo os que mais sofrem com essetipo de voto estrateacutegico por natildeo conseguirem agregar as maiores quantidades de votos

          Entretanto ao mesmo tempo que partidos maiores roubam votos de partidos meno-res com os votos taacuteticos partidos menores tambeacutem tem a oportunidade de ganhar algunsvotos com o denominado spoiler effect Ao entrarem na eleiccedilatildeo candidatos de partidosmenores podem adquirir votos de candidatos mais populares que possuem inclinaccedilatildeo po-liacutetica semelhante Logo eacute possiacutevel que haja certo equiliacutebrio ao se contrapor as mudanccedilasde voto devido aos votos uacuteteis agraves mudanccedilas oriundas do spoiler effect

          Poreacutem o spoiler effect natildeo necessariamente ocorre apenas entre partidos maiores emenores mas pode prejudicar candidatos de popularidades proacuteximas Por exemplo entretrecircs candidatos A B e C onde A representa determinada posiccedilatildeo no espectro poliacuteticoenquanto B e C possuem posiccedilotildees parecidas o que pode acontecer eacute B e C se prejudicaremmutuamente jaacute que ambos dividem os eleitores de um mesmo espectro poliacutetico Se esseespectro tem a maioria com 60 por exemplo com B e C compartilhando cada um 30dos votos o candidato A sairia vencedor com 40 mesmo que todos os eleitores de Bprefiram C e todos os eleitores de C prefiram B Esse exemplo demonstra claramente oproblema com os sistemas de pluralidade

          22 TWO-ROUND SYSTEM

          Uma das primeiras tentativas de lidar com a desvantagem dos sistemas por pluralidadeo Two-round System eacute usado desde o seacuteculo XIX no ocidente e atualmente ainda eacute utilizadoem corridas presidecircncias de paiacuteses como o Brasil Bulgaacuteria Chile Colocircmbia FinlacircndiaPolocircnia Portugal Ruacutessia e em inuacutemeras eleiccedilotildees locais nos Estados Unidos

          O principal objetivo do TRS eacute garantir que o vencedor tenha conseguido uma maioriados votos Para isso as eleiccedilotildees satildeo estruturadas em duas rodadas de votaccedilatildeo Na primeirarodada os eleitores se dirigem agraves urnas e votam no candidato de sua preferecircncia Apoacutesa contagem se a quantidade de votos do candidato mais votado superar a proporccedilatildeo de50 natildeo haacute a necessidade de uma segunda rodada e este candidato eacute eleito No entantose este natildeo for o caso haveraacute uma segunda rodada com apenas os dois candidatos mais

          20

          votados Nesta rodada os eleitores retornam as urnas para escolher uma das duas opccedilotildeessendo eleito o candidato mais votado agora definitivamente com uma maioria dos votos

          221 Exemplo

          Utilizando a mesma distribuiccedilatildeo de votos descrita na tabela 1 Neste caso como ocandidato A natildeo possui uma maioria dos votos ele e o candidato B iratildeo concorrer em umsegundo turno Digamos que as distribuiccedilotildees dos votos dos eleitores dos candidatos C eD em relaccedilatildeo aos candidatos A e B satildeo as seguintes

          Tabela 2 ndash 2deg turno do TRS

          Candidatos Votos dos eleitoresde C

          Votos dos eleitoresde D

          Votos do 1degturno

          A 7 5 36B 15 12 25

          O candidato B agora eacute eleito com uma maioria dos votos 52 contra 48 do candidatoA

          222 Vantagens e Desvantagens do TRS

          Por ser parecido com o FPTP esse sistema tambeacutem eacute de faacutecil compreensatildeo do eleitorcomum poreacutem a maior vantagem do TRS eacute a garantia de que o candidato vencedor teraacute oapoio da maioria dos eleitores no segundo turno eliminando a pluralidade Argumenta-seque isso daacute maior legitimidade poliacutetica ao mandato do candidato eleito

          O TRS tende a abrigar uma lista maior de candidatos sendo mais convidativo acandidatos de partidos menores mesmo que suas chances natildeo sejam maiores quandocomparadas agraves eleiccedilotildees sob o FPTP Mesmo assim essa listagem mais abrangente eacute umavantagem do sistema pois daacute aos eleitores uma variedade maior de opccedilotildees de voto

          Em relaccedilatildeo agraves suas desvantagens o TRS possui duas principais A primeira satildeo oscustos elevados do sistema decorrentes da necessidade da organizaccedilatildeo de um segundoturno de votaccedilotildees A segunda eacute o aumento no iacutendice de ausecircncias dos eleitores agraves urnasEssa ampliaccedilatildeo no natildeo comparecimento dos eleitores se daacute tambeacutem devido ao segundoturno por pura fatiga eleitoral bem como consequecircncia da desistecircncia de eleitores queapoiam candidatos que jaacute foram eliminados

          Outro ponto negativo do TRS eacute a sua natildeo-monotonicidade Isso significa que umcandidato pode ser prejudicado com um aumento em sua popularidade e suporte e domesmo modo um candidato pode se beneficiar com a perda de popularidade e suporteSe os candidatos A e B satildeo os esperados para ir ao segundo turno onde A eacute mais fortedo que B um aumento no suporte pelo candidato A pode resultar na sua derrota quandoesse aumento causa uma alteraccedilatildeo nos candidatos que satildeo selecionados para ir ao segundoturno Se esse aumento na popularidade de A resultar na eliminaccedilatildeo preacutevia de B um

          21

          terceiro candidato C pode ser vitorioso sobre A no segundo turno caso os eleitores de Bprefiram C ao candidato A Se natildeo houvesse esse crescimento de popularidade A teriaderrotado B no segundo turno Essa situaccedilatildeo seraacute vista em melhores detalhes na seccedilatildeo 43

          223 Voto Uacutetil no TRS

          Esse sistema minimiza os efeitos do voto uacutetil em relaccedilatildeo ao FPTP pois um eleitorqualquer pode tranquilamente votar em sua preferecircncia sem se preocupar em desperdiccedilaacute-lo mesmo que seu candidato natildeo tenha chances de vitoacuteria Se este natildeo for eleito aindapoderaacute escolher a sua preferecircncia dentre os dois candidatos que prosseguirem para osegundo turno

          Apesar disso ainda existe um cenaacuterio em que o eleitor pode ser tentado a natildeo votar emsua preferecircncia Eacute possiacutevel que ele opte pela sua segunda opccedilatildeo se souber que sua primeiraopccedilatildeo possui miacutenimas chances de ir ao segundo turno ou ateacute mesmo por saber que issodiminuiraacute as chances de algum outro candidato ser eleito Mesmo assim eacute evidente queo TRS natildeo proporciona o mesmo apelo ao voto taacutetico que o FPTP

          Outra caracteriacutestica do TRS eacute o incentivo a formaccedilatildeo de coalizotildees entre candidatosde partidos mais populares com candidatos de partidos menos populares As coalizotildeesfornecem benefiacutecios agrave ambas as partes onde os candidatos classificados para o segundoturno em geral se juntam a candidatos jaacute eliminados com a intenccedilatildeo de agregar maisvotos enquanto os candidatos jaacute eliminados apoiam um dos dois classificados na esperanccedilade inserir propostas proacuteprias ou modificaccedilotildees agrave chapa deles

          23 INSTANT-RUNOFF VOTING

          Instant Runoff Voting foi uma alternativa aos meacutetodos FPTP e TRS desenvolvidanos anos 70 por um professor do Instituto de Tecnologia de Massachusetts(MIT) O IRVelimina as principais desvantagens desses outros dois sistemas a pluralidade do FPTP e anecessidade de mais de uma rodada de votaccedilatildeo do TRS Este meacutetodo tambeacutem opera emmais de uma rodada poreacutem como o proacuteprio nome sugere essas rodadas satildeo instantacircneasnatildeo sendo necessaacuterio o retorno dos eleitores agraves urnas Atualmente ele eacute utilizado naIrlanda nas eleiccedilotildees presidenciais em Londres na eleiccedilatildeo de seu prefeito e em distritosindividuais na Austraacutelia para eleger membros de sua cacircmara baixa do parlamento OIRV tambeacutem eacute usado por vaacuterias organizaccedilotildees privadas nos Estados Unidos incluindoa American Political Science Association e a American Psychological Association paraeleger seus funcionaacuterios

          Nesse sistema os eleitores natildeo satildeo solicitados a votar em um uacutenico candidato aoinveacutes disso eles listam todos os candidatos concorrentes na ordem de sua preferecircnciaA partir dessas listas as primeiras opccedilotildees de cada eleitor recebem o seu voto e apoacutes acontagem se um candidato obtiver 50 dos votos mais um este candidato eacute eleito Se

          22

          isso natildeo ocorrer o candidato menos votado eacute eliminado das eleiccedilotildees e seus votos satildeotransferidos para a segunda opccedilatildeo de cada um de seus eleitores Esse procedimento serepete eliminando o candidato menos votado a cada rodada ateacute que algum dos candidatospossuam a maioridade dos votos

          231 Exemplo

          Na tabela 3 pode-se verificar a distribuiccedilatildeo de votos por perfil de eleitor e na tabela4 vecirc-se o desenvolvimento do IRV para essas distribuiccedilotildees O candidato D eacute o menosvotado e por consequecircncia eacute o primeiro a ser eliminado A segunda opccedilatildeo de todos oseleitores que votaram no candidato D eacute o candidato C por isso este recebe todos os votosdistribuiacutedos na segunda rodada Com isso o candidato B eacute eliminado com 25 dos votos eos candidatos A e C concorrem na uacuteltima rodada Mesmo com o candidato C na lideranccedilana segunda rodada a maior parte dos eleitores do B tem como preferecircncia o candidatoA por isso A eacute eleito com 55 dos votos contra 45 do C

          Tabela 3 ndash Exemplo IRV

          Rankings Ndeg de eleitoresABCD 20ABDC 16BDAC 19BDCA 6CABD 7CDBA 15DCAB 5DCBA 12

          Tabela 4 ndash Desenvolvimento do IRVTurnos D C B A

          1 17 22 25 362 eliminado 39 25 363 eliminado 45 eliminado 55

          232 Vantagens e Desvantagens do IRV

          Assim como no TRS a pluralidade eacute irrelevante no IRV e um candidato soacute eacute eleitocom a maioridade dos votos dando maior legitimidade ao mandato deste No entantopode-se argumentar que o IRV faz isso com mais eficiecircncia pois natildeo requer a execuccedilatildeode mais de uma rodada de votaccedilotildees Isso diminui os custos das eleiccedilotildees como um todoao mesmo tempo que proporciona um nuacutemero menor de isenccedilotildees por parte dos eleitoresdevido ao desgaste de todo o processo eleitoral

          23

          Aleacutem disso candidatos de partidos menores tendem a receber mais votos do queno FPTP e portanto satildeo mais encorajados a se candidatar Com uma lista maior decandidatos eleitores desfrutam de uma variedade maior de opccedilotildees de voto Contudomesmo com mais candidatos menos populares o spoiler effect mencionado anteriormentetambeacutem natildeo possui espaccedilo nesse sistema de votaccedilatildeo Partidos menores natildeo tem comoroubar votos de partidos maiores visto que esses votos eventualmente seratildeo transferidosde volta a eles durante o desenvolvimento das rodadas do IRV

          Em virtude de sua estrutura acredita-se que esse meacutetodo tende a encorajar os can-didatos tambeacutem a elaborar suas campanhas de forma mais abrangente ampliando suainfluecircncia para mais do que apenas um grupo especiacutefico de maneira que ele consiga agre-gar votos de segunda ou terceira opccedilatildeo aleacutem dos votos de seus eleitores principais

          A principal desvantagem do IRV eacute o fato de ele ainda natildeo ser amplamente utilizado aoredor do mundo Essa falta de familiaridade do sistema pode causar confusatildeo ao eleitorcomum em suas primeiras ocorrecircncias No entanto nos paiacuteses em que este eacute utilizadonatildeo parece haver confusatildeo entre os eleitores Aleacutem disso na maioria dos casos haveraacute umcusto potencialmente alto da substituiccedilatildeo ou alteraccedilatildeo dos sistemas das urnas eletrocircnicaspara que seja possiacutevel haver a implementaccedilatildeo do meacutetodo

          Aleacutem disso assim como o TRS este sistema tambeacutem possui natildeo-monotonicidade ouseja um candidato pode ser prejudicado ao ser ranqueado mais alto enquanto que outropode se beneficiar sendo ranqueado mais baixo pelos eleitores (ORNSTEIN 2018) issopode ocorrer quando esse ranqueamento causa alteraccedilotildees na ordem em que os candidatossatildeo eliminados Essa caracteriacutestica se manifesta em fenocircmenos complexos e especiacuteficos epor isso um exemplo de sua ocorrecircncia seraacute abordada em detalhes na seccedilatildeo 43

          233 Voto Uacutetil no IRV

          Como os sistemas de votaccedilatildeo anteriores o IRV natildeo eacute completamente imune ao vototaacutetico No entanto este meacutetodo se mostra bem resistente a eles quando comparado aoutros meacutetodos como o FPTP e o Borda Count (Bartholdi John J III and Orlin JamesB 1990) Distintivamente o IRV requer um maior esforccedilo do eleitor para elaborar umaestrateacutegia que melhor ajuste os resultados da eleiccedilatildeo de acordo com a sua preferecircnciaAleacutem disso eacute necessaacuterio que ele tenha informaccedilatildeo suficiente sobre os rankings de outroseleitores naturalmente obtida atraveacutes de pesquisas eleitorais

          Existe tambeacutem a possibilidade de ocorrer uma exaustatildeo dos votos quando natildeo haacuteo completo preenchimento do ranking por parte dos eleitores Nessas ocasiotildees o votonatildeo pode continuar a ser transferido a outros candidatos e ele eacute descartado Isso afetaa legitimidade do mandato do candidato eleito pois o resultado final natildeo representaraacute100 da populaccedilatildeo votante Essas ocorrecircncias no entanto podem ser minimizadas comuma melhor educaccedilatildeo eleitoral ou como foi implementado na Austraacutelia requerer que osrankings incluam uma totalidade dos candidatos concorrentes

          24

          24 APPROVAL VOTING SYSTEM

          No meacutetodo Approval Voting os eleitores natildeo satildeo limitados pelo nuacutemero de candidatosem que podem votar por isso approval cada eleitor pode votar em todos os candidatos osquais ele aprova Apoacutes as votaccedilotildees o candidato com a maior quantidade de votos eacute eleitoSegundo Hamlin (2015) a cidade de Fargo na Dakota do Norte se tornou a primeiracidade nos EUA a colocar em praacutetica este sistema em suas eleiccedilotildees gerais em novembrode 2018 AVS tambeacutem eacute utilizado para eleger o secretaacuterio-geral das Naccedilotildees Unidas e emdiversas outras organizaccedilotildees

          241 Exemplo

          Na tabela 5 abaixo pode-se encontrar 8 perfis de eleitores com seus candidatos apro-vados e quantidade de eleitores que se encaixam no perfil Na tabela 6 temos o resultadoda contabilizaccedilatildeo dos votos destes perfis O candidato mais popular eacute o B que se encontraaprovado em 5 perfis distintos totalizando 60 votos ou aproximadamente 32

          Tabela 5 ndash Exemplo AVS

          Aprovaccedilotildees Ndeg de eleitoresA 20AB 16B 19

          BDC 6CAB 7CD 15DC 5DCB 12

          Tabela 6 ndash Resultado AVSCandidatos Total de votos

          A 43B 60C 45D 38

          242 Vantagens e Desvantagens do AVS

          Aleacutem de simples este meacutetodo permite um niacutevel maior de expressividade aos eleitoresOnde no FPTP e TRS eles satildeo limitados pelo seu uacutenico voto aqui os eleitores tecircm aliberdade de demonstrar exatamente quais candidatos consideram aptos ou aceitaacuteveis aocargo

          25

          Outro efeito dessa liberdade trazida pelo AVS eacute a dizimaccedilatildeo do spoiler effect Can-didatos de partidos menores natildeo tem como roubar votos de partidos maiores nessesistema ambos os candidatos contabilizariam o voto

          243 Voto Uacutetil no AVS

          O tipo de voto uacutetil no AVS eacute denominado bullet voting Segundo The Center forElection Science (2015) esta taacutetica envolve simplesmente ignorar a possibilidade de votarem mais de um candidato e votar apenas em sua primeira opccedilatildeo Um eleitor pode serlevado a adotar essa estrateacutegia quando percebe que sua preferecircncia pode ser prejudicadacom o voto em alguma segunda opccedilatildeo sua Em um cenaacuterio extremo onde 100 doseleitores adotam esta estrateacutegia as eleiccedilotildees satildeo convertidas a um simples First Past ThePost

          25 THE BORDA COUNT

          Este meacutetodo carrega o nome em homenagem a seu criador Jean-Charles de Bordaque o desenvolveu em 1770 (LIPPMAN 2012) A contagem de Borda utiliza a abordagemde ranqueamento dos candidatos poreacutem de maneira diferente ao IRV Este eacute um sistemaque atribui uma pontuaccedilatildeo aos candidatos com base nestes rankings O candidato na basedo ranking natildeo recebe pontos o candidato imediatamente acima deste recebe 1 pontoo proacuteximo recebe 2 pontos e assim por diante ateacute o topo do ranking As pontuaccedilotildees detodos os rankings satildeo contabilizadas e o candidato com maior pontuaccedilatildeo eacute eleito Deacordo com Lippman variaccedilotildees deste meacutetodo satildeo encontradas em uso na premiaccedilatildeo dediversos esportes como na seleccedilatildeo do MVP(Most Valuable Player) da MLB(principal ligade beisebol dos EUA) e no Trofeacuteu Heisman de futebol americano universitaacuterio

          251 Exemplo

          Neste exemplo seratildeo aproveitados os mesmos rankings apresentados na tabela 3 Porserem 4 candidatos o primeiro colocado de cada ranking receberaacute 3 pontos o segundo 2pontos o terceiro 1 e o quarto 0 Assim o nuacutemero maacuteximo de pontos que um candidatopode atingir eacute igual a 300(se ficar na primeira posiccedilatildeo em todos os rankings) e o nuacutemerototal de pontos no sistema eacute 600 O nuacutemero maacuteximo de pontos que um candidato podeatingir eacute calculado com

          (cminus 1)times e

          Sendo c igual ao nuacutemero de candidatos e e o nuacutemero de eleitores Por sua vez onuacutemero total de pontos no sistema eacute

          26

          (cminus 1)times c2

          times e

          A contagem final dos pontos eacute apresentada na tabela 7 abaixo

          Tabela 7 ndash Resultado BCCandidatos Total de pontos

          A 146B 181C 126D 147

          O candidato eleito eacute o B com 181 pontos ou aproximadamente 60 da pontuaccedilatildeomaacutexima

          252 Vantagens e Desvantagens do BC

          Em comparaccedilatildeo com os meacutetodos abordados anteriormente que apenas consideramas primeiras opccedilotildees de cada eleitor este meacutetodo regularmente escolhe candidatos comaceitaccedilatildeo mais ampla ao inveacutes de uma preferecircncia direta dos eleitores (Electoral ReformSociety 2017b)

          Ele tambeacutem encoraja uma abordagem estrateacutegica por parte dos partidos onde seriade seu interesse nomear mais de um candidato para concorrer pois quanto mais candi-datos estatildeo no paacutereo maior eacute a pontuaccedilatildeo dos primeiros colocados Logo a nomeaccedilatildeo decandidatos menos populares pode beneficiar os principais candidatos de um partido

          253 Voto Uacutetil no BC

          Existem duas estrateacutegias aplicaacuteveis a esse sistema A primeira denominada compromi-sing de maneira similar a outros meacutetodos de votaccedilatildeo se resume em ranquear em primeirolugar um dos candidatos que estejam liderando as eleiccedilotildees mesmo que este natildeo seja suapreferecircncia real A segunda estrateacutegia burying eacute o oposto esta se baseia em ranquearem uacuteltimo lugar um dos candidatos liacutederes mesmo que este natildeo seja o seu candidato demaior desgosto Ambas estrateacutegias podem ser aplicadas ao mesmo tempo por um eleitor

          26 SCORE VOTING SYSTEM

          Score Voting ou Range Voting como tambeacutem eacute conhecido eacute mais um meacutetodo quetenta trazer maior liberdade de expressatildeo aos eleitores Assim como o Borda Counteste sistema funciona baseado na pontuaccedilatildeo dos candidatos no entanto ao inveacutes dessapontuaccedilatildeo ser relativa agrave posiccedilatildeo do candidato no ranking de cada eleitor este por sua veztem completa liberdade de atribuir qualquer quantidade de pontos aos candidatos dentro

          27

          de determinada escala Um eleitor pode dar o mesmo nuacutemero de pontos para diferentescandidatos e apoacutes o somatoacuterio de todas as pontuaccedilotildees o candidato com a pontuaccedilatildeo maisalta eacute eleito Incorporado ao escopo poliacutetico o SVS eacute utilizado no Partido Pirata Alematildeobem como em diversas organizaccedilotildees tais como o Fedora Project e Mozilla e tambeacutem emvariados esportes oliacutempicos e reality shows como o American Idol aponta Hamlin (2015)

          261 Exemplo

          Neste exemplo temos apresentados na tabela 8 abaixo 4 perfis distintos de eleitorese suas respectivas atribuiccedilotildees de pontos aos 4 candidatos Cada eleitor pode atribuirqualquer pontuaccedilatildeo a um candidato dentro da escala de -10 a 10 O resultado da eleiccedilatildeoapoacutes a soma de todos os pontos por candidato se encontra na tabela 9 onde o candidatoA eacute eleito com um total de 605 pontos

          Tabela 8 ndash Exemplo SVS

          Perfil A B C D Ndeg de eleitores1 10 -1 5 2 362 6 9 -3 4 253 2 0 8 4 224 3 3 3 10 17

          Tabela 9 ndash Resultado SVSCandidatos Total de pontos

          A 605B 240C 332D 430

          262 Vantagens e Desvantagens do SVS

          A grande vantagem do SVS eacute como ele proporciona aos eleitores expressar de maneiramuito proacutexima potencialmente exata suas impressotildees poliacuteticas de cada candidato Eleeacute ainda mais expressivo que o AVS Dessa maneira o spoiler effect tambeacutem se torna nuloao passo que toda intenccedilatildeo de voto eacute precisamente representada neste sistema

          Assim como outros meacutetodos eleitorais este sofre igualmente dos males produzidos pelovoto taacutetico Sua principal desvantagem eacute discutida na seccedilatildeo abaixo

          263 Voto Uacutetil no SVS

          Da mesma maneira que no Approval Voting atraveacutes do bullet voting o SVS tambeacutempode ser convertido em uma eleiccedilatildeo sob o meacutetodo FPTP em um cenaacuterio com um grande

          28

          volume de eleitores maliciosos O voto uacutetil sob este sistema se manifesta pontuando-seapenas um candidato com uma nota positiva e todos os outros com as notas mais baixasda escala Se todos os eleitores se aproveitarem dessa abordagem natildeo existiraacute distinccedilatildeoefetiva entre uma eleiccedilatildeo sob SVS e FPTP Essencialmente cada eleitor estaacute votando emapenas um candidato Essa eacute a principal desvantagem do SVS e ela consegue eliminarsua principal vantagem dar ao eleitor um poder maior de expressatildeo

          27 BLOC VOTE

          O Bloc Vote eacute um meacutetodo utilizado para a eleiccedilatildeo de candidatos a cargos no governocom mais de uma vacacircncia Pode ser considerado um meio-termo entre o FPTP e oAVS pois os eleitores podem votar em mais de um candidato poreacutem satildeo limitados pelonuacutemero de vagas Em uma eleiccedilatildeo com duas vagas por exemplo cada eleitor selecionaraacutedois candidatos ou menos Sensatamente o candidato mais votado eacute eleito Ele possuialgumas utilizaccedilotildees em eleiccedilotildees locais em algumas partes da Inglaterra (Electoral ReformSociety 2017a)

          271 Exemplo

          Neste exemplo dois candidatos seratildeo eleitos logo cada eleitor votaraacute em no maacuteximodois candidatos A distribuiccedilatildeo de votos pode ser conferida na tabela 10 e o resultado dacontagem de votos na tabela 11 abaixo Os candidatos eleitos satildeo o C totalizando 78do maacuteximo de votos possiacuteveis para um candidato e o A com 43

          Tabela 10 ndash Exemplo BV

          Aprovaccedilotildees Ndeg de eleitoresAC 20AB 16BC 19BD 6CA 7CD 15DC 17

          Tabela 11 ndash Resultado BVCandidatos Total de votos

          A 43B 41C 78D 38

          29

          272 Voto Uacutetil no BV

          Neste sistema eacute possiacutevel que um eleitor evite votar em sua primeira opccedilatildeo quandoeste natildeo tem chances de vitoacuteria e se fazendo isto ele diminuiraacute as chances de algum outrocandidato de seu desgosto ganhar Poreacutem o sistema previne um outro tipo de voto uacutetilEm eleiccedilotildees com mais de uma vaga onde os eleitores soacute podem votar em um candidatose um eleitor sabe que sua primeira opccedilatildeo tambeacutem eacute a primeira opccedilatildeo da maior parteda populaccedilatildeo e portanto muito provavelmente seraacute um dos candidatos eleitos eacute possiacutevelque ele arrisque votar em uma segunda opccedilatildeo sua na esperanccedila de a longo prazo elegersuas duas principais opccedilotildees de voto Com os eleitores podendo votar no nuacutemero exato devagas disponiacuteveis esse tipo de pensamento taacutetico perde o sentido

          30

          3 O SIMULADOR

          Para este trabalho foi implementado um simulador eleitoral na forma de uma aplicaccedilatildeoweb para que a interaccedilatildeo do usuaacuterio fosse facilitada Veremos a seguir como se daacute suautilizaccedilatildeo de forma geral

          Figura 2 ndash Captura de tela 1

          Figura 3 ndash Captura de tela 2

          A primeira opccedilatildeo encontrada pelo usuaacuterio eacute a escolha de quais sistemas de votaccedilatildeo se-ratildeo simulados (Figura 2) Todos eles podem ser selecionados para rodar simultaneamentePoreacutem natildeo eacute permitido rodar uma simulaccedilatildeo do Bloc Vote para uma eleiccedilatildeo onde apenasum candidato eacute eleito aleacutem disso natildeo existe implementaccedilatildeo dos meacutetodos TRS e IRV para

          31

          eleiccedilotildees com mais de um candidato eleito jaacute que eles se comportariam exatamente comono FPTP

          A maioria das linguagens de programaccedilatildeo senatildeo todas possuem um gerador de nuacuteme-ros pseudoaleatoacuterios que fornece a possibilidade de definir uma seed para o gerador Estaseed funciona como um ponto de partida para a geraccedilatildeo dos nuacutemero e portanto todasimulaccedilatildeo que rodar com a mesma seed sempre teraacute os mesmos resultados Se nenhumvalor for fornecido pelo usuaacuterio o tempo atual do sistema eacute utilizado As opccedilotildees subse-quentes satildeo a escolha do nuacutemero de eleitores gerados e o nuacutemero de vagas (Figura 3) Senenhum valor for fornecido o nuacutemero de eleitores padratildeo utilizado eacute 1000 e o nuacutemero devagas igual a 1

          Figura 4 ndash Captura de tela 3

          Este simulador possui dois modos para a criaccedilatildeo dos rankings dos eleitores No modoManipulate (Figura 4) primeiramente se define o nuacutemero de candidatos atraveacutes do campode entrada ao lado do tiacutetulo Candidates ou alternativamente pode-se adicionar candida-tos um a um atraveacutes do sinal de mais na parte inferior da paacutegina Para cada candidatoeacute possiacutevel definir a porcentagem de seus eleitores que optaraacute pelo voto taacutetico e pelovoto de minoria Tambeacutem eacute possiacutevel alterar o nome dos candidatos se for do interessedo usuaacuterio

          32

          Figura 5 ndash Captura de tela 4

          Figura 6 ndash Captura de tela 5

          33

          Figura 7 ndash Captura de tela 6

          Apoacutes a criaccedilatildeo dos candidatos o usuaacuterio pode criar perfis de eleitores que definiratildeo demaneira exata como partes da populaccedilatildeo iraacute votar (Figura 5) Em cada perfil se defineo valor em porcentos da populaccedilatildeo votante que o adotaraacute e a nota de cada candidatoTambeacutem eacute possiacutevel nomear cada perfil livremente

          No modo Generate (Figura 6) eacute onde o gerador de nuacutemeros pseudoaleatoacuterios eacute usadoNesse modo ao inveacutes do usuaacuterio criar perfis de eleitores ele define qual seraacute a distribuiccedilatildeoadotada para a geraccedilatildeo de notas de cada candidato Essas distribuiccedilotildees seratildeo mais bemdetalhadas no Capiacutetulo 5 Da mesma maneira que no modo Manipulate nesse modotambeacutem eacute possiacutevel definir os valores para os dois tipos de voto uacutetil os votos taacuteticos eos votos de minoria No primeiro estatildeo incluiacutedas as estrateacutegias de mudanccedila de votoespeciacuteficas de cada sistema como o bullet voting no AVS e SVS ou quando a preferecircnciade um eleitor claramente natildeo possui chances de vitoacuteria e ele muda seu voto para um doscandidatos que esteja na lideranccedila o que ocorre no FPTP e TRS O voto de minoriase apresenta apenas no FPTP em eleiccedilotildees onde mais de um candidato eacute eleito Se apreferecircncia de um eleitor claramente lidera a eleiccedilatildeo por ser tambeacutem a preferecircncia damaior parte da populaccedilatildeo esse eleitor pode mudar o seu voto para uma segunda opccedilatildeona esperanccedila de eleger dois de seus candidatos favoritos

          Por fim em ambos os modos o usuaacuterio tem a opccedilatildeo de definir coalizotildees entre oscandidatos se o sistema TRS estiver habilitado pois as coalizotildees apenas se manifestamnesse sistema Essas coalizotildees alteraratildeo as notas dos candidatos dependendo dos outroscandidatos pertencentes a elas (Figura 7)

          A aplicaccedilatildeo pode ser encontrada na paacutegina httpelectionsimpythonanywherecom

          34

          4 CENAacuteRIOS PERTINENTES

          Para todos os cenaacuterios deste capiacutetulo seraacute usada a seed do simulador igual a 100 e apopulaccedilatildeo de eleitores igual a 1000 para que exista consistecircncia na anaacutelise e tambeacutem paraque possa haver replicaccedilatildeo dos resultados se necessaacuterio

          41 CENAacuteRIO 1 VOTO TAacuteTICO

          Neste exemplo teremos quatro candidatos Ana Beto Carla e Diego Ana e Betoseratildeo gerados a partir da distribuiccedilatildeo Neutral (Figura 47) Carla da distribuiccedilatildeo Disliked(Figura 51) e Diego da Hated (Figura 55) Para a simulaccedilatildeo com a seed 100 o melhorcandidato a ser eleito ou seja aquele que maximiza a meacutedia das notas dos eleitores eacute oBeto com uma meacutedia de 0073 Para cada sistema seratildeo comparados os resultados semvoto taacutetico aos com 20 de voto taacutetico a favor da Ana Abaixo se encontram osresultados para o sistema FPTP

          Figura 8 ndash FPTP - Cenaacuterio 1 sem voto taacutetico

          Figura 9 ndash TRS segundo turno - Cenaacuterio 1 sem voto taacutetico

          35

          Figura 10 ndash IRV primeiro turno - Cenaacuterio 1

          Figura 11 ndash IRV segundo turno - Cenaacuterio 1

          Figura 12 ndash IRV terceiro turno - Cenaacuterio 1

          36

          Figura 13 ndash AVS - Cenaacuterio 1 sem voto taacutetico

          Figura 14 ndash BC - Cenaacuterio 1 sem voto taacutetico

          Figura 15 ndash SVS - Cenaacuterio 1 sem voto taacutetico

          37

          Nesse cenaacuterio sem voto taacutetico o uacutenico sistema que natildeo elege o Beto eacute o AVS Todosos outros elegem o melhor candidato Ou seja apesar de Beto ter uma melhor meacutediadas notas dos eleitores existem mais eleitores que ranqueiam Ana com uma nota acimade 0 No entanto apenas 20 dos eleitores de Diego e Carla que preferem a Ana aoinveacutes do Beto satildeo o suficiente para fazer Beto natildeo ser eleito se eles decidirem abandonarsua primeira opccedilatildeo e votar na Ana Considerando a vantagem que os votos taacuteticosproporcionam agrave Ana esta eacute eleita em todos os sistemas menos o TRS e o IRV

          Figura 16 ndash FPTP - Cenaacuterio 1 - 20 de voto taacutetico na Ana

          Figura 17 ndash TRS segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

          38

          Figura 18 ndash IRV primeiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

          Figura 19 ndash IRV segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

          Figura 20 ndash IRV terceiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

          39

          Figura 21 ndash AVS - Cenaacuterio 1 20 de voto taacutetico na Ana

          Figura 22 ndash BC - Cenaacuterio 1 20 de voto taacutetico na Ana

          Figura 23 ndash SVS - Cenaacuterio 1 20 de voto taacutetico na Ana

          40

          Eacute claro que se os eleitores que preferem o Beto tambeacutem votassem de maneira estra-teacutegica a situaccedilatildeo se equilibraria e haveria o mesmo niacutevel de concorrecircncia entre os doiscandidatos que ocorre quando natildeo haacute voto taacutetico Poreacutem no Borda Count esse equiliacute-brio pode natildeo acontecer e as estrateacutegias de compromising e burying podem acabar saindopela culatra se uma porcentagem elevada dos eleitores as adotarem Abaixo encontram-seos resultados para esse sistema quando 100 dos eleitores de Carla e Diego se comportammaliciosamente

          Figura 24 ndash BC - Cenaacuterio 1 100 de voto taacutetico na Ana e Beto

          Por causa do uso demasiado da estrateacutegia burying Ana e Beto perdem muitos pontose isso abre espaccedilo para uma vitoacuteria da Carla No entanto para porcentagens menores que100 o Beto ainda eacute o vencedor

          Essas duas estrateacutegias tambeacutem foram implementadas nesse simulador para o sistemaIRV e eacute possiacutevel ver como ele eacute resistente a elas Para que seja possiacutevel mudar os resultadosde uma eleiccedilatildeo sob o IRV eacute necessaacuterio mudar a ordem de eliminaccedilatildeo dos candidatos paraque o seu candidato preferido acabe enfrentando um candidato mais fraco nas rodadasfinais Isso natildeo ocorre com compromising e burying No proacuteximo cenaacuterio seraacute analisadacomo eacute possiacutevel modificar os resultados de uma eleiccedilatildeo sob o IRV

          Esses resultados podem ser replicados acessando os linksSem votos taacuteticos lthttpelectionsimpythonanywherecomdirect_res1111110

          --[0021][22Ana2222Beto222022Carla2222Diego22]------100gt

          Com 20 de voto taacutetico lthttpelectionsimpythonanywherecomdirect_res1111110--[0021][22Ana222022Beto2222Carla2222Diego22]1-[02000]---100gt

          Com 100 de voto taacuteticona Ana e Beto lthttpelectionsimpythonanywherecomdirect_res0000100--[0021][22Ana222022Beto222022Carla2222Diego22]1-[101000]---100gt

          41

          42 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV

          Neste cenaacuterio teremos Ana Carla e Beto concorrendo e trecircs perfis distintos que apoiamcada candidato As distribuiccedilotildees de notas dos perfis se encontram na tabela abaixo

          Tabela 12 ndash Distribuiccedilatildeo de notas - Cenaacuterio 2

          Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

          deeleitores

          1 10 5 0 422 0 10 5 303 5 0 10 28

          Com essas distribuiccedilotildees Carla eacute eliminada na primeira rodada e seus 28 de votossatildeo transferidos para a segunda opccedilatildeo de seus eleitores Ana que eacute eleita com 70 dosvotos e uma meacutedia de 56

          Figura 25 ndash IRV primeiro turno - Cenaacuterio 2

          Figura 26 ndash IRV segundo turno - Cenaacuterio 2

          42

          Cientes desse provaacutevel futuro cenaacuterio onde Ana eacute eleita uma pequena parte dos elei-tores de Beto estrategicamente o abandona e decide apoiar Carla na esperanccedila de leva-laao segundo turno contra Ana As novas distribuiccedilotildees de notas se encontram na tabelaabaixo com essa porccedilatildeo de eleitores representada pelo perfil 4

          Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2

          Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

          deeleitores

          1 10 5 0 422 0 10 5 283 5 0 10 284 0 8 10 2

          Essa mudanccedila estrateacutegica de voto altera a ordem de eliminaccedilotildees do sistema com Betosendo o primeiro a ser eliminado Com isso seus votos satildeo naturalmente transferidos paraCarla que derrota Ana no segundo turno com 58 dos votos

          Figura 27 ndash IRV primeiro turno com voto taacutetico - Cenaacuterio 2

          Figura 28 ndash IRV segundo turno com voto taacutetico - Cenaacuterio 2

          43

          Percebendo que a eleiccedilatildeo de Beto natildeo era provaacutevel seus eleitores conseguiram aomenos impedir a eleiccedilatildeo do pior candidato para eles Mas para isso foi necessaacuterio queeles tivessem a informaccedilatildeo de como os outros eleitores votariam Uma aproximaccedilatildeo dessasinformaccedilotildees poderia ser obtida em um cenaacuterio real com poucos candidatos atraveacutes depesquisas eleitorais poreacutem se o nuacutemero de candidatos eacute significativo uma noccedilatildeo completadas distribuiccedilotildees dos rankings dos eleitores se torna muito menos viaacutevel e dificulta aformulaccedilatildeo de estrateacutegias para alterar a ordem em que os candidatos satildeo eliminados

          Esses resultados podem ser replicados acessando os linksSem voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana22

          22Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

          Com voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana

          2222Beto2222Carla22]-----42Voter20Profile2001020520028Voter20Profile2010201020528Voter20Profile202520020102Voter20Profile20302082010100gt

          43 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE

          O interessante dos sistemas IRV e TRS eacute que os resultados do cenaacuterio anterior po-deriam ter sido obtidos ao inveacutes do voto taacutetico pela sua natildeo-monotonicidade Seriapossiacutevel que a Carla derrotasse a Ana no segundo turno atraveacutes do proacuteprio aumento depopularidade da Ana Assumindo que essa popularizaccedilatildeo ocorresse entre os candidatosdo perfil 2 onde 3 passasse a apoiar a Ana ao inveacutes do Beto as novas distribuiccedilotildeesseguiriam a tabela abaixo

          Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

          Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

          deeleitores

          1 10 5 0 452 0 10 5 273 5 0 10 28

          Dessa maneira Beto agora com uma porcentagem dos eleitores menor do que a deCarla seraacute eliminado na primeira rodada e como seus eleitores tecircm a Carla como segundaopccedilatildeo ela receberaacute todos os seus votos e seraacute eleita na segunda rodada As rodadas doIRV podem ser vistas nas figuras 29 e 30

          44

          Figura 29 ndash IRV primeiro turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

          Figura 30 ndash IRV segundo turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

          Tabela 15 ndash Resultados do Cenaacuterio 3Candidato

          eleitoMeacutedia das

          notasAntes da

          popularizaccedilatildeode Ana

          Ana 56

          Apoacutespopularizaccedilatildeo

          de AnaCarla 415

          Os efeitos dessa caracteriacutestica se refletem na satisfaccedilatildeo meacutedia da populaccedilatildeo A Ana eacuteclaramente a melhor candidata e mesmo com o seu ganho de popularidade (ou devido aele) a Carla eacute eleita

          Esses resultados podem ser replicados acessando os linksAntes da popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecom

          direct_res0010000---[22Ana2222Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

          45

          Apoacutes popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana2222Beto2222Carla22]-----45Voter20Profile2001020520027Voter20Profile2010201020528Voter20Profile20252002010100gt

          44 CENAacuteRIO 4 COALIZOtildeES

          O TRS por ser organizado em dois turnos separados normalmente a semanas dedistacircncia um do outro acaba abrindo brecha agrave mudanccedila de opiniatildeo por parte dos eleitorese o desenvolvimento de novas estrateacutegias por parte dos candidatos tais como a coalizatildeocom candidatos jaacute eliminados Com isso em mente nesse cenaacuterio teremos novamenteos quatro candidatos Ana Beto Carla e Diego Os trecircs primeiros seratildeo gerados dadistribuiccedilatildeo Neutral e Diego da distribuiccedilatildeo Disliked

          Figura 31 ndash TRS turno 1 - Cenaacuterio 4

          No TRS normal Ana Beto e Carla possuem com essas distribuiccedilotildees quantidades devotos muito proacuteximas com Beto e Carla indo para o segundo turno Carla estaacute 10 votosatraacutes de Beto e decide aproveitar o espaccedilo de tempo entre os dois turnos para tentaragregar mais votos Com isso Carla se aproxima de Diego e juntos formam uma coalizatildeoNo entanto com sua baixa popularidade Diego acaba ferindo a reputaccedilatildeo de Carla etorna o segundo turno muito mais faacutecil para Beto (Figura 33) Se Carla tivesse buscado osuporte de Ana por outro lado ela se veria vitoriosa no segundo turno e com uma amplavantagem sobre o Beto (Figura 34) Ou ateacute mesmo sem buscar uma coalizatildeo mesmosendo uma corrida apertada Carla teria naturalmente sido eleita (Figura 32)

          Esses resultados podem ser replicados acessando os linksSem coalizotildees lthttpelectionsimpythonanywherecomdirect_res0100000

          --[0002][22Ana222022Beto2222Carla2222Diego22]------100gt

          46

          Figura 32 ndash TRS turno 2 - Cenaacuterio 4

          Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4

          Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4

          47

          Coalizatildeo Carla e Diego lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2203Carla20Diego-100gt

          Coalizatildeo Carla e Ana lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2200Carla20Ana-100gt

          45 CENAacuteRIO 5 DILEMA DO PRISIONEIRO

          Neste cenaacuterio temos uma eleiccedilatildeo de uma vaga com trecircs candidatos concorrentes e trecircsperfis distintos de eleitores que seguiratildeo as seguintes distribuiccedilotildees

          Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5

          Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

          deeleitores

          1 10 -10 5 362 -10 10 5 343 -10 -10 5 30

          Esse contexto nos remete ao notaacutevel dilema do prisioneiro Nele dois prisioneiroscuacutemplices satildeo interrogados individualmente sem poder se comunicar um com o outro ecada um enfrenta o dilema de delatar ou natildeo o seu parceiro Se os dois prisioneirosdecidem se manter calados sobre o crime ambos satildeo sentenciados a um ano de prisatildeo Seapenas um deles dedurar o outro o traidor sai livre enquanto seu parceiro eacute condenadoa trecircs anos Se ambos dedurarem um ao outro eles satildeo condenados juntos a dois anosde prisatildeo Esse dilema eacute uma ideia claacutessica presente no estudo da teoria dos jogos sendooriginalmente elaborada por Merrill Flood e Melvin Dresher em 1950 e mais tarde sendonomeada de dilema dos prisioneiros por Albert W Tucker (POUNDSTONE 1992)

          O que esse dilema nos mostra eacute a tentaccedilatildeo que o indiviacuteduo deteacutem se sua racionalizaccedilatildeoestiver voltada para seus proacuteprios interesses e somente eles em oposiccedilatildeo a pensar no bemdo grupo como um todo Neste cenaacuterio encontramos dois grupos de eleitores expressiva-mente opostos os perfis 1 e 2 Se qualquer uma das preferecircncias desses perfis fosse eleitaisso significaria uma alta rejeiccedilatildeo de maior parte da populaccedilatildeo No entanto eles possuema segunda opccedilatildeo em comum a Carla que por sua vez eacute a preferecircncia do terceiro perfilPortanto a eleiccedilatildeo da Carla seria logicamente o resultado oacutetimo

          Mesmo assim a Ana eacute eleita nos dois sistemas acima o que natildeo parece justo poispela tabela 16 eacute evidente que apenas 36 da populaccedilatildeo a aprova enquanto que os outros64 a reprovam ao maacuteximo O sistema IRV se comporta de maneira idecircntica ao TRS

          48

          Figura 35 ndash FPTP - Cenaacuterio 5

          Figura 36 ndash TRS segundo turno - Cenaacuterio 5

          nesta situaccedilatildeo Com esse resultado a meacutedia das notas eacute -28 No entanto os trecircs sistemasseguintes nos apresentam resultados diferentes

          Tabela 17 ndash Resultados do Cenaacuterio 5

          Sistema Candidatoeleito

          Meacutedia dasnotas

          FPTP Ana -28TRS Ana -28IRV Ana -28AVS Carla 50BC Carla 50SVS Carla 50

          49

          Figura 37 ndash AVS - Cenaacuterio 5

          Figura 38 ndash BC - Cenaacuterio 5

          Tanto o AVS quanto o Borda Count e o SVS satildeo sistemas que consideram todasas opiniotildees de cada eleitor ao mesmo tempo e por isso satildeo capazes de eleger o melhorcandidato nesta situaccedilatildeo diferentemente do TRS que natildeo absorve completamente todosentimento do eleitor por todos os candidatos e o IRV que apesar de ser bem expressivoquebra esse processo em inuacutemeras rodadas o que permite a perda de informaccedilatildeo ao longodelas

          Esses resultados podem ser replicados acessando o linklthttpelectionsimpythonanywherecomdirect_res1111110---[22Ana

          222022Beto222022Carla22]-----36Voter20Profile2001020-1020534Voter20Profile201-10201020530Voter20Profile202-1020-10205100gt

          50

          Figura 39 ndash SVS - Cenaacuterio 5

          46 CENAacuteRIO 6 VOTO DE MINORIA

          Neste cenaacuterio temos uma eleiccedilatildeo com quatro candidatos e duas vagas A Ana seraacutea preferecircncia de uma extensa parte da populaccedilatildeo (distribuiccedilatildeo Loved Figura 53) Betoe Carla seratildeo candidatos razoavelmente populares (distribuiccedilatildeo Neutral Figura 47) eDiego seraacute a preferecircncia de apenas um pequeno grupo especiacutefico e rejeitado pela maioria(distribuiccedilatildeo Disliked Figura 51) Eacute intuitivo esperar que os dois candidatos eleitos seratildeoa Ana e ou o Beto ou a Carla e isso eacute exatamente o que ocorre na figura 40 no sistemaFPTP sem voto de minoria

          Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria

          Eacute evidente a discrepacircncia da quantidade de votos da Ana para os outros candidatose apesar de Beto e Carla serem mais populares que Diego os trecircs natildeo se encontrammuito afastados Poreacutem se a pequena fraccedilatildeo de candidatos que possuem a Ana como

          51

          Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego

          preferecircncia e Diego como segunda opccedilatildeo optarem pelo voto de minoria a situaccedilatildeo mudacompletamente (Figura 41) Assim apesar de extensamente rejeitado Diego conquistaa segunda vaga e a meacutedia das notas despenca de 2929 para 0505 No entanto aindaexiste um cenaacuterio pior Se os outros grupos de eleitores pensarem da mesma forma eevitarem votar na Ana achando que sua eleiccedilatildeo jaacute estaacute assegurada apenas 80 de votode minoria para esses grupos jaacute eacute o suficiente para eliminaacute-la das eleiccedilotildees (Figura 42)Com a Ana eliminada a meacutedia das notas cai ainda mais para 0058

          Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego

          O sistema Bloc Vote eacute uma das soluccedilotildees para o voto de minoria Permitindo queos eleitores votem no mesmo nuacutemero de candidatos que de vagas a serem preenchidasnatildeo existe o iacutempeto a esse tipo de voto estrateacutegico O resultado desse sistema portantoretorna a meacutedia das notas a casa dos 29 (Figura 43) Os sistemas AVS Borda Count eSVS tambeacutem impedem a presenccedila do voto de minoria e atingem resultados semelhantes

          52

          Figura 43 ndash BV - Cenaacuterio 6

          Tabela 18 ndash Resultados do Cenaacuterio 6

          Sistema Candidatoseleitos

          Meacutedia dasnotas

          FPTP sem voto de minoriaAna eBeto 2929

          FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

          FPTP com 80 de voto de minoriaBeto eCarla 0058

          Bloc VoteAna eCarla 2913

          Esses resultados podem ser replicados acessando os links

          Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

          100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

          80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

          53

          5 COMO FUNCIONA O SIMULADOR

          O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

          51 CLASSE ELECTIONS

          Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

          bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

          Figura 44 ndash estrutura candidates

          bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

          bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

          Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

          Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

          54

          Figura 45 ndash estrutura voters

          Figura 46 ndash estrutura votes

          daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

          Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

          55

          Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

          Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

          na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

          56

          Figura 49 ndash PDF - Distribuiccedilatildeo Liked

          Figura 50 ndash CDF - Distribuiccedilatildeo Liked

          (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

          Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

          57

          Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

          Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

          candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

          Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

          58

          Figura 53 ndash PDF - Distribuiccedilatildeo Loved

          Figura 54 ndash CDF - Distribuiccedilatildeo Loved

          funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

          59

          Figura 55 ndash PDF - Distribuiccedilatildeo Hated

          Figura 56 ndash CDF - Distribuiccedilatildeo Hated

          Meacutedia das Notas sumei

          sumvj nij

          etimes v

          Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

          Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

          60

          Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

          Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

          52 CLASSE FIRSTPASTTHEPOST

          Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

          Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

          61

          Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

          Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

          mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

          62

          53 CLASSE TWOROUNDSYSTEM

          A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

          54 CLASSE INSTANTRUNOFFVOTING

          A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

          Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

          63

          cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

          55 CLASSE APPROVALVOTING

          Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

          56 CLASSE BORDACOUNT

          Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

          57 CLASSE SCOREVOTING

          De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

          64

          58 CLASSE BLOCVOTE

          O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

          59 TECNOLOGIAS UTILIZADAS

          A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

          Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

          O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

          Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

          65

          6 CONCLUSAtildeO

          Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

          Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

          Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

          Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

          Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

          66

          REFEREcircNCIAS

          AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

          Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

          Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

          Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

          HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

          LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

          ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

          Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

          POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

          The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

          67

          APEcircNDICES

          APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

          Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

          if(not len(selfvoter_profiles))

          for voter in range(selfN_VOTERS)

          candidates_rank = dict()

          for candidate in reversed(range(selfN_CANDIDATES))

          if(selfBIAS_VECTOR[candidate]==4)

          candidates_rank[candidate] = self_sortear(selfloved)

          elif(selfBIAS_VECTOR[candidate]==3)

          candidates_rank[candidate] = self_sortear(selfliked)

          elif(selfBIAS_VECTOR[candidate]==2)

          candidates_rank[candidate] = self_sortear(selfdisliked)

          elif(selfBIAS_VECTOR[candidate]==1)

          candidates_rank[candidate] = self_sortear(selfhated)

          elif(selfBIAS_VECTOR[candidate]==-1)

          candidates_rank[candidate] = self_sortear(selfpolarizer

          )

          elif(selfBIAS_VECTOR[candidate]==-2)

          candidates_rank[candidate] = self_sortear(self

          more_polarizer)

          else

          candidates_rank[candidate] = self_sortear(selfneutral)

          selfvotersappend(candidates_rank)

          else

          ranges = []

          ranks = []

          for prof in selfvoter_profiles

          rangesappend(int(prof[pop_percentage]))

          rank =

          for index score in enumerate(prof[scores])

          rank[index] = score

          ranksappend(rank)

          for index _range in enumerate(ranges)

          for _ in range(int(selfN_VOTERS(_range100)))

          selfvotersappend(ranks[index])

          68

          APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

          Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

          for i in range(selfN_CANDIDATES)

          selfcandidates[i] = 0

          selfvotes[i] = set()

          APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

          Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

          for candidate in range(selfN_CANDIDATES)

          rating_sum = 0

          for voter in selfvoters

          rating_sum += voter[candidate]

          selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

          APEcircNDICE D ndash MEacuteTODO GET_MEAN

          Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

          if len(winners) gt 1 or selfN_CANDIDATES gt 10

          return selfcalculate_mean(winners)

          else

          chose_best = True if winners[0] == selfbest_candidate else

          False

          return selfstats[rsquomeansrsquo][winners[0]] chose_best

          69

          APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

          Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

          rating_sum = 0

          for voter in selfvoters

          for candidate in winners

          rating_sum += voter[candidate]

          return rating_sum(selfN_VOTERSselfN_VACANCIES) False

          APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

          Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

          for i in range(1 selfN_VACANCIES + 2)

          selfleading_candidatesappend(selfsorted_candidates[-i][self

          CANDIDATE_INDEX])

          APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

          Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

          for leader in selfelecrounds[-1]

          selfleading_candidatesappend(leader[0])

          70

          APEcircNDICE H ndash MEacuteTODO SORT_RANKS

          Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

          self_account_for_coalitions()

          for voter in selfvoters

          selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

          (1)))

          temp = []

          for voter in selfsorted_voters

          new_dict = defaultdict(list)

          for k in voter

          new_dict[k[1]]append(k[0])

          tempappend(new_dict)

          selfsorted_voters = []

          for voter_index current_voter in enumerate(temp)

          new_voter = []

          for rating candidate_indexes in current_voteritems()

          if len(current_voter[rating]) gt 1

          shuffle(current_voter[rating])

          for e in candidate_indexes

          new_voterappend((e rating))

          else

          new_voterappend((candidate_indexes[0] rating))

          selfsorted_votersappend(new_voter)

          selfcandidates[new_voter[-1][0]] += 1

          selfvotes[new_voter[-1][0]]add(voter_index)

          71

          APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

          Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

          for candidate in selfvotes_copy

          if candidate not in selfelecleading_candidates

          for voter_index in selfvotes_copy[candidate]

          for index _candidate in enumerate(reversed(selfelec

          sorted_voters[voter_index]))

          if _candidate[selfelecCANDIDATE_INDEX] in selfelec

          leading_candidates

          if randomrandom() lt selfelec

          tactical_vote_percentages[_candidate[selfelec

          CANDIDATE_INDEX]]

          selfrankings_changed[voter_index] = copy

          deepcopy(selfelecsorted_voters[voter_index])

          selfrankings_changed[voter_index][-(index + 1)]

          selfrankings_changed[voter_index][-1] = self

          rankings_changed[voter_index][-1] self

          rankings_changed[voter_index][-(index + 1)]

          selfcandidates[candidate] -= 1

          selfcandidates[_candidate[selfelec

          CANDIDATE_INDEX]] += 1

          selfvotes[candidate]remove(voter_index)

          selfvotes[_candidate[selfelecCANDIDATE_INDEX

          ]]add(voter_index)

          break

          break

          72

          APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

          Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

          half_vacancies = mathfloor(selfelecN_VACANCIES2)

          for candidate in selfelecleading_candidates

          if selfelecleading_candidatesindex(candidate) gt= half_vacancies

          continue

          for voter_index in selfvotes_copy[candidate]

          if voter_index in selfrankings_changed

          ranking = selfrankings_changed[voter_index]

          else

          ranking = copydeepcopy(selfelecsorted_voters[voter_index

          ])

          for index _candidate in enumerate(reversed(ranking))

          if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

          leading_candidates or (_candidate[selfelec

          CANDIDATE_INDEX] in selfelecleading_candidates and

          selfelecleading_candidatesindex(_candidate[selfelec

          CANDIDATE_INDEX]) gt= half_vacancies)

          if _candidate[selfelecCANDIDATE_RANK] gt= 0

          if randomrandom() lt selfelec

          minority_vote_percentages[_candidate[selfelec

          CANDIDATE_INDEX]]

          selfcandidates[candidate] -= 1

          selfcandidates[_candidate[selfelec

          CANDIDATE_INDEX]] += 1

          break

          break

          break

          73

          APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

          Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

          self_account_for_coalitions()

          for candidate in selfvotes

          if candidate = selfwinner and candidate = selfsecond_place

          for voter_index in selfvotes[candidate]

          if voter_index in selfrankings_changed

          ranking = selfrankings_changed[voter_index]

          else

          ranking = copydeepcopy(selfelecsorted_voters[

          voter_index])

          for index2 candidate in enumerate(reversed(ranking))

          if candidate[selfelecCANDIDATE_INDEX] == selfwinner

          selfcandidates[selfwinner] += 1

          selfvotes[selfwinner]add(voter_index)

          break

          elif candidate[selfelecCANDIDATE_INDEX] == self

          second_place

          selfcandidates[selfsecond_place] += 1

          selfvotes[selfsecond_place]add(voter_index)

          break

          selfsorted_candidates = selfelecsort_candidates(selfcandidates)

          winners = []

          vacancies = selfelecN_VACANCIES

          for candidate in reversed(selfsorted_candidates)

          if vacancies == 0

          break

          winnersappend(candidate[0])

          vacancies -= 1

          mean chose_best = selfelecget_mean(winners = winners)

          74

          APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

          Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

          for voter_index voter in enumerate(selfelecsorted_voters)

          voter_dict = dict()

          og_voter_dict = dict()

          for tup in voter

          voter_dict[tup[0]] = tup[1]

          og_voter_dict[tup[0]] = tup[1]

          for coalition in selfeleccoalitions

          for candidate in coalition

          add_to_score = 0

          for candidate2 in coalition

          if candidate == candidate2

          continue

          half = og_voter_dict[candidate2[rsquovaluersquo]]2

          if half lt 0

          add_to_score += mathceil(half)

          else

          add_to_score += mathfloor(half)

          if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

          voter_dict[candidate[rsquovaluersquo]] = 10

          elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

          voter_dict[candidate[rsquovaluersquo]] = -10

          else

          voter_dict[candidate[rsquovaluersquo]] += add_to_score

          selfrankings_changed[voter_index] = []

          for candidate in voter_dict

          selfrankings_changed[voter_index]append((candidate voter_dict[

          candidate]))

          selfrankings_changed[voter_index] = sorted(selfrankings_changed[

          voter_index] key=lambda x x[1])

          75

          APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

          Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

          selfelecroundsappend(selfsorted_candidates[_round])

          if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

          N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

          N_VACANCIES - 1)

          return 2

          elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

          N_VOTERS gt 05)

          return 1

          else

          selfelecexcludedadd(selfsorted_candidates[_round][selfelec

          CANDIDATE_INDEX])

          for voter_index in selfvotes[selfsorted_candidates[_round][self

          elecCANDIDATE_INDEX]]

          if voter_index in selfrankings_changed

          for candidate in reversed(selfrankings_changed[voter_index

          ])

          if candidate[selfelecCANDIDATE_INDEX] not in selfelec

          excluded

          selfcandidates[candidate[selfelecCANDIDATE_INDEX

          ]] += 1

          selfvotes[candidate[selfelecCANDIDATE_INDEX]]

          add(voter_index)

          break

          else

          continue

          else

          for candidate in reversed(selfelecsorted_voters[

          voter_index])

          if candidate[selfelecCANDIDATE_INDEX] not in selfelec

          excluded

          selfcandidates[candidate[selfelecCANDIDATE_INDEX

          ]] += 1

          selfvotes[candidate[selfelecCANDIDATE_INDEX]]

          add(voter_index)

          break

          else

          continue

          selfsorted_candidates = selfelecsort_candidates(selfcandidates)

          return 0

          76

          APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

          Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

          for index in range(selfelecN_CANDIDATES)

          selfcandidates[index] = 0

          for voter in selfelecsorted_voters

          for candidate in reversed(voter)

          if candidate[selfelecCANDIDATE_SCORE] gt 0

          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

          else

          break

          APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

          Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

          for index in range(selfelecN_CANDIDATES)

          selfcandidates[index] = 0

          for voter in selfelecsorted_voters

          if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

          elecCANDIDATE_INDEX]]

          selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

          else

          for candidate in reversed(voter)

          if candidate[selfelecCANDIDATE_SCORE] gt 0

          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

          else

          break

          77

          APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

          Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

          pos = set()

          for index perc in enumerate(selfelectactical_vote_percentages)

          if perc gt 0

          posadd(index)

          for candidate in selfeleccandidates

          if candidate not in selfleading_candidates

          for voter_index in selfvotes[candidate]

          raised = None

          for candidate_tuple in reversed(selfelecsorted_voters[voter_index

          ])

          if candidate_tuple[selfelecCANDIDATE_INDEX] in self

          leading_candidates

          if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

          if randomrandom() lt selfelectactical_vote_percentages[

          candidate_tuple[selfelecCANDIDATE_INDEX]]

          ranking = [None]selfelecN_CANDIDATES

          ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

          selfelecvoters[voter_index][candidate_tuple[selfelec

          CANDIDATE_INDEX]])

          raised = candidate_tuple[selfelecCANDIDATE_INDEX]

          break

          break

          break

          if raised = None

          for _candidate in selfleading_candidates

          if _candidate = ranking[-1][0]

          ranking[0] = (_candidate selfelecvoters[voter_index][

          _candidate])

          buried = _candidate

          break

          i = 1

          for candidate_tuple in selfelecsorted_voters[voter_index]

          if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

          buried]

          continue

          else

          ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

          selfelecvoters[voter_index][candidate_tuple[selfelec

          CANDIDATE_INDEX]])

          i += 1

          selfrankings_changed[voter_index] = ranking

          78

          APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

          Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

          for voter_index in selfvotes[candidate]

          if randomrandom() lt selfelectactical_vote_percentages[candidate

          ]

          for _candidate in selfleading_candidates

          if _candidate = candidate

          ranking = [None]selfelecN_CANDIDATES

          ranking[0] = (_candidate selfelecvoters[voter_index][

          _candidate])

          buried = _candidate

          break

          i = 1

          for candidate_tuple in selfelecsorted_voters[voter_index]

          if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

          continue

          else

          ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

          selfelecvoters[voter_index][candidate_tuple[selfelec

          CANDIDATE_INDEX]])

          i += 1

          selfrankings_changed[voter_index] = ranking

          79

          APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

          Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

          for index in range(selfelecN_CANDIDATES)

          selfcandidates[index] = 0

          for voter_index voter in enumerate(selfelecsorted_voters)

          score = 0

          if voter_index in selfrankings_changed

          for candidate in selfrankings_changed[voter_index]

          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

          score += 1

          else

          for candidate in voter

          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

          score += 1

          APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

          Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

          for voter_index voter in enumerate(selfelecsorted_voters)

          if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

          elecCANDIDATE_INDEX]]

          selfrankings_changed[voter_index] = copydeepcopy(selfelec

          sorted_voters[voter_index])

          for candidate_index candidate in enumerate(reversed(voter))

          if candidate_index == 0

          selfrankings_changed[voter_index][-(candidate_index + 1)] = (

          voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

          else

          selfrankings_changed[voter_index][-(candidate_index + 1)] = (

          voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

          80

          APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

          Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

          for index in range(selfelecN_CANDIDATES)

          selfcandidates[index] = 0

          for voter_index voter in enumerate(selfelecsorted_voters)

          if voter_index in selfrankings_changed

          for candidate in selfrankings_changed[voter_index]

          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

          selfelecCANDIDATE_RANK]

          else

          for candidate in voter

          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

          selfelecCANDIDATE_RANK]

          APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

          Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

          for index in range(selfelecN_CANDIDATES)

          selfcandidates[index] = 0

          for voter in selfelecsorted_voters

          votes = selfelecN_VACANCIES

          for candidate in reversed(voter)

          if votes == 0

          break

          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

          votes -= 1

          • Folha de aprovaccedilatildeo
          • Agradecimentos
          • Epiacutegrafe
          • Resumo
          • Abstract
          • Lista de ilustraccedilotildees
          • Lista de Coacutedigos
          • Lista de tabelas
          • Lista de abreviaturas e siglas
          • Sumaacuterio
          • INTRODUCcedilAtildeO
            • MOTIVACcedilAtildeO E OBJETIVO
            • MEacuteTODO
            • ESTRUTURA
              • SISTEMAS ELEITORAIS
                • FISRT PAST THE POST
                  • Exemplo
                  • Vantagens e Desvantagens do FPTP
                  • Voto Uacutetil no FPTP
                    • TWO-ROUND SYSTEM
                      • Exemplo
                      • Vantagens e Desvantagens do TRS
                      • Voto Uacutetil no TRS
                        • INSTANT-RUNOFF VOTING
                          • Exemplo
                          • Vantagens e Desvantagens do IRV
                          • Voto Uacutetil no IRV
                            • APPROVAL VOTING SYSTEM
                              • Exemplo
                              • Vantagens e Desvantagens do AVS
                              • Voto Uacutetil no AVS
                                • THE BORDA COUNT
                                  • Exemplo
                                  • Vantagens e Desvantagens do BC
                                  • Voto Uacutetil no BC
                                    • SCORE VOTING SYSTEM
                                      • Exemplo
                                      • Vantagens e Desvantagens do SVS
                                      • Voto Uacutetil no SVS
                                        • BLOC VOTE
                                          • Exemplo
                                          • Voto Uacutetil no BV
                                              • O SIMULADOR
                                              • CENAacuteRIOS PERTINENTES
                                                • CENAacuteRIO 1 VOTO TAacuteTICO
                                                • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                • CENAacuteRIO 4 COALIZOtildeES
                                                • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                • CENAacuteRIO 6 VOTO DE MINORIA
                                                  • COMO FUNCIONA O SIMULADOR
                                                    • CLASSE Elections
                                                    • CLASSE FirstPastThePost
                                                    • CLASSE TwoRoundSystem
                                                    • CLASSE InstantRunoffVoting
                                                    • CLASSE ApprovalVoting
                                                    • CLASSE BordaCount
                                                    • CLASSE ScoreVoting
                                                    • CLASSE BlocVote
                                                    • TECNOLOGIAS UTILIZADAS
                                                      • CONCLUSAtildeO
                                                      • Referecircncias
                                                      • Meacutetodo create_voters
                                                      • Meacutetodo create_candidates
                                                      • Meacutetodo calculate_means
                                                      • Meacutetodo get_mean
                                                      • Meacutetodo calculate_mean
                                                      • Meacutetodo set_leading_candidates
                                                      • Meacutetodo irv_set_leading_candidates
                                                      • Meacutetodo sort_ranks
                                                      • Meacutetodo fptp_count_tactical_votes
                                                      • Meacutetodo fptp_count_minority_votes
                                                      • Meacutetodo trs_second_round
                                                      • Meacutetodo trs_account_for_coalitions
                                                      • Meacutetodo irv_count_votes
                                                      • Meacutetodo avs_count_votes
                                                      • Meacutetodo avs_count_votes_with_tactical
                                                      • Meacutetodo irv_apply_tactical_votes
                                                      • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                      • Meacutetodo bc_sum_candidates_scores
                                                      • Meacutetodo svs_apply_tactical_votes
                                                      • Meacutetodo svs_sum_candidates_scores
                                                      • Meacutetodo bv_count_votes

            ABSTRACT

            There are several types of electoral systems in use around the world Each country choosesthe method that best fits their governance often using variations of the same method oreven a combination of these depending on the political position in question Through theimplementation of a program that simulates an extensive number of voters this thesisseeks to find out which methods bring results that maximize the rate of population sat-isfaction when tested under different political scenarios Each simulated voter will assignnotes to the candidates that will be generated depending on the scenario in randomfashion following a certain probability distribution or deterministically through electoralprofiles Also included in the simulations are the real factors of an election such as tacti-cal votes and coalitions between candidates so that it is possible to determine how theseparameters influence the final result It will be possible to see that some of the systemsare very effective in the selection of the best candidates however affected by tactical voteswhile others are resistant to these but lack efficiency

            Keywords Simulations Electoral Systems Satisfaction Rate

            LISTA DE ILUSTRACcedilOtildeES

            Figura 1 ndash de paiacuteses de cada tipo de regime 1946-2016 17Figura 2 ndash Captura de tela 1 30Figura 3 ndash Captura de tela 2 30Figura 4 ndash Captura de tela 3 31Figura 5 ndash Captura de tela 4 32Figura 6 ndash Captura de tela 5 32Figura 7 ndash Captura de tela 6 33Figura 8 ndash FPTP - Cenaacuterio 1 sem voto taacutetico 34Figura 9 ndash TRS segundo turno - Cenaacuterio 1 sem voto taacutetico 34Figura 10 ndash IRV primeiro turno - Cenaacuterio 1 35Figura 11 ndash IRV segundo turno - Cenaacuterio 1 35Figura 12 ndash IRV terceiro turno - Cenaacuterio 1 35Figura 13 ndash AVS - Cenaacuterio 1 sem voto taacutetico 36Figura 14 ndash BC - Cenaacuterio 1 sem voto taacutetico 36Figura 15 ndash SVS - Cenaacuterio 1 sem voto taacutetico 36Figura 16 ndash FPTP - Cenaacuterio 1 - 20 de voto taacutetico na Ana 37Figura 17 ndash TRS segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana 37Figura 18 ndash IRV primeiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana 38Figura 19 ndash IRV segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana 38Figura 20 ndash IRV terceiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana 38Figura 21 ndash AVS - Cenaacuterio 1 20 de voto taacutetico na Ana 39Figura 22 ndash BC - Cenaacuterio 1 20 de voto taacutetico na Ana 39Figura 23 ndash SVS - Cenaacuterio 1 20 de voto taacutetico na Ana 39Figura 24 ndash BC - Cenaacuterio 1 100 de voto taacutetico na Ana e Beto 40Figura 25 ndash IRV primeiro turno - Cenaacuterio 2 41Figura 26 ndash IRV segundo turno - Cenaacuterio 2 41Figura 27 ndash IRV primeiro turno com voto taacutetico - Cenaacuterio 2 42Figura 28 ndash IRV segundo turno com voto taacutetico - Cenaacuterio 2 42Figura 29 ndash IRV primeiro turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3 44Figura 30 ndash IRV segundo turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3 44Figura 31 ndash TRS turno 1 - Cenaacuterio 4 45Figura 32 ndash TRS turno 2 - Cenaacuterio 4 46Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4 46Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4 46Figura 35 ndash FPTP - Cenaacuterio 5 48Figura 36 ndash TRS segundo turno - Cenaacuterio 5 48

            Figura 37 ndash AVS - Cenaacuterio 5 49Figura 38 ndash BC - Cenaacuterio 5 49Figura 39 ndash SVS - Cenaacuterio 5 50Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria 50Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego 51Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego 51Figura 43 ndash BV - Cenaacuterio 6 52Figura 44 ndash estrutura candidates 53Figura 45 ndash estrutura voters 54Figura 46 ndash estrutura votes 54Figura 47 ndash PDF - Distribuiccedilatildeo Neutral 55Figura 48 ndash CDF - Distribuiccedilatildeo Neutral 55Figura 49 ndash PDF - Distribuiccedilatildeo Liked 56Figura 50 ndash CDF - Distribuiccedilatildeo Liked 56Figura 51 ndash PDF - Distribuiccedilatildeo Disliked 57Figura 52 ndash CDF - Distribuiccedilatildeo Disliked 57Figura 53 ndash PDF - Distribuiccedilatildeo Loved 58Figura 54 ndash CDF - Distribuiccedilatildeo Loved 58Figura 55 ndash PDF - Distribuiccedilatildeo Hated 59Figura 56 ndash CDF - Distribuiccedilatildeo Hated 59Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer 60Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer 60Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer 61Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer 61

            LISTA DE COacuteDIGOS

            A1 Meacutetodo create_voters 67B1 Meacutetodo create_candidates 68C1 Meacutetodo calculate_means 68D1 Meacutetodo get_mean 68E1 Meacutetodo calculate_mean 69F1 Meacutetodo set_leading_candidates 69G1 Meacutetodo irv_set_leading_candidates 69H1 Meacutetodo sort_ranks 70I1 Meacutetodo fptp_count_tactical_votes 71J1 Meacutetodo fptp_count_minority_votes 72K1 Meacutetodo trs_second_round 73L1 Meacutetodo trs_account_for_coalitions 74M1 Meacutetodo irv_count_votes 75N1 Meacutetodo avs_count_votes 76O1 Meacutetodo avs_count_votes_with_tactical 76P1 Meacutetodo irv_apply_tactical_votes 77Q1 Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo) 78R1 Meacutetodo bc_sum_candidates_scores 79S1 Meacutetodo svs_apply_tactical_votes 79T1 Meacutetodo svs_sum_candidates_scores 80U1 Meacutetodo bv_count_votes 80

            LISTA DE TABELAS

            Tabela 1 ndash Exemplo FPTP 18Tabela 2 ndash 2deg turno do TRS 20Tabela 3 ndash Exemplo IRV 22Tabela 4 ndash Desenvolvimento do IRV 22Tabela 5 ndash Exemplo AVS 24Tabela 6 ndash Resultado AVS 24Tabela 7 ndash Resultado BC 26Tabela 8 ndash Exemplo SVS 27Tabela 9 ndash Resultado SVS 27Tabela 10 ndash Exemplo BV 28Tabela 11 ndash Resultado BV 28Tabela 12 ndash Distribuiccedilatildeo de notas - Cenaacuterio 2 41Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2 42Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3 43Tabela 15 ndash Resultados do Cenaacuterio 3 44Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5 47Tabela 17 ndash Resultados do Cenaacuterio 5 48Tabela 18 ndash Resultados do Cenaacuterio 6 52

            LISTA DE ABREVIATURAS E SIGLAS

            FPTP First Past The Post

            TRS Two-Round System

            IRV Instant Runoff Voting

            AVS Approval Voting System

            BC Borda Count

            SVS Score Voting System

            BV Bloc Vote

            SUMAacuteRIO

            1 INTRODUCcedilAtildeO 1511 MOTIVACcedilAtildeO E OBJETIVO 1512 MEacuteTODO 1513 ESTRUTURA 15

            2 SISTEMAS ELEITORAIS 1721 FISRT PAST THE POST 17211 Exemplo 18212 Vantagens e Desvantagens do FPTP 18213 Voto Uacutetil no FPTP 1922 TWO-ROUND SYSTEM 19221 Exemplo 20222 Vantagens e Desvantagens do TRS 20223 Voto Uacutetil no TRS 2123 INSTANT-RUNOFF VOTING 21231 Exemplo 22232 Vantagens e Desvantagens do IRV 22233 Voto Uacutetil no IRV 2324 APPROVAL VOTING SYSTEM 24241 Exemplo 24242 Vantagens e Desvantagens do AVS 24243 Voto Uacutetil no AVS 2525 THE BORDA COUNT 25251 Exemplo 25252 Vantagens e Desvantagens do BC 26253 Voto Uacutetil no BC 2626 SCORE VOTING SYSTEM 26261 Exemplo 27262 Vantagens e Desvantagens do SVS 27263 Voto Uacutetil no SVS 2727 BLOC VOTE 28271 Exemplo 28272 Voto Uacutetil no BV 29

            3 O SIMULADOR 30

            4 CENAacuteRIOS PERTINENTES 3441 CENAacuteRIO 1 VOTO TAacuteTICO 3442 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV 4143 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE 4344 CENAacuteRIO 4 COALIZOtildeES 4545 CENAacuteRIO 5 DILEMA DO PRISIONEIRO 4746 CENAacuteRIO 6 VOTO DE MINORIA 50

            5 COMO FUNCIONA O SIMULADOR 5351 CLASSE Elections 5352 CLASSE FirstPastThePost 6053 CLASSE TwoRoundSystem 6254 CLASSE InstantRunoffVoting 6255 CLASSE ApprovalVoting 6356 CLASSE BordaCount 6357 CLASSE ScoreVoting 6358 CLASSE BlocVote 6459 TECNOLOGIAS UTILIZADAS 64

            6 CONCLUSAtildeO 65

            REFEREcircNCIAS 66

            APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS 67

            APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES 68

            APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS 68

            APEcircNDICE D ndash MEacuteTODO GET_MEAN 68

            APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN 69

            APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES 69

            APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES 69

            APEcircNDICE H ndash MEacuteTODO SORT_RANKS 70

            APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES 71

            APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES 72

            APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND 73

            APEcircNDICE L ndash MEacuteTODOTRS_ACCOUNT_FOR_COALITIONS 74

            APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES 75

            APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES 76

            APEcircNDICE O ndash MEacuteTODOAVS_COUNT_VOTES_WITH_TACTICAL 76

            APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES 77

            APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES (CON-TINUACcedilAtildeO) 78

            APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES 79

            APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES 79

            APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES 80

            APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES 80

            15

            1 INTRODUCcedilAtildeO

            Em toda eleiccedilatildeo existe pelo menos um grupo de indiviacuteduos que sai completamentedesfavorecido e insatisfeito com o resultado O contentamento completo de uma populaccedilatildeoeacute certamente improvaacutevel e muitas vezes impossiacutevel considerando a gama de candidatosque se dispotildee a concorrer Em todo caso o miacutenimo que pode ser feito eacute escolher demaneira eficiente o melhor candidato ao cargo dentre as opccedilotildees disponiacuteveis Diante dissoeacute necessaacuterio avaliar como essa escolha eacute feita e quais meacutetodos satildeo capazes de tornaacute-larealidade

            11 MOTIVACcedilAtildeO E OBJETIVO

            Em conformidade com o extenso nuacutemero de sistemas eleitorais pelo mundo este tra-balho tem como objetivo testar uma porccedilatildeo desses sistemas sob a simulaccedilatildeo de diferentescenaacuterios especiacuteficos a fim de determinar quais deles podem ser considerados como os maisjustos perante a taxa de satisfaccedilatildeo meacutedia da populaccedilatildeo

            12 MEacuteTODO

            Para que essa anaacutelise seja possiacutevel foi desenvolvido um programa que permite a criaccedilatildeoe configuraccedilatildeo de diferentes cenaacuterios onde os sistemas eleitorais seratildeo simulados Nele eacutepossiacutevel definir o nuacutemero total de eleitores e candidatos como esses eleitores iratildeo votar eo niacutevel de popularidade de cada candidato Aleacutem disso eacute possiacutevel formar coalizotildees entreos candidatos e escolher a porcentagem dos eleitores que optaratildeo pelo voto uacutetil Dessamaneira seraacute possiacutevel elaborar cenaacuterios que buscam expor os pontos fortes e fracos decada sistema

            13 ESTRUTURA

            Este trabalho eacute relatado ao longo de seis capiacutetulos No Capiacutetulo 2 seratildeo apresentados ossistemas eleitorais implementados no simulador suas vantagens e desvantagens conhecidase outras caracteriacutesticas especiacuteficas de cada um A intenccedilatildeo do capiacutetulo eacute tornar o textomais autocontido trazendo conceitos jaacute estudados que ajudaratildeo na melhor compreensatildeodos capiacutetulos seguintes por isso grande parte de sua composiccedilatildeo eacute oriunda de diferentesfontes consultadas

            O Capiacutetulo 3 eacute uma apresentaccedilatildeo das funcionalidades que o simulador possui Seratildeoexplicados todos os campos de entrada e os dois modos distintos nos quais o programaopera

            16

            No Capiacutetulo 4 os sistemas seratildeo colocados em teste Todos seratildeo simulados em cenaacuteriosespeciacuteficos a fim de fazer sobressair aqueles com as maiores taxas de satisfaccedilatildeo meacutedia

            A estrutura e implementaccedilatildeo do simulador seratildeo abordadas em detalhes no Capiacutetulo5 assim como uma breve descriccedilatildeo da stack utilizada Todos os meacutetodos relevantes aofuncionamento das simulaccedilotildees seratildeo explicados passo a passo

            No Capiacutetulo 6 seratildeo apresentadas as conclusotildees referentes agrave anaacutelise dos resultadosobtidos no Capiacutetulo 4 e as consideraccedilotildees finais do projeto como um todo

            17

            2 SISTEMAS ELEITORAIS

            Atualmente mais e mais paiacuteses estatildeo adotando sistemas democraacuteticos de governoCerca de 6 em 10 governos no mundo satildeo democracias (Pew Research Center 2017) o quepode ser observado na Figura 1 abaixo Em um sistema democraacutetico a populaccedilatildeo escolheseus liacutederes atraveacutes de seu sistema eleitoral Existem diversos sistemas eleitorais em usono mundo muitos dos quais satildeo usados em conjunto para eleger um uacutenico candidato Emvaacuterios paiacuteses mais de um sistema eleitoral pode ser utilizado tambeacutem em diferentes niacuteveisde governo tanto presidencial quanto estadual ou municipal Natildeo apenas imersos nomeio poliacutetico eles tambeacutem podem ser usados em escopos menores como em esportes oucompeticcedilotildees artiacutesticas poreacutem sempre com a finalidade de alocar um ou mais indiviacuteduosa determinado cargo ou tiacutetulo

            Figura 1 ndash de paiacuteses de cada tipo de regime 1946-2016

            Fonte Center of Systemic Peacersquos Polity IV Project

            Os proacuteximos trecircs toacutepicos discutidos neste capiacutetulo referentes aos meacutetodos First Pastthe Post Two-Round System e Instant Runoff Voting possuem seus conceitos e infor-maccedilotildees relevantes com exceccedilatildeo dos exemplos traduzidos livremente do livro Behind theBallot Box A Citizenrsquos Guide to Voting Systems (AMY 2000)

            21 FISRT PAST THE POST

            O meacutetodo First Past the Post tambeacutem conhecido como Plurality Voting ou WinnerTakes All eacute o meacutetodo mais simples e direto e provavelmente o primeiro meacutetodo que sepensa quando se fala de eleiccedilotildees Os eleitores escolhem apenas um candidato e apoacutes a

            18

            contagem dos votos o candidato com o maior nuacutemero de votos eacute eleito O vencedor natildeonecessita da aprovaccedilatildeo de mais de 50 dos eleitores ele apenas precisa de uma pluralidadedos votos ou seja apenas possuir mais votos que os outros candidatos

            Esse sistema eacute utilizado em escala nos Estados Unidos para a maior parte das eleiccedilotildeesvoltadas a eleger apenas um candidato como prefeitos e governadores aleacutem de ser usadana disputa presidencial Dentre outros paiacuteses que empregam o sistema em suas corridaspresidenciais estatildeo listados o Meacutexico as Filipinas a Coreia do Sul e a Venezuela

            211 Exemplo

            Tabela 1 ndash Exemplo FPTP

            Candidatos VotosA 36B 25C 22D 17

            Neste exemplo o candidato A possui uma pluralidade dos votos com 36 e ele eacute ocandidato eleito mesmo natildeo tendo uma maioria

            212 Vantagens e Desvantagens do FPTP

            A vantagem do FPTP eacute a sua simplicidade Natildeo eacute difiacutecil para um eleitor comumcompreender o seu funcionamento eles apenas precisam se decidir por um candidato Eletambeacutem eacute muito simples e direto na sua contagem e seleccedilatildeo do vencedor

            Esse meacutetodo tambeacutem tende a criar listas de candidatos concorrentes mais curtasCandidatos independentes ou de partidos menores frequentemente acabam se sentindodesencorajados a concorrer devido agraves suas baixas chances de vitoacuteria Isso normalmentefornece aos eleitores uma faacutecil decisatildeo entre um ou dois candidatos dos maiores partidosao mesmo tempo poreacutem limitando suas opccedilotildees

            No entanto sua essecircncia eacute sua principal desvantagem a pluralidade O fato do can-didato eleito natildeo necessitar de uma maioridade dos votos da populaccedilatildeo parece violaros princiacutepios baacutesicos da democracia Democracia eacute em sua origem o poder(kratos) nopovo(demos) poreacutem na pluralidade o poder de eleger um candidato pode residir emapenas uma fraccedilatildeo relativamente pequena do povo Em um cenaacuterio hipoteacutetico comapenas trecircs candidatos um deles apenas poderia necessitar de natildeo mais do que 34 dosvotos para ser eleito o que significa que no pior dos casos 66 da populaccedilatildeo rejeitao candidato eleito O cenaacuterio soacute piora com mais e mais candidatos concorrendo Paraquatro candidatos satildeo necessaacuterios 26 dos votos no pior dos casos para cinco satildeo 21 eassim por diante

            19

            213 Voto Uacutetil no FPTP

            No FPTP tambeacutem existe a possibilidade de os eleitores evitarem votar em sua prefe-recircncia verdadeira No caso de sua preferecircncia natildeo aparentar ter boas chances de vitoacuteriamuitas vezes opta-se por uma segunda opccedilatildeo que esteja mais bem colocada nas eleiccedilotildeesO motivo disso eacute que nessas situaccedilotildees votar em sua preferecircncia pode parecer um des-perdiacutecio do seu voto e no pior dos cenaacuterios optar por natildeo transferir seu voto para umasegunda opccedilatildeo pode acabar resultando na eleiccedilatildeo de um candidato de seu desgosto As-sim votar de maneira verdadeira muitas vezes pode acabar prejudicando o eleitor que sevecirc forccedilado a abandonar seus interesses poliacuteticos mais imediatos e escolher o menor entredois(ou mais) males Os candidatos de partidos menores satildeo os que mais sofrem com essetipo de voto estrateacutegico por natildeo conseguirem agregar as maiores quantidades de votos

            Entretanto ao mesmo tempo que partidos maiores roubam votos de partidos meno-res com os votos taacuteticos partidos menores tambeacutem tem a oportunidade de ganhar algunsvotos com o denominado spoiler effect Ao entrarem na eleiccedilatildeo candidatos de partidosmenores podem adquirir votos de candidatos mais populares que possuem inclinaccedilatildeo po-liacutetica semelhante Logo eacute possiacutevel que haja certo equiliacutebrio ao se contrapor as mudanccedilasde voto devido aos votos uacuteteis agraves mudanccedilas oriundas do spoiler effect

            Poreacutem o spoiler effect natildeo necessariamente ocorre apenas entre partidos maiores emenores mas pode prejudicar candidatos de popularidades proacuteximas Por exemplo entretrecircs candidatos A B e C onde A representa determinada posiccedilatildeo no espectro poliacuteticoenquanto B e C possuem posiccedilotildees parecidas o que pode acontecer eacute B e C se prejudicaremmutuamente jaacute que ambos dividem os eleitores de um mesmo espectro poliacutetico Se esseespectro tem a maioria com 60 por exemplo com B e C compartilhando cada um 30dos votos o candidato A sairia vencedor com 40 mesmo que todos os eleitores de Bprefiram C e todos os eleitores de C prefiram B Esse exemplo demonstra claramente oproblema com os sistemas de pluralidade

            22 TWO-ROUND SYSTEM

            Uma das primeiras tentativas de lidar com a desvantagem dos sistemas por pluralidadeo Two-round System eacute usado desde o seacuteculo XIX no ocidente e atualmente ainda eacute utilizadoem corridas presidecircncias de paiacuteses como o Brasil Bulgaacuteria Chile Colocircmbia FinlacircndiaPolocircnia Portugal Ruacutessia e em inuacutemeras eleiccedilotildees locais nos Estados Unidos

            O principal objetivo do TRS eacute garantir que o vencedor tenha conseguido uma maioriados votos Para isso as eleiccedilotildees satildeo estruturadas em duas rodadas de votaccedilatildeo Na primeirarodada os eleitores se dirigem agraves urnas e votam no candidato de sua preferecircncia Apoacutesa contagem se a quantidade de votos do candidato mais votado superar a proporccedilatildeo de50 natildeo haacute a necessidade de uma segunda rodada e este candidato eacute eleito No entantose este natildeo for o caso haveraacute uma segunda rodada com apenas os dois candidatos mais

            20

            votados Nesta rodada os eleitores retornam as urnas para escolher uma das duas opccedilotildeessendo eleito o candidato mais votado agora definitivamente com uma maioria dos votos

            221 Exemplo

            Utilizando a mesma distribuiccedilatildeo de votos descrita na tabela 1 Neste caso como ocandidato A natildeo possui uma maioria dos votos ele e o candidato B iratildeo concorrer em umsegundo turno Digamos que as distribuiccedilotildees dos votos dos eleitores dos candidatos C eD em relaccedilatildeo aos candidatos A e B satildeo as seguintes

            Tabela 2 ndash 2deg turno do TRS

            Candidatos Votos dos eleitoresde C

            Votos dos eleitoresde D

            Votos do 1degturno

            A 7 5 36B 15 12 25

            O candidato B agora eacute eleito com uma maioria dos votos 52 contra 48 do candidatoA

            222 Vantagens e Desvantagens do TRS

            Por ser parecido com o FPTP esse sistema tambeacutem eacute de faacutecil compreensatildeo do eleitorcomum poreacutem a maior vantagem do TRS eacute a garantia de que o candidato vencedor teraacute oapoio da maioria dos eleitores no segundo turno eliminando a pluralidade Argumenta-seque isso daacute maior legitimidade poliacutetica ao mandato do candidato eleito

            O TRS tende a abrigar uma lista maior de candidatos sendo mais convidativo acandidatos de partidos menores mesmo que suas chances natildeo sejam maiores quandocomparadas agraves eleiccedilotildees sob o FPTP Mesmo assim essa listagem mais abrangente eacute umavantagem do sistema pois daacute aos eleitores uma variedade maior de opccedilotildees de voto

            Em relaccedilatildeo agraves suas desvantagens o TRS possui duas principais A primeira satildeo oscustos elevados do sistema decorrentes da necessidade da organizaccedilatildeo de um segundoturno de votaccedilotildees A segunda eacute o aumento no iacutendice de ausecircncias dos eleitores agraves urnasEssa ampliaccedilatildeo no natildeo comparecimento dos eleitores se daacute tambeacutem devido ao segundoturno por pura fatiga eleitoral bem como consequecircncia da desistecircncia de eleitores queapoiam candidatos que jaacute foram eliminados

            Outro ponto negativo do TRS eacute a sua natildeo-monotonicidade Isso significa que umcandidato pode ser prejudicado com um aumento em sua popularidade e suporte e domesmo modo um candidato pode se beneficiar com a perda de popularidade e suporteSe os candidatos A e B satildeo os esperados para ir ao segundo turno onde A eacute mais fortedo que B um aumento no suporte pelo candidato A pode resultar na sua derrota quandoesse aumento causa uma alteraccedilatildeo nos candidatos que satildeo selecionados para ir ao segundoturno Se esse aumento na popularidade de A resultar na eliminaccedilatildeo preacutevia de B um

            21

            terceiro candidato C pode ser vitorioso sobre A no segundo turno caso os eleitores de Bprefiram C ao candidato A Se natildeo houvesse esse crescimento de popularidade A teriaderrotado B no segundo turno Essa situaccedilatildeo seraacute vista em melhores detalhes na seccedilatildeo 43

            223 Voto Uacutetil no TRS

            Esse sistema minimiza os efeitos do voto uacutetil em relaccedilatildeo ao FPTP pois um eleitorqualquer pode tranquilamente votar em sua preferecircncia sem se preocupar em desperdiccedilaacute-lo mesmo que seu candidato natildeo tenha chances de vitoacuteria Se este natildeo for eleito aindapoderaacute escolher a sua preferecircncia dentre os dois candidatos que prosseguirem para osegundo turno

            Apesar disso ainda existe um cenaacuterio em que o eleitor pode ser tentado a natildeo votar emsua preferecircncia Eacute possiacutevel que ele opte pela sua segunda opccedilatildeo se souber que sua primeiraopccedilatildeo possui miacutenimas chances de ir ao segundo turno ou ateacute mesmo por saber que issodiminuiraacute as chances de algum outro candidato ser eleito Mesmo assim eacute evidente queo TRS natildeo proporciona o mesmo apelo ao voto taacutetico que o FPTP

            Outra caracteriacutestica do TRS eacute o incentivo a formaccedilatildeo de coalizotildees entre candidatosde partidos mais populares com candidatos de partidos menos populares As coalizotildeesfornecem benefiacutecios agrave ambas as partes onde os candidatos classificados para o segundoturno em geral se juntam a candidatos jaacute eliminados com a intenccedilatildeo de agregar maisvotos enquanto os candidatos jaacute eliminados apoiam um dos dois classificados na esperanccedilade inserir propostas proacuteprias ou modificaccedilotildees agrave chapa deles

            23 INSTANT-RUNOFF VOTING

            Instant Runoff Voting foi uma alternativa aos meacutetodos FPTP e TRS desenvolvidanos anos 70 por um professor do Instituto de Tecnologia de Massachusetts(MIT) O IRVelimina as principais desvantagens desses outros dois sistemas a pluralidade do FPTP e anecessidade de mais de uma rodada de votaccedilatildeo do TRS Este meacutetodo tambeacutem opera emmais de uma rodada poreacutem como o proacuteprio nome sugere essas rodadas satildeo instantacircneasnatildeo sendo necessaacuterio o retorno dos eleitores agraves urnas Atualmente ele eacute utilizado naIrlanda nas eleiccedilotildees presidenciais em Londres na eleiccedilatildeo de seu prefeito e em distritosindividuais na Austraacutelia para eleger membros de sua cacircmara baixa do parlamento OIRV tambeacutem eacute usado por vaacuterias organizaccedilotildees privadas nos Estados Unidos incluindoa American Political Science Association e a American Psychological Association paraeleger seus funcionaacuterios

            Nesse sistema os eleitores natildeo satildeo solicitados a votar em um uacutenico candidato aoinveacutes disso eles listam todos os candidatos concorrentes na ordem de sua preferecircnciaA partir dessas listas as primeiras opccedilotildees de cada eleitor recebem o seu voto e apoacutes acontagem se um candidato obtiver 50 dos votos mais um este candidato eacute eleito Se

            22

            isso natildeo ocorrer o candidato menos votado eacute eliminado das eleiccedilotildees e seus votos satildeotransferidos para a segunda opccedilatildeo de cada um de seus eleitores Esse procedimento serepete eliminando o candidato menos votado a cada rodada ateacute que algum dos candidatospossuam a maioridade dos votos

            231 Exemplo

            Na tabela 3 pode-se verificar a distribuiccedilatildeo de votos por perfil de eleitor e na tabela4 vecirc-se o desenvolvimento do IRV para essas distribuiccedilotildees O candidato D eacute o menosvotado e por consequecircncia eacute o primeiro a ser eliminado A segunda opccedilatildeo de todos oseleitores que votaram no candidato D eacute o candidato C por isso este recebe todos os votosdistribuiacutedos na segunda rodada Com isso o candidato B eacute eliminado com 25 dos votos eos candidatos A e C concorrem na uacuteltima rodada Mesmo com o candidato C na lideranccedilana segunda rodada a maior parte dos eleitores do B tem como preferecircncia o candidatoA por isso A eacute eleito com 55 dos votos contra 45 do C

            Tabela 3 ndash Exemplo IRV

            Rankings Ndeg de eleitoresABCD 20ABDC 16BDAC 19BDCA 6CABD 7CDBA 15DCAB 5DCBA 12

            Tabela 4 ndash Desenvolvimento do IRVTurnos D C B A

            1 17 22 25 362 eliminado 39 25 363 eliminado 45 eliminado 55

            232 Vantagens e Desvantagens do IRV

            Assim como no TRS a pluralidade eacute irrelevante no IRV e um candidato soacute eacute eleitocom a maioridade dos votos dando maior legitimidade ao mandato deste No entantopode-se argumentar que o IRV faz isso com mais eficiecircncia pois natildeo requer a execuccedilatildeode mais de uma rodada de votaccedilotildees Isso diminui os custos das eleiccedilotildees como um todoao mesmo tempo que proporciona um nuacutemero menor de isenccedilotildees por parte dos eleitoresdevido ao desgaste de todo o processo eleitoral

            23

            Aleacutem disso candidatos de partidos menores tendem a receber mais votos do queno FPTP e portanto satildeo mais encorajados a se candidatar Com uma lista maior decandidatos eleitores desfrutam de uma variedade maior de opccedilotildees de voto Contudomesmo com mais candidatos menos populares o spoiler effect mencionado anteriormentetambeacutem natildeo possui espaccedilo nesse sistema de votaccedilatildeo Partidos menores natildeo tem comoroubar votos de partidos maiores visto que esses votos eventualmente seratildeo transferidosde volta a eles durante o desenvolvimento das rodadas do IRV

            Em virtude de sua estrutura acredita-se que esse meacutetodo tende a encorajar os can-didatos tambeacutem a elaborar suas campanhas de forma mais abrangente ampliando suainfluecircncia para mais do que apenas um grupo especiacutefico de maneira que ele consiga agre-gar votos de segunda ou terceira opccedilatildeo aleacutem dos votos de seus eleitores principais

            A principal desvantagem do IRV eacute o fato de ele ainda natildeo ser amplamente utilizado aoredor do mundo Essa falta de familiaridade do sistema pode causar confusatildeo ao eleitorcomum em suas primeiras ocorrecircncias No entanto nos paiacuteses em que este eacute utilizadonatildeo parece haver confusatildeo entre os eleitores Aleacutem disso na maioria dos casos haveraacute umcusto potencialmente alto da substituiccedilatildeo ou alteraccedilatildeo dos sistemas das urnas eletrocircnicaspara que seja possiacutevel haver a implementaccedilatildeo do meacutetodo

            Aleacutem disso assim como o TRS este sistema tambeacutem possui natildeo-monotonicidade ouseja um candidato pode ser prejudicado ao ser ranqueado mais alto enquanto que outropode se beneficiar sendo ranqueado mais baixo pelos eleitores (ORNSTEIN 2018) issopode ocorrer quando esse ranqueamento causa alteraccedilotildees na ordem em que os candidatossatildeo eliminados Essa caracteriacutestica se manifesta em fenocircmenos complexos e especiacuteficos epor isso um exemplo de sua ocorrecircncia seraacute abordada em detalhes na seccedilatildeo 43

            233 Voto Uacutetil no IRV

            Como os sistemas de votaccedilatildeo anteriores o IRV natildeo eacute completamente imune ao vototaacutetico No entanto este meacutetodo se mostra bem resistente a eles quando comparado aoutros meacutetodos como o FPTP e o Borda Count (Bartholdi John J III and Orlin JamesB 1990) Distintivamente o IRV requer um maior esforccedilo do eleitor para elaborar umaestrateacutegia que melhor ajuste os resultados da eleiccedilatildeo de acordo com a sua preferecircnciaAleacutem disso eacute necessaacuterio que ele tenha informaccedilatildeo suficiente sobre os rankings de outroseleitores naturalmente obtida atraveacutes de pesquisas eleitorais

            Existe tambeacutem a possibilidade de ocorrer uma exaustatildeo dos votos quando natildeo haacuteo completo preenchimento do ranking por parte dos eleitores Nessas ocasiotildees o votonatildeo pode continuar a ser transferido a outros candidatos e ele eacute descartado Isso afetaa legitimidade do mandato do candidato eleito pois o resultado final natildeo representaraacute100 da populaccedilatildeo votante Essas ocorrecircncias no entanto podem ser minimizadas comuma melhor educaccedilatildeo eleitoral ou como foi implementado na Austraacutelia requerer que osrankings incluam uma totalidade dos candidatos concorrentes

            24

            24 APPROVAL VOTING SYSTEM

            No meacutetodo Approval Voting os eleitores natildeo satildeo limitados pelo nuacutemero de candidatosem que podem votar por isso approval cada eleitor pode votar em todos os candidatos osquais ele aprova Apoacutes as votaccedilotildees o candidato com a maior quantidade de votos eacute eleitoSegundo Hamlin (2015) a cidade de Fargo na Dakota do Norte se tornou a primeiracidade nos EUA a colocar em praacutetica este sistema em suas eleiccedilotildees gerais em novembrode 2018 AVS tambeacutem eacute utilizado para eleger o secretaacuterio-geral das Naccedilotildees Unidas e emdiversas outras organizaccedilotildees

            241 Exemplo

            Na tabela 5 abaixo pode-se encontrar 8 perfis de eleitores com seus candidatos apro-vados e quantidade de eleitores que se encaixam no perfil Na tabela 6 temos o resultadoda contabilizaccedilatildeo dos votos destes perfis O candidato mais popular eacute o B que se encontraaprovado em 5 perfis distintos totalizando 60 votos ou aproximadamente 32

            Tabela 5 ndash Exemplo AVS

            Aprovaccedilotildees Ndeg de eleitoresA 20AB 16B 19

            BDC 6CAB 7CD 15DC 5DCB 12

            Tabela 6 ndash Resultado AVSCandidatos Total de votos

            A 43B 60C 45D 38

            242 Vantagens e Desvantagens do AVS

            Aleacutem de simples este meacutetodo permite um niacutevel maior de expressividade aos eleitoresOnde no FPTP e TRS eles satildeo limitados pelo seu uacutenico voto aqui os eleitores tecircm aliberdade de demonstrar exatamente quais candidatos consideram aptos ou aceitaacuteveis aocargo

            25

            Outro efeito dessa liberdade trazida pelo AVS eacute a dizimaccedilatildeo do spoiler effect Can-didatos de partidos menores natildeo tem como roubar votos de partidos maiores nessesistema ambos os candidatos contabilizariam o voto

            243 Voto Uacutetil no AVS

            O tipo de voto uacutetil no AVS eacute denominado bullet voting Segundo The Center forElection Science (2015) esta taacutetica envolve simplesmente ignorar a possibilidade de votarem mais de um candidato e votar apenas em sua primeira opccedilatildeo Um eleitor pode serlevado a adotar essa estrateacutegia quando percebe que sua preferecircncia pode ser prejudicadacom o voto em alguma segunda opccedilatildeo sua Em um cenaacuterio extremo onde 100 doseleitores adotam esta estrateacutegia as eleiccedilotildees satildeo convertidas a um simples First Past ThePost

            25 THE BORDA COUNT

            Este meacutetodo carrega o nome em homenagem a seu criador Jean-Charles de Bordaque o desenvolveu em 1770 (LIPPMAN 2012) A contagem de Borda utiliza a abordagemde ranqueamento dos candidatos poreacutem de maneira diferente ao IRV Este eacute um sistemaque atribui uma pontuaccedilatildeo aos candidatos com base nestes rankings O candidato na basedo ranking natildeo recebe pontos o candidato imediatamente acima deste recebe 1 pontoo proacuteximo recebe 2 pontos e assim por diante ateacute o topo do ranking As pontuaccedilotildees detodos os rankings satildeo contabilizadas e o candidato com maior pontuaccedilatildeo eacute eleito Deacordo com Lippman variaccedilotildees deste meacutetodo satildeo encontradas em uso na premiaccedilatildeo dediversos esportes como na seleccedilatildeo do MVP(Most Valuable Player) da MLB(principal ligade beisebol dos EUA) e no Trofeacuteu Heisman de futebol americano universitaacuterio

            251 Exemplo

            Neste exemplo seratildeo aproveitados os mesmos rankings apresentados na tabela 3 Porserem 4 candidatos o primeiro colocado de cada ranking receberaacute 3 pontos o segundo 2pontos o terceiro 1 e o quarto 0 Assim o nuacutemero maacuteximo de pontos que um candidatopode atingir eacute igual a 300(se ficar na primeira posiccedilatildeo em todos os rankings) e o nuacutemerototal de pontos no sistema eacute 600 O nuacutemero maacuteximo de pontos que um candidato podeatingir eacute calculado com

            (cminus 1)times e

            Sendo c igual ao nuacutemero de candidatos e e o nuacutemero de eleitores Por sua vez onuacutemero total de pontos no sistema eacute

            26

            (cminus 1)times c2

            times e

            A contagem final dos pontos eacute apresentada na tabela 7 abaixo

            Tabela 7 ndash Resultado BCCandidatos Total de pontos

            A 146B 181C 126D 147

            O candidato eleito eacute o B com 181 pontos ou aproximadamente 60 da pontuaccedilatildeomaacutexima

            252 Vantagens e Desvantagens do BC

            Em comparaccedilatildeo com os meacutetodos abordados anteriormente que apenas consideramas primeiras opccedilotildees de cada eleitor este meacutetodo regularmente escolhe candidatos comaceitaccedilatildeo mais ampla ao inveacutes de uma preferecircncia direta dos eleitores (Electoral ReformSociety 2017b)

            Ele tambeacutem encoraja uma abordagem estrateacutegica por parte dos partidos onde seriade seu interesse nomear mais de um candidato para concorrer pois quanto mais candi-datos estatildeo no paacutereo maior eacute a pontuaccedilatildeo dos primeiros colocados Logo a nomeaccedilatildeo decandidatos menos populares pode beneficiar os principais candidatos de um partido

            253 Voto Uacutetil no BC

            Existem duas estrateacutegias aplicaacuteveis a esse sistema A primeira denominada compromi-sing de maneira similar a outros meacutetodos de votaccedilatildeo se resume em ranquear em primeirolugar um dos candidatos que estejam liderando as eleiccedilotildees mesmo que este natildeo seja suapreferecircncia real A segunda estrateacutegia burying eacute o oposto esta se baseia em ranquearem uacuteltimo lugar um dos candidatos liacutederes mesmo que este natildeo seja o seu candidato demaior desgosto Ambas estrateacutegias podem ser aplicadas ao mesmo tempo por um eleitor

            26 SCORE VOTING SYSTEM

            Score Voting ou Range Voting como tambeacutem eacute conhecido eacute mais um meacutetodo quetenta trazer maior liberdade de expressatildeo aos eleitores Assim como o Borda Counteste sistema funciona baseado na pontuaccedilatildeo dos candidatos no entanto ao inveacutes dessapontuaccedilatildeo ser relativa agrave posiccedilatildeo do candidato no ranking de cada eleitor este por sua veztem completa liberdade de atribuir qualquer quantidade de pontos aos candidatos dentro

            27

            de determinada escala Um eleitor pode dar o mesmo nuacutemero de pontos para diferentescandidatos e apoacutes o somatoacuterio de todas as pontuaccedilotildees o candidato com a pontuaccedilatildeo maisalta eacute eleito Incorporado ao escopo poliacutetico o SVS eacute utilizado no Partido Pirata Alematildeobem como em diversas organizaccedilotildees tais como o Fedora Project e Mozilla e tambeacutem emvariados esportes oliacutempicos e reality shows como o American Idol aponta Hamlin (2015)

            261 Exemplo

            Neste exemplo temos apresentados na tabela 8 abaixo 4 perfis distintos de eleitorese suas respectivas atribuiccedilotildees de pontos aos 4 candidatos Cada eleitor pode atribuirqualquer pontuaccedilatildeo a um candidato dentro da escala de -10 a 10 O resultado da eleiccedilatildeoapoacutes a soma de todos os pontos por candidato se encontra na tabela 9 onde o candidatoA eacute eleito com um total de 605 pontos

            Tabela 8 ndash Exemplo SVS

            Perfil A B C D Ndeg de eleitores1 10 -1 5 2 362 6 9 -3 4 253 2 0 8 4 224 3 3 3 10 17

            Tabela 9 ndash Resultado SVSCandidatos Total de pontos

            A 605B 240C 332D 430

            262 Vantagens e Desvantagens do SVS

            A grande vantagem do SVS eacute como ele proporciona aos eleitores expressar de maneiramuito proacutexima potencialmente exata suas impressotildees poliacuteticas de cada candidato Eleeacute ainda mais expressivo que o AVS Dessa maneira o spoiler effect tambeacutem se torna nuloao passo que toda intenccedilatildeo de voto eacute precisamente representada neste sistema

            Assim como outros meacutetodos eleitorais este sofre igualmente dos males produzidos pelovoto taacutetico Sua principal desvantagem eacute discutida na seccedilatildeo abaixo

            263 Voto Uacutetil no SVS

            Da mesma maneira que no Approval Voting atraveacutes do bullet voting o SVS tambeacutempode ser convertido em uma eleiccedilatildeo sob o meacutetodo FPTP em um cenaacuterio com um grande

            28

            volume de eleitores maliciosos O voto uacutetil sob este sistema se manifesta pontuando-seapenas um candidato com uma nota positiva e todos os outros com as notas mais baixasda escala Se todos os eleitores se aproveitarem dessa abordagem natildeo existiraacute distinccedilatildeoefetiva entre uma eleiccedilatildeo sob SVS e FPTP Essencialmente cada eleitor estaacute votando emapenas um candidato Essa eacute a principal desvantagem do SVS e ela consegue eliminarsua principal vantagem dar ao eleitor um poder maior de expressatildeo

            27 BLOC VOTE

            O Bloc Vote eacute um meacutetodo utilizado para a eleiccedilatildeo de candidatos a cargos no governocom mais de uma vacacircncia Pode ser considerado um meio-termo entre o FPTP e oAVS pois os eleitores podem votar em mais de um candidato poreacutem satildeo limitados pelonuacutemero de vagas Em uma eleiccedilatildeo com duas vagas por exemplo cada eleitor selecionaraacutedois candidatos ou menos Sensatamente o candidato mais votado eacute eleito Ele possuialgumas utilizaccedilotildees em eleiccedilotildees locais em algumas partes da Inglaterra (Electoral ReformSociety 2017a)

            271 Exemplo

            Neste exemplo dois candidatos seratildeo eleitos logo cada eleitor votaraacute em no maacuteximodois candidatos A distribuiccedilatildeo de votos pode ser conferida na tabela 10 e o resultado dacontagem de votos na tabela 11 abaixo Os candidatos eleitos satildeo o C totalizando 78do maacuteximo de votos possiacuteveis para um candidato e o A com 43

            Tabela 10 ndash Exemplo BV

            Aprovaccedilotildees Ndeg de eleitoresAC 20AB 16BC 19BD 6CA 7CD 15DC 17

            Tabela 11 ndash Resultado BVCandidatos Total de votos

            A 43B 41C 78D 38

            29

            272 Voto Uacutetil no BV

            Neste sistema eacute possiacutevel que um eleitor evite votar em sua primeira opccedilatildeo quandoeste natildeo tem chances de vitoacuteria e se fazendo isto ele diminuiraacute as chances de algum outrocandidato de seu desgosto ganhar Poreacutem o sistema previne um outro tipo de voto uacutetilEm eleiccedilotildees com mais de uma vaga onde os eleitores soacute podem votar em um candidatose um eleitor sabe que sua primeira opccedilatildeo tambeacutem eacute a primeira opccedilatildeo da maior parteda populaccedilatildeo e portanto muito provavelmente seraacute um dos candidatos eleitos eacute possiacutevelque ele arrisque votar em uma segunda opccedilatildeo sua na esperanccedila de a longo prazo elegersuas duas principais opccedilotildees de voto Com os eleitores podendo votar no nuacutemero exato devagas disponiacuteveis esse tipo de pensamento taacutetico perde o sentido

            30

            3 O SIMULADOR

            Para este trabalho foi implementado um simulador eleitoral na forma de uma aplicaccedilatildeoweb para que a interaccedilatildeo do usuaacuterio fosse facilitada Veremos a seguir como se daacute suautilizaccedilatildeo de forma geral

            Figura 2 ndash Captura de tela 1

            Figura 3 ndash Captura de tela 2

            A primeira opccedilatildeo encontrada pelo usuaacuterio eacute a escolha de quais sistemas de votaccedilatildeo se-ratildeo simulados (Figura 2) Todos eles podem ser selecionados para rodar simultaneamentePoreacutem natildeo eacute permitido rodar uma simulaccedilatildeo do Bloc Vote para uma eleiccedilatildeo onde apenasum candidato eacute eleito aleacutem disso natildeo existe implementaccedilatildeo dos meacutetodos TRS e IRV para

            31

            eleiccedilotildees com mais de um candidato eleito jaacute que eles se comportariam exatamente comono FPTP

            A maioria das linguagens de programaccedilatildeo senatildeo todas possuem um gerador de nuacuteme-ros pseudoaleatoacuterios que fornece a possibilidade de definir uma seed para o gerador Estaseed funciona como um ponto de partida para a geraccedilatildeo dos nuacutemero e portanto todasimulaccedilatildeo que rodar com a mesma seed sempre teraacute os mesmos resultados Se nenhumvalor for fornecido pelo usuaacuterio o tempo atual do sistema eacute utilizado As opccedilotildees subse-quentes satildeo a escolha do nuacutemero de eleitores gerados e o nuacutemero de vagas (Figura 3) Senenhum valor for fornecido o nuacutemero de eleitores padratildeo utilizado eacute 1000 e o nuacutemero devagas igual a 1

            Figura 4 ndash Captura de tela 3

            Este simulador possui dois modos para a criaccedilatildeo dos rankings dos eleitores No modoManipulate (Figura 4) primeiramente se define o nuacutemero de candidatos atraveacutes do campode entrada ao lado do tiacutetulo Candidates ou alternativamente pode-se adicionar candida-tos um a um atraveacutes do sinal de mais na parte inferior da paacutegina Para cada candidatoeacute possiacutevel definir a porcentagem de seus eleitores que optaraacute pelo voto taacutetico e pelovoto de minoria Tambeacutem eacute possiacutevel alterar o nome dos candidatos se for do interessedo usuaacuterio

            32

            Figura 5 ndash Captura de tela 4

            Figura 6 ndash Captura de tela 5

            33

            Figura 7 ndash Captura de tela 6

            Apoacutes a criaccedilatildeo dos candidatos o usuaacuterio pode criar perfis de eleitores que definiratildeo demaneira exata como partes da populaccedilatildeo iraacute votar (Figura 5) Em cada perfil se defineo valor em porcentos da populaccedilatildeo votante que o adotaraacute e a nota de cada candidatoTambeacutem eacute possiacutevel nomear cada perfil livremente

            No modo Generate (Figura 6) eacute onde o gerador de nuacutemeros pseudoaleatoacuterios eacute usadoNesse modo ao inveacutes do usuaacuterio criar perfis de eleitores ele define qual seraacute a distribuiccedilatildeoadotada para a geraccedilatildeo de notas de cada candidato Essas distribuiccedilotildees seratildeo mais bemdetalhadas no Capiacutetulo 5 Da mesma maneira que no modo Manipulate nesse modotambeacutem eacute possiacutevel definir os valores para os dois tipos de voto uacutetil os votos taacuteticos eos votos de minoria No primeiro estatildeo incluiacutedas as estrateacutegias de mudanccedila de votoespeciacuteficas de cada sistema como o bullet voting no AVS e SVS ou quando a preferecircnciade um eleitor claramente natildeo possui chances de vitoacuteria e ele muda seu voto para um doscandidatos que esteja na lideranccedila o que ocorre no FPTP e TRS O voto de minoriase apresenta apenas no FPTP em eleiccedilotildees onde mais de um candidato eacute eleito Se apreferecircncia de um eleitor claramente lidera a eleiccedilatildeo por ser tambeacutem a preferecircncia damaior parte da populaccedilatildeo esse eleitor pode mudar o seu voto para uma segunda opccedilatildeona esperanccedila de eleger dois de seus candidatos favoritos

            Por fim em ambos os modos o usuaacuterio tem a opccedilatildeo de definir coalizotildees entre oscandidatos se o sistema TRS estiver habilitado pois as coalizotildees apenas se manifestamnesse sistema Essas coalizotildees alteraratildeo as notas dos candidatos dependendo dos outroscandidatos pertencentes a elas (Figura 7)

            A aplicaccedilatildeo pode ser encontrada na paacutegina httpelectionsimpythonanywherecom

            34

            4 CENAacuteRIOS PERTINENTES

            Para todos os cenaacuterios deste capiacutetulo seraacute usada a seed do simulador igual a 100 e apopulaccedilatildeo de eleitores igual a 1000 para que exista consistecircncia na anaacutelise e tambeacutem paraque possa haver replicaccedilatildeo dos resultados se necessaacuterio

            41 CENAacuteRIO 1 VOTO TAacuteTICO

            Neste exemplo teremos quatro candidatos Ana Beto Carla e Diego Ana e Betoseratildeo gerados a partir da distribuiccedilatildeo Neutral (Figura 47) Carla da distribuiccedilatildeo Disliked(Figura 51) e Diego da Hated (Figura 55) Para a simulaccedilatildeo com a seed 100 o melhorcandidato a ser eleito ou seja aquele que maximiza a meacutedia das notas dos eleitores eacute oBeto com uma meacutedia de 0073 Para cada sistema seratildeo comparados os resultados semvoto taacutetico aos com 20 de voto taacutetico a favor da Ana Abaixo se encontram osresultados para o sistema FPTP

            Figura 8 ndash FPTP - Cenaacuterio 1 sem voto taacutetico

            Figura 9 ndash TRS segundo turno - Cenaacuterio 1 sem voto taacutetico

            35

            Figura 10 ndash IRV primeiro turno - Cenaacuterio 1

            Figura 11 ndash IRV segundo turno - Cenaacuterio 1

            Figura 12 ndash IRV terceiro turno - Cenaacuterio 1

            36

            Figura 13 ndash AVS - Cenaacuterio 1 sem voto taacutetico

            Figura 14 ndash BC - Cenaacuterio 1 sem voto taacutetico

            Figura 15 ndash SVS - Cenaacuterio 1 sem voto taacutetico

            37

            Nesse cenaacuterio sem voto taacutetico o uacutenico sistema que natildeo elege o Beto eacute o AVS Todosos outros elegem o melhor candidato Ou seja apesar de Beto ter uma melhor meacutediadas notas dos eleitores existem mais eleitores que ranqueiam Ana com uma nota acimade 0 No entanto apenas 20 dos eleitores de Diego e Carla que preferem a Ana aoinveacutes do Beto satildeo o suficiente para fazer Beto natildeo ser eleito se eles decidirem abandonarsua primeira opccedilatildeo e votar na Ana Considerando a vantagem que os votos taacuteticosproporcionam agrave Ana esta eacute eleita em todos os sistemas menos o TRS e o IRV

            Figura 16 ndash FPTP - Cenaacuterio 1 - 20 de voto taacutetico na Ana

            Figura 17 ndash TRS segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

            38

            Figura 18 ndash IRV primeiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

            Figura 19 ndash IRV segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

            Figura 20 ndash IRV terceiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

            39

            Figura 21 ndash AVS - Cenaacuterio 1 20 de voto taacutetico na Ana

            Figura 22 ndash BC - Cenaacuterio 1 20 de voto taacutetico na Ana

            Figura 23 ndash SVS - Cenaacuterio 1 20 de voto taacutetico na Ana

            40

            Eacute claro que se os eleitores que preferem o Beto tambeacutem votassem de maneira estra-teacutegica a situaccedilatildeo se equilibraria e haveria o mesmo niacutevel de concorrecircncia entre os doiscandidatos que ocorre quando natildeo haacute voto taacutetico Poreacutem no Borda Count esse equiliacute-brio pode natildeo acontecer e as estrateacutegias de compromising e burying podem acabar saindopela culatra se uma porcentagem elevada dos eleitores as adotarem Abaixo encontram-seos resultados para esse sistema quando 100 dos eleitores de Carla e Diego se comportammaliciosamente

            Figura 24 ndash BC - Cenaacuterio 1 100 de voto taacutetico na Ana e Beto

            Por causa do uso demasiado da estrateacutegia burying Ana e Beto perdem muitos pontose isso abre espaccedilo para uma vitoacuteria da Carla No entanto para porcentagens menores que100 o Beto ainda eacute o vencedor

            Essas duas estrateacutegias tambeacutem foram implementadas nesse simulador para o sistemaIRV e eacute possiacutevel ver como ele eacute resistente a elas Para que seja possiacutevel mudar os resultadosde uma eleiccedilatildeo sob o IRV eacute necessaacuterio mudar a ordem de eliminaccedilatildeo dos candidatos paraque o seu candidato preferido acabe enfrentando um candidato mais fraco nas rodadasfinais Isso natildeo ocorre com compromising e burying No proacuteximo cenaacuterio seraacute analisadacomo eacute possiacutevel modificar os resultados de uma eleiccedilatildeo sob o IRV

            Esses resultados podem ser replicados acessando os linksSem votos taacuteticos lthttpelectionsimpythonanywherecomdirect_res1111110

            --[0021][22Ana2222Beto222022Carla2222Diego22]------100gt

            Com 20 de voto taacutetico lthttpelectionsimpythonanywherecomdirect_res1111110--[0021][22Ana222022Beto2222Carla2222Diego22]1-[02000]---100gt

            Com 100 de voto taacuteticona Ana e Beto lthttpelectionsimpythonanywherecomdirect_res0000100--[0021][22Ana222022Beto222022Carla2222Diego22]1-[101000]---100gt

            41

            42 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV

            Neste cenaacuterio teremos Ana Carla e Beto concorrendo e trecircs perfis distintos que apoiamcada candidato As distribuiccedilotildees de notas dos perfis se encontram na tabela abaixo

            Tabela 12 ndash Distribuiccedilatildeo de notas - Cenaacuterio 2

            Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

            deeleitores

            1 10 5 0 422 0 10 5 303 5 0 10 28

            Com essas distribuiccedilotildees Carla eacute eliminada na primeira rodada e seus 28 de votossatildeo transferidos para a segunda opccedilatildeo de seus eleitores Ana que eacute eleita com 70 dosvotos e uma meacutedia de 56

            Figura 25 ndash IRV primeiro turno - Cenaacuterio 2

            Figura 26 ndash IRV segundo turno - Cenaacuterio 2

            42

            Cientes desse provaacutevel futuro cenaacuterio onde Ana eacute eleita uma pequena parte dos elei-tores de Beto estrategicamente o abandona e decide apoiar Carla na esperanccedila de leva-laao segundo turno contra Ana As novas distribuiccedilotildees de notas se encontram na tabelaabaixo com essa porccedilatildeo de eleitores representada pelo perfil 4

            Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2

            Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

            deeleitores

            1 10 5 0 422 0 10 5 283 5 0 10 284 0 8 10 2

            Essa mudanccedila estrateacutegica de voto altera a ordem de eliminaccedilotildees do sistema com Betosendo o primeiro a ser eliminado Com isso seus votos satildeo naturalmente transferidos paraCarla que derrota Ana no segundo turno com 58 dos votos

            Figura 27 ndash IRV primeiro turno com voto taacutetico - Cenaacuterio 2

            Figura 28 ndash IRV segundo turno com voto taacutetico - Cenaacuterio 2

            43

            Percebendo que a eleiccedilatildeo de Beto natildeo era provaacutevel seus eleitores conseguiram aomenos impedir a eleiccedilatildeo do pior candidato para eles Mas para isso foi necessaacuterio queeles tivessem a informaccedilatildeo de como os outros eleitores votariam Uma aproximaccedilatildeo dessasinformaccedilotildees poderia ser obtida em um cenaacuterio real com poucos candidatos atraveacutes depesquisas eleitorais poreacutem se o nuacutemero de candidatos eacute significativo uma noccedilatildeo completadas distribuiccedilotildees dos rankings dos eleitores se torna muito menos viaacutevel e dificulta aformulaccedilatildeo de estrateacutegias para alterar a ordem em que os candidatos satildeo eliminados

            Esses resultados podem ser replicados acessando os linksSem voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana22

            22Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

            Com voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana

            2222Beto2222Carla22]-----42Voter20Profile2001020520028Voter20Profile2010201020528Voter20Profile202520020102Voter20Profile20302082010100gt

            43 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE

            O interessante dos sistemas IRV e TRS eacute que os resultados do cenaacuterio anterior po-deriam ter sido obtidos ao inveacutes do voto taacutetico pela sua natildeo-monotonicidade Seriapossiacutevel que a Carla derrotasse a Ana no segundo turno atraveacutes do proacuteprio aumento depopularidade da Ana Assumindo que essa popularizaccedilatildeo ocorresse entre os candidatosdo perfil 2 onde 3 passasse a apoiar a Ana ao inveacutes do Beto as novas distribuiccedilotildeesseguiriam a tabela abaixo

            Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

            Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

            deeleitores

            1 10 5 0 452 0 10 5 273 5 0 10 28

            Dessa maneira Beto agora com uma porcentagem dos eleitores menor do que a deCarla seraacute eliminado na primeira rodada e como seus eleitores tecircm a Carla como segundaopccedilatildeo ela receberaacute todos os seus votos e seraacute eleita na segunda rodada As rodadas doIRV podem ser vistas nas figuras 29 e 30

            44

            Figura 29 ndash IRV primeiro turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

            Figura 30 ndash IRV segundo turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

            Tabela 15 ndash Resultados do Cenaacuterio 3Candidato

            eleitoMeacutedia das

            notasAntes da

            popularizaccedilatildeode Ana

            Ana 56

            Apoacutespopularizaccedilatildeo

            de AnaCarla 415

            Os efeitos dessa caracteriacutestica se refletem na satisfaccedilatildeo meacutedia da populaccedilatildeo A Ana eacuteclaramente a melhor candidata e mesmo com o seu ganho de popularidade (ou devido aele) a Carla eacute eleita

            Esses resultados podem ser replicados acessando os linksAntes da popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecom

            direct_res0010000---[22Ana2222Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

            45

            Apoacutes popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana2222Beto2222Carla22]-----45Voter20Profile2001020520027Voter20Profile2010201020528Voter20Profile20252002010100gt

            44 CENAacuteRIO 4 COALIZOtildeES

            O TRS por ser organizado em dois turnos separados normalmente a semanas dedistacircncia um do outro acaba abrindo brecha agrave mudanccedila de opiniatildeo por parte dos eleitorese o desenvolvimento de novas estrateacutegias por parte dos candidatos tais como a coalizatildeocom candidatos jaacute eliminados Com isso em mente nesse cenaacuterio teremos novamenteos quatro candidatos Ana Beto Carla e Diego Os trecircs primeiros seratildeo gerados dadistribuiccedilatildeo Neutral e Diego da distribuiccedilatildeo Disliked

            Figura 31 ndash TRS turno 1 - Cenaacuterio 4

            No TRS normal Ana Beto e Carla possuem com essas distribuiccedilotildees quantidades devotos muito proacuteximas com Beto e Carla indo para o segundo turno Carla estaacute 10 votosatraacutes de Beto e decide aproveitar o espaccedilo de tempo entre os dois turnos para tentaragregar mais votos Com isso Carla se aproxima de Diego e juntos formam uma coalizatildeoNo entanto com sua baixa popularidade Diego acaba ferindo a reputaccedilatildeo de Carla etorna o segundo turno muito mais faacutecil para Beto (Figura 33) Se Carla tivesse buscado osuporte de Ana por outro lado ela se veria vitoriosa no segundo turno e com uma amplavantagem sobre o Beto (Figura 34) Ou ateacute mesmo sem buscar uma coalizatildeo mesmosendo uma corrida apertada Carla teria naturalmente sido eleita (Figura 32)

            Esses resultados podem ser replicados acessando os linksSem coalizotildees lthttpelectionsimpythonanywherecomdirect_res0100000

            --[0002][22Ana222022Beto2222Carla2222Diego22]------100gt

            46

            Figura 32 ndash TRS turno 2 - Cenaacuterio 4

            Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4

            Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4

            47

            Coalizatildeo Carla e Diego lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2203Carla20Diego-100gt

            Coalizatildeo Carla e Ana lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2200Carla20Ana-100gt

            45 CENAacuteRIO 5 DILEMA DO PRISIONEIRO

            Neste cenaacuterio temos uma eleiccedilatildeo de uma vaga com trecircs candidatos concorrentes e trecircsperfis distintos de eleitores que seguiratildeo as seguintes distribuiccedilotildees

            Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5

            Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

            deeleitores

            1 10 -10 5 362 -10 10 5 343 -10 -10 5 30

            Esse contexto nos remete ao notaacutevel dilema do prisioneiro Nele dois prisioneiroscuacutemplices satildeo interrogados individualmente sem poder se comunicar um com o outro ecada um enfrenta o dilema de delatar ou natildeo o seu parceiro Se os dois prisioneirosdecidem se manter calados sobre o crime ambos satildeo sentenciados a um ano de prisatildeo Seapenas um deles dedurar o outro o traidor sai livre enquanto seu parceiro eacute condenadoa trecircs anos Se ambos dedurarem um ao outro eles satildeo condenados juntos a dois anosde prisatildeo Esse dilema eacute uma ideia claacutessica presente no estudo da teoria dos jogos sendooriginalmente elaborada por Merrill Flood e Melvin Dresher em 1950 e mais tarde sendonomeada de dilema dos prisioneiros por Albert W Tucker (POUNDSTONE 1992)

            O que esse dilema nos mostra eacute a tentaccedilatildeo que o indiviacuteduo deteacutem se sua racionalizaccedilatildeoestiver voltada para seus proacuteprios interesses e somente eles em oposiccedilatildeo a pensar no bemdo grupo como um todo Neste cenaacuterio encontramos dois grupos de eleitores expressiva-mente opostos os perfis 1 e 2 Se qualquer uma das preferecircncias desses perfis fosse eleitaisso significaria uma alta rejeiccedilatildeo de maior parte da populaccedilatildeo No entanto eles possuema segunda opccedilatildeo em comum a Carla que por sua vez eacute a preferecircncia do terceiro perfilPortanto a eleiccedilatildeo da Carla seria logicamente o resultado oacutetimo

            Mesmo assim a Ana eacute eleita nos dois sistemas acima o que natildeo parece justo poispela tabela 16 eacute evidente que apenas 36 da populaccedilatildeo a aprova enquanto que os outros64 a reprovam ao maacuteximo O sistema IRV se comporta de maneira idecircntica ao TRS

            48

            Figura 35 ndash FPTP - Cenaacuterio 5

            Figura 36 ndash TRS segundo turno - Cenaacuterio 5

            nesta situaccedilatildeo Com esse resultado a meacutedia das notas eacute -28 No entanto os trecircs sistemasseguintes nos apresentam resultados diferentes

            Tabela 17 ndash Resultados do Cenaacuterio 5

            Sistema Candidatoeleito

            Meacutedia dasnotas

            FPTP Ana -28TRS Ana -28IRV Ana -28AVS Carla 50BC Carla 50SVS Carla 50

            49

            Figura 37 ndash AVS - Cenaacuterio 5

            Figura 38 ndash BC - Cenaacuterio 5

            Tanto o AVS quanto o Borda Count e o SVS satildeo sistemas que consideram todasas opiniotildees de cada eleitor ao mesmo tempo e por isso satildeo capazes de eleger o melhorcandidato nesta situaccedilatildeo diferentemente do TRS que natildeo absorve completamente todosentimento do eleitor por todos os candidatos e o IRV que apesar de ser bem expressivoquebra esse processo em inuacutemeras rodadas o que permite a perda de informaccedilatildeo ao longodelas

            Esses resultados podem ser replicados acessando o linklthttpelectionsimpythonanywherecomdirect_res1111110---[22Ana

            222022Beto222022Carla22]-----36Voter20Profile2001020-1020534Voter20Profile201-10201020530Voter20Profile202-1020-10205100gt

            50

            Figura 39 ndash SVS - Cenaacuterio 5

            46 CENAacuteRIO 6 VOTO DE MINORIA

            Neste cenaacuterio temos uma eleiccedilatildeo com quatro candidatos e duas vagas A Ana seraacutea preferecircncia de uma extensa parte da populaccedilatildeo (distribuiccedilatildeo Loved Figura 53) Betoe Carla seratildeo candidatos razoavelmente populares (distribuiccedilatildeo Neutral Figura 47) eDiego seraacute a preferecircncia de apenas um pequeno grupo especiacutefico e rejeitado pela maioria(distribuiccedilatildeo Disliked Figura 51) Eacute intuitivo esperar que os dois candidatos eleitos seratildeoa Ana e ou o Beto ou a Carla e isso eacute exatamente o que ocorre na figura 40 no sistemaFPTP sem voto de minoria

            Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria

            Eacute evidente a discrepacircncia da quantidade de votos da Ana para os outros candidatose apesar de Beto e Carla serem mais populares que Diego os trecircs natildeo se encontrammuito afastados Poreacutem se a pequena fraccedilatildeo de candidatos que possuem a Ana como

            51

            Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego

            preferecircncia e Diego como segunda opccedilatildeo optarem pelo voto de minoria a situaccedilatildeo mudacompletamente (Figura 41) Assim apesar de extensamente rejeitado Diego conquistaa segunda vaga e a meacutedia das notas despenca de 2929 para 0505 No entanto aindaexiste um cenaacuterio pior Se os outros grupos de eleitores pensarem da mesma forma eevitarem votar na Ana achando que sua eleiccedilatildeo jaacute estaacute assegurada apenas 80 de votode minoria para esses grupos jaacute eacute o suficiente para eliminaacute-la das eleiccedilotildees (Figura 42)Com a Ana eliminada a meacutedia das notas cai ainda mais para 0058

            Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego

            O sistema Bloc Vote eacute uma das soluccedilotildees para o voto de minoria Permitindo queos eleitores votem no mesmo nuacutemero de candidatos que de vagas a serem preenchidasnatildeo existe o iacutempeto a esse tipo de voto estrateacutegico O resultado desse sistema portantoretorna a meacutedia das notas a casa dos 29 (Figura 43) Os sistemas AVS Borda Count eSVS tambeacutem impedem a presenccedila do voto de minoria e atingem resultados semelhantes

            52

            Figura 43 ndash BV - Cenaacuterio 6

            Tabela 18 ndash Resultados do Cenaacuterio 6

            Sistema Candidatoseleitos

            Meacutedia dasnotas

            FPTP sem voto de minoriaAna eBeto 2929

            FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

            FPTP com 80 de voto de minoriaBeto eCarla 0058

            Bloc VoteAna eCarla 2913

            Esses resultados podem ser replicados acessando os links

            Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

            100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

            80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

            53

            5 COMO FUNCIONA O SIMULADOR

            O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

            51 CLASSE ELECTIONS

            Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

            bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

            Figura 44 ndash estrutura candidates

            bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

            bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

            Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

            Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

            54

            Figura 45 ndash estrutura voters

            Figura 46 ndash estrutura votes

            daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

            Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

            55

            Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

            Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

            na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

            56

            Figura 49 ndash PDF - Distribuiccedilatildeo Liked

            Figura 50 ndash CDF - Distribuiccedilatildeo Liked

            (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

            Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

            57

            Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

            Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

            candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

            Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

            58

            Figura 53 ndash PDF - Distribuiccedilatildeo Loved

            Figura 54 ndash CDF - Distribuiccedilatildeo Loved

            funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

            59

            Figura 55 ndash PDF - Distribuiccedilatildeo Hated

            Figura 56 ndash CDF - Distribuiccedilatildeo Hated

            Meacutedia das Notas sumei

            sumvj nij

            etimes v

            Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

            Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

            60

            Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

            Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

            52 CLASSE FIRSTPASTTHEPOST

            Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

            Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

            61

            Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

            Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

            mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

            62

            53 CLASSE TWOROUNDSYSTEM

            A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

            54 CLASSE INSTANTRUNOFFVOTING

            A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

            Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

            63

            cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

            55 CLASSE APPROVALVOTING

            Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

            56 CLASSE BORDACOUNT

            Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

            57 CLASSE SCOREVOTING

            De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

            64

            58 CLASSE BLOCVOTE

            O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

            59 TECNOLOGIAS UTILIZADAS

            A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

            Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

            O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

            Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

            65

            6 CONCLUSAtildeO

            Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

            Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

            Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

            Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

            Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

            66

            REFEREcircNCIAS

            AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

            Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

            Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

            Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

            HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

            LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

            ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

            Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

            POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

            The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

            67

            APEcircNDICES

            APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

            Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

            if(not len(selfvoter_profiles))

            for voter in range(selfN_VOTERS)

            candidates_rank = dict()

            for candidate in reversed(range(selfN_CANDIDATES))

            if(selfBIAS_VECTOR[candidate]==4)

            candidates_rank[candidate] = self_sortear(selfloved)

            elif(selfBIAS_VECTOR[candidate]==3)

            candidates_rank[candidate] = self_sortear(selfliked)

            elif(selfBIAS_VECTOR[candidate]==2)

            candidates_rank[candidate] = self_sortear(selfdisliked)

            elif(selfBIAS_VECTOR[candidate]==1)

            candidates_rank[candidate] = self_sortear(selfhated)

            elif(selfBIAS_VECTOR[candidate]==-1)

            candidates_rank[candidate] = self_sortear(selfpolarizer

            )

            elif(selfBIAS_VECTOR[candidate]==-2)

            candidates_rank[candidate] = self_sortear(self

            more_polarizer)

            else

            candidates_rank[candidate] = self_sortear(selfneutral)

            selfvotersappend(candidates_rank)

            else

            ranges = []

            ranks = []

            for prof in selfvoter_profiles

            rangesappend(int(prof[pop_percentage]))

            rank =

            for index score in enumerate(prof[scores])

            rank[index] = score

            ranksappend(rank)

            for index _range in enumerate(ranges)

            for _ in range(int(selfN_VOTERS(_range100)))

            selfvotersappend(ranks[index])

            68

            APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

            Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

            for i in range(selfN_CANDIDATES)

            selfcandidates[i] = 0

            selfvotes[i] = set()

            APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

            Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

            for candidate in range(selfN_CANDIDATES)

            rating_sum = 0

            for voter in selfvoters

            rating_sum += voter[candidate]

            selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

            APEcircNDICE D ndash MEacuteTODO GET_MEAN

            Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

            if len(winners) gt 1 or selfN_CANDIDATES gt 10

            return selfcalculate_mean(winners)

            else

            chose_best = True if winners[0] == selfbest_candidate else

            False

            return selfstats[rsquomeansrsquo][winners[0]] chose_best

            69

            APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

            Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

            rating_sum = 0

            for voter in selfvoters

            for candidate in winners

            rating_sum += voter[candidate]

            return rating_sum(selfN_VOTERSselfN_VACANCIES) False

            APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

            Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

            for i in range(1 selfN_VACANCIES + 2)

            selfleading_candidatesappend(selfsorted_candidates[-i][self

            CANDIDATE_INDEX])

            APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

            Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

            for leader in selfelecrounds[-1]

            selfleading_candidatesappend(leader[0])

            70

            APEcircNDICE H ndash MEacuteTODO SORT_RANKS

            Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

            self_account_for_coalitions()

            for voter in selfvoters

            selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

            (1)))

            temp = []

            for voter in selfsorted_voters

            new_dict = defaultdict(list)

            for k in voter

            new_dict[k[1]]append(k[0])

            tempappend(new_dict)

            selfsorted_voters = []

            for voter_index current_voter in enumerate(temp)

            new_voter = []

            for rating candidate_indexes in current_voteritems()

            if len(current_voter[rating]) gt 1

            shuffle(current_voter[rating])

            for e in candidate_indexes

            new_voterappend((e rating))

            else

            new_voterappend((candidate_indexes[0] rating))

            selfsorted_votersappend(new_voter)

            selfcandidates[new_voter[-1][0]] += 1

            selfvotes[new_voter[-1][0]]add(voter_index)

            71

            APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

            Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

            for candidate in selfvotes_copy

            if candidate not in selfelecleading_candidates

            for voter_index in selfvotes_copy[candidate]

            for index _candidate in enumerate(reversed(selfelec

            sorted_voters[voter_index]))

            if _candidate[selfelecCANDIDATE_INDEX] in selfelec

            leading_candidates

            if randomrandom() lt selfelec

            tactical_vote_percentages[_candidate[selfelec

            CANDIDATE_INDEX]]

            selfrankings_changed[voter_index] = copy

            deepcopy(selfelecsorted_voters[voter_index])

            selfrankings_changed[voter_index][-(index + 1)]

            selfrankings_changed[voter_index][-1] = self

            rankings_changed[voter_index][-1] self

            rankings_changed[voter_index][-(index + 1)]

            selfcandidates[candidate] -= 1

            selfcandidates[_candidate[selfelec

            CANDIDATE_INDEX]] += 1

            selfvotes[candidate]remove(voter_index)

            selfvotes[_candidate[selfelecCANDIDATE_INDEX

            ]]add(voter_index)

            break

            break

            72

            APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

            Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

            half_vacancies = mathfloor(selfelecN_VACANCIES2)

            for candidate in selfelecleading_candidates

            if selfelecleading_candidatesindex(candidate) gt= half_vacancies

            continue

            for voter_index in selfvotes_copy[candidate]

            if voter_index in selfrankings_changed

            ranking = selfrankings_changed[voter_index]

            else

            ranking = copydeepcopy(selfelecsorted_voters[voter_index

            ])

            for index _candidate in enumerate(reversed(ranking))

            if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

            leading_candidates or (_candidate[selfelec

            CANDIDATE_INDEX] in selfelecleading_candidates and

            selfelecleading_candidatesindex(_candidate[selfelec

            CANDIDATE_INDEX]) gt= half_vacancies)

            if _candidate[selfelecCANDIDATE_RANK] gt= 0

            if randomrandom() lt selfelec

            minority_vote_percentages[_candidate[selfelec

            CANDIDATE_INDEX]]

            selfcandidates[candidate] -= 1

            selfcandidates[_candidate[selfelec

            CANDIDATE_INDEX]] += 1

            break

            break

            break

            73

            APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

            Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

            self_account_for_coalitions()

            for candidate in selfvotes

            if candidate = selfwinner and candidate = selfsecond_place

            for voter_index in selfvotes[candidate]

            if voter_index in selfrankings_changed

            ranking = selfrankings_changed[voter_index]

            else

            ranking = copydeepcopy(selfelecsorted_voters[

            voter_index])

            for index2 candidate in enumerate(reversed(ranking))

            if candidate[selfelecCANDIDATE_INDEX] == selfwinner

            selfcandidates[selfwinner] += 1

            selfvotes[selfwinner]add(voter_index)

            break

            elif candidate[selfelecCANDIDATE_INDEX] == self

            second_place

            selfcandidates[selfsecond_place] += 1

            selfvotes[selfsecond_place]add(voter_index)

            break

            selfsorted_candidates = selfelecsort_candidates(selfcandidates)

            winners = []

            vacancies = selfelecN_VACANCIES

            for candidate in reversed(selfsorted_candidates)

            if vacancies == 0

            break

            winnersappend(candidate[0])

            vacancies -= 1

            mean chose_best = selfelecget_mean(winners = winners)

            74

            APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

            Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

            for voter_index voter in enumerate(selfelecsorted_voters)

            voter_dict = dict()

            og_voter_dict = dict()

            for tup in voter

            voter_dict[tup[0]] = tup[1]

            og_voter_dict[tup[0]] = tup[1]

            for coalition in selfeleccoalitions

            for candidate in coalition

            add_to_score = 0

            for candidate2 in coalition

            if candidate == candidate2

            continue

            half = og_voter_dict[candidate2[rsquovaluersquo]]2

            if half lt 0

            add_to_score += mathceil(half)

            else

            add_to_score += mathfloor(half)

            if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

            voter_dict[candidate[rsquovaluersquo]] = 10

            elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

            voter_dict[candidate[rsquovaluersquo]] = -10

            else

            voter_dict[candidate[rsquovaluersquo]] += add_to_score

            selfrankings_changed[voter_index] = []

            for candidate in voter_dict

            selfrankings_changed[voter_index]append((candidate voter_dict[

            candidate]))

            selfrankings_changed[voter_index] = sorted(selfrankings_changed[

            voter_index] key=lambda x x[1])

            75

            APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

            Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

            selfelecroundsappend(selfsorted_candidates[_round])

            if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

            N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

            N_VACANCIES - 1)

            return 2

            elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

            N_VOTERS gt 05)

            return 1

            else

            selfelecexcludedadd(selfsorted_candidates[_round][selfelec

            CANDIDATE_INDEX])

            for voter_index in selfvotes[selfsorted_candidates[_round][self

            elecCANDIDATE_INDEX]]

            if voter_index in selfrankings_changed

            for candidate in reversed(selfrankings_changed[voter_index

            ])

            if candidate[selfelecCANDIDATE_INDEX] not in selfelec

            excluded

            selfcandidates[candidate[selfelecCANDIDATE_INDEX

            ]] += 1

            selfvotes[candidate[selfelecCANDIDATE_INDEX]]

            add(voter_index)

            break

            else

            continue

            else

            for candidate in reversed(selfelecsorted_voters[

            voter_index])

            if candidate[selfelecCANDIDATE_INDEX] not in selfelec

            excluded

            selfcandidates[candidate[selfelecCANDIDATE_INDEX

            ]] += 1

            selfvotes[candidate[selfelecCANDIDATE_INDEX]]

            add(voter_index)

            break

            else

            continue

            selfsorted_candidates = selfelecsort_candidates(selfcandidates)

            return 0

            76

            APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

            Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

            for index in range(selfelecN_CANDIDATES)

            selfcandidates[index] = 0

            for voter in selfelecsorted_voters

            for candidate in reversed(voter)

            if candidate[selfelecCANDIDATE_SCORE] gt 0

            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

            else

            break

            APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

            Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

            for index in range(selfelecN_CANDIDATES)

            selfcandidates[index] = 0

            for voter in selfelecsorted_voters

            if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

            elecCANDIDATE_INDEX]]

            selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

            else

            for candidate in reversed(voter)

            if candidate[selfelecCANDIDATE_SCORE] gt 0

            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

            else

            break

            77

            APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

            Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

            pos = set()

            for index perc in enumerate(selfelectactical_vote_percentages)

            if perc gt 0

            posadd(index)

            for candidate in selfeleccandidates

            if candidate not in selfleading_candidates

            for voter_index in selfvotes[candidate]

            raised = None

            for candidate_tuple in reversed(selfelecsorted_voters[voter_index

            ])

            if candidate_tuple[selfelecCANDIDATE_INDEX] in self

            leading_candidates

            if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

            if randomrandom() lt selfelectactical_vote_percentages[

            candidate_tuple[selfelecCANDIDATE_INDEX]]

            ranking = [None]selfelecN_CANDIDATES

            ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

            selfelecvoters[voter_index][candidate_tuple[selfelec

            CANDIDATE_INDEX]])

            raised = candidate_tuple[selfelecCANDIDATE_INDEX]

            break

            break

            break

            if raised = None

            for _candidate in selfleading_candidates

            if _candidate = ranking[-1][0]

            ranking[0] = (_candidate selfelecvoters[voter_index][

            _candidate])

            buried = _candidate

            break

            i = 1

            for candidate_tuple in selfelecsorted_voters[voter_index]

            if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

            buried]

            continue

            else

            ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

            selfelecvoters[voter_index][candidate_tuple[selfelec

            CANDIDATE_INDEX]])

            i += 1

            selfrankings_changed[voter_index] = ranking

            78

            APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

            Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

            for voter_index in selfvotes[candidate]

            if randomrandom() lt selfelectactical_vote_percentages[candidate

            ]

            for _candidate in selfleading_candidates

            if _candidate = candidate

            ranking = [None]selfelecN_CANDIDATES

            ranking[0] = (_candidate selfelecvoters[voter_index][

            _candidate])

            buried = _candidate

            break

            i = 1

            for candidate_tuple in selfelecsorted_voters[voter_index]

            if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

            continue

            else

            ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

            selfelecvoters[voter_index][candidate_tuple[selfelec

            CANDIDATE_INDEX]])

            i += 1

            selfrankings_changed[voter_index] = ranking

            79

            APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

            Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

            for index in range(selfelecN_CANDIDATES)

            selfcandidates[index] = 0

            for voter_index voter in enumerate(selfelecsorted_voters)

            score = 0

            if voter_index in selfrankings_changed

            for candidate in selfrankings_changed[voter_index]

            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

            score += 1

            else

            for candidate in voter

            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

            score += 1

            APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

            Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

            for voter_index voter in enumerate(selfelecsorted_voters)

            if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

            elecCANDIDATE_INDEX]]

            selfrankings_changed[voter_index] = copydeepcopy(selfelec

            sorted_voters[voter_index])

            for candidate_index candidate in enumerate(reversed(voter))

            if candidate_index == 0

            selfrankings_changed[voter_index][-(candidate_index + 1)] = (

            voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

            else

            selfrankings_changed[voter_index][-(candidate_index + 1)] = (

            voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

            80

            APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

            Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

            for index in range(selfelecN_CANDIDATES)

            selfcandidates[index] = 0

            for voter_index voter in enumerate(selfelecsorted_voters)

            if voter_index in selfrankings_changed

            for candidate in selfrankings_changed[voter_index]

            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

            selfelecCANDIDATE_RANK]

            else

            for candidate in voter

            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

            selfelecCANDIDATE_RANK]

            APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

            Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

            for index in range(selfelecN_CANDIDATES)

            selfcandidates[index] = 0

            for voter in selfelecsorted_voters

            votes = selfelecN_VACANCIES

            for candidate in reversed(voter)

            if votes == 0

            break

            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

            votes -= 1

            • Folha de aprovaccedilatildeo
            • Agradecimentos
            • Epiacutegrafe
            • Resumo
            • Abstract
            • Lista de ilustraccedilotildees
            • Lista de Coacutedigos
            • Lista de tabelas
            • Lista de abreviaturas e siglas
            • Sumaacuterio
            • INTRODUCcedilAtildeO
              • MOTIVACcedilAtildeO E OBJETIVO
              • MEacuteTODO
              • ESTRUTURA
                • SISTEMAS ELEITORAIS
                  • FISRT PAST THE POST
                    • Exemplo
                    • Vantagens e Desvantagens do FPTP
                    • Voto Uacutetil no FPTP
                      • TWO-ROUND SYSTEM
                        • Exemplo
                        • Vantagens e Desvantagens do TRS
                        • Voto Uacutetil no TRS
                          • INSTANT-RUNOFF VOTING
                            • Exemplo
                            • Vantagens e Desvantagens do IRV
                            • Voto Uacutetil no IRV
                              • APPROVAL VOTING SYSTEM
                                • Exemplo
                                • Vantagens e Desvantagens do AVS
                                • Voto Uacutetil no AVS
                                  • THE BORDA COUNT
                                    • Exemplo
                                    • Vantagens e Desvantagens do BC
                                    • Voto Uacutetil no BC
                                      • SCORE VOTING SYSTEM
                                        • Exemplo
                                        • Vantagens e Desvantagens do SVS
                                        • Voto Uacutetil no SVS
                                          • BLOC VOTE
                                            • Exemplo
                                            • Voto Uacutetil no BV
                                                • O SIMULADOR
                                                • CENAacuteRIOS PERTINENTES
                                                  • CENAacuteRIO 1 VOTO TAacuteTICO
                                                  • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                  • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                  • CENAacuteRIO 4 COALIZOtildeES
                                                  • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                  • CENAacuteRIO 6 VOTO DE MINORIA
                                                    • COMO FUNCIONA O SIMULADOR
                                                      • CLASSE Elections
                                                      • CLASSE FirstPastThePost
                                                      • CLASSE TwoRoundSystem
                                                      • CLASSE InstantRunoffVoting
                                                      • CLASSE ApprovalVoting
                                                      • CLASSE BordaCount
                                                      • CLASSE ScoreVoting
                                                      • CLASSE BlocVote
                                                      • TECNOLOGIAS UTILIZADAS
                                                        • CONCLUSAtildeO
                                                        • Referecircncias
                                                        • Meacutetodo create_voters
                                                        • Meacutetodo create_candidates
                                                        • Meacutetodo calculate_means
                                                        • Meacutetodo get_mean
                                                        • Meacutetodo calculate_mean
                                                        • Meacutetodo set_leading_candidates
                                                        • Meacutetodo irv_set_leading_candidates
                                                        • Meacutetodo sort_ranks
                                                        • Meacutetodo fptp_count_tactical_votes
                                                        • Meacutetodo fptp_count_minority_votes
                                                        • Meacutetodo trs_second_round
                                                        • Meacutetodo trs_account_for_coalitions
                                                        • Meacutetodo irv_count_votes
                                                        • Meacutetodo avs_count_votes
                                                        • Meacutetodo avs_count_votes_with_tactical
                                                        • Meacutetodo irv_apply_tactical_votes
                                                        • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                        • Meacutetodo bc_sum_candidates_scores
                                                        • Meacutetodo svs_apply_tactical_votes
                                                        • Meacutetodo svs_sum_candidates_scores
                                                        • Meacutetodo bv_count_votes

              LISTA DE ILUSTRACcedilOtildeES

              Figura 1 ndash de paiacuteses de cada tipo de regime 1946-2016 17Figura 2 ndash Captura de tela 1 30Figura 3 ndash Captura de tela 2 30Figura 4 ndash Captura de tela 3 31Figura 5 ndash Captura de tela 4 32Figura 6 ndash Captura de tela 5 32Figura 7 ndash Captura de tela 6 33Figura 8 ndash FPTP - Cenaacuterio 1 sem voto taacutetico 34Figura 9 ndash TRS segundo turno - Cenaacuterio 1 sem voto taacutetico 34Figura 10 ndash IRV primeiro turno - Cenaacuterio 1 35Figura 11 ndash IRV segundo turno - Cenaacuterio 1 35Figura 12 ndash IRV terceiro turno - Cenaacuterio 1 35Figura 13 ndash AVS - Cenaacuterio 1 sem voto taacutetico 36Figura 14 ndash BC - Cenaacuterio 1 sem voto taacutetico 36Figura 15 ndash SVS - Cenaacuterio 1 sem voto taacutetico 36Figura 16 ndash FPTP - Cenaacuterio 1 - 20 de voto taacutetico na Ana 37Figura 17 ndash TRS segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana 37Figura 18 ndash IRV primeiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana 38Figura 19 ndash IRV segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana 38Figura 20 ndash IRV terceiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana 38Figura 21 ndash AVS - Cenaacuterio 1 20 de voto taacutetico na Ana 39Figura 22 ndash BC - Cenaacuterio 1 20 de voto taacutetico na Ana 39Figura 23 ndash SVS - Cenaacuterio 1 20 de voto taacutetico na Ana 39Figura 24 ndash BC - Cenaacuterio 1 100 de voto taacutetico na Ana e Beto 40Figura 25 ndash IRV primeiro turno - Cenaacuterio 2 41Figura 26 ndash IRV segundo turno - Cenaacuterio 2 41Figura 27 ndash IRV primeiro turno com voto taacutetico - Cenaacuterio 2 42Figura 28 ndash IRV segundo turno com voto taacutetico - Cenaacuterio 2 42Figura 29 ndash IRV primeiro turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3 44Figura 30 ndash IRV segundo turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3 44Figura 31 ndash TRS turno 1 - Cenaacuterio 4 45Figura 32 ndash TRS turno 2 - Cenaacuterio 4 46Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4 46Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4 46Figura 35 ndash FPTP - Cenaacuterio 5 48Figura 36 ndash TRS segundo turno - Cenaacuterio 5 48

              Figura 37 ndash AVS - Cenaacuterio 5 49Figura 38 ndash BC - Cenaacuterio 5 49Figura 39 ndash SVS - Cenaacuterio 5 50Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria 50Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego 51Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego 51Figura 43 ndash BV - Cenaacuterio 6 52Figura 44 ndash estrutura candidates 53Figura 45 ndash estrutura voters 54Figura 46 ndash estrutura votes 54Figura 47 ndash PDF - Distribuiccedilatildeo Neutral 55Figura 48 ndash CDF - Distribuiccedilatildeo Neutral 55Figura 49 ndash PDF - Distribuiccedilatildeo Liked 56Figura 50 ndash CDF - Distribuiccedilatildeo Liked 56Figura 51 ndash PDF - Distribuiccedilatildeo Disliked 57Figura 52 ndash CDF - Distribuiccedilatildeo Disliked 57Figura 53 ndash PDF - Distribuiccedilatildeo Loved 58Figura 54 ndash CDF - Distribuiccedilatildeo Loved 58Figura 55 ndash PDF - Distribuiccedilatildeo Hated 59Figura 56 ndash CDF - Distribuiccedilatildeo Hated 59Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer 60Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer 60Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer 61Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer 61

              LISTA DE COacuteDIGOS

              A1 Meacutetodo create_voters 67B1 Meacutetodo create_candidates 68C1 Meacutetodo calculate_means 68D1 Meacutetodo get_mean 68E1 Meacutetodo calculate_mean 69F1 Meacutetodo set_leading_candidates 69G1 Meacutetodo irv_set_leading_candidates 69H1 Meacutetodo sort_ranks 70I1 Meacutetodo fptp_count_tactical_votes 71J1 Meacutetodo fptp_count_minority_votes 72K1 Meacutetodo trs_second_round 73L1 Meacutetodo trs_account_for_coalitions 74M1 Meacutetodo irv_count_votes 75N1 Meacutetodo avs_count_votes 76O1 Meacutetodo avs_count_votes_with_tactical 76P1 Meacutetodo irv_apply_tactical_votes 77Q1 Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo) 78R1 Meacutetodo bc_sum_candidates_scores 79S1 Meacutetodo svs_apply_tactical_votes 79T1 Meacutetodo svs_sum_candidates_scores 80U1 Meacutetodo bv_count_votes 80

              LISTA DE TABELAS

              Tabela 1 ndash Exemplo FPTP 18Tabela 2 ndash 2deg turno do TRS 20Tabela 3 ndash Exemplo IRV 22Tabela 4 ndash Desenvolvimento do IRV 22Tabela 5 ndash Exemplo AVS 24Tabela 6 ndash Resultado AVS 24Tabela 7 ndash Resultado BC 26Tabela 8 ndash Exemplo SVS 27Tabela 9 ndash Resultado SVS 27Tabela 10 ndash Exemplo BV 28Tabela 11 ndash Resultado BV 28Tabela 12 ndash Distribuiccedilatildeo de notas - Cenaacuterio 2 41Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2 42Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3 43Tabela 15 ndash Resultados do Cenaacuterio 3 44Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5 47Tabela 17 ndash Resultados do Cenaacuterio 5 48Tabela 18 ndash Resultados do Cenaacuterio 6 52

              LISTA DE ABREVIATURAS E SIGLAS

              FPTP First Past The Post

              TRS Two-Round System

              IRV Instant Runoff Voting

              AVS Approval Voting System

              BC Borda Count

              SVS Score Voting System

              BV Bloc Vote

              SUMAacuteRIO

              1 INTRODUCcedilAtildeO 1511 MOTIVACcedilAtildeO E OBJETIVO 1512 MEacuteTODO 1513 ESTRUTURA 15

              2 SISTEMAS ELEITORAIS 1721 FISRT PAST THE POST 17211 Exemplo 18212 Vantagens e Desvantagens do FPTP 18213 Voto Uacutetil no FPTP 1922 TWO-ROUND SYSTEM 19221 Exemplo 20222 Vantagens e Desvantagens do TRS 20223 Voto Uacutetil no TRS 2123 INSTANT-RUNOFF VOTING 21231 Exemplo 22232 Vantagens e Desvantagens do IRV 22233 Voto Uacutetil no IRV 2324 APPROVAL VOTING SYSTEM 24241 Exemplo 24242 Vantagens e Desvantagens do AVS 24243 Voto Uacutetil no AVS 2525 THE BORDA COUNT 25251 Exemplo 25252 Vantagens e Desvantagens do BC 26253 Voto Uacutetil no BC 2626 SCORE VOTING SYSTEM 26261 Exemplo 27262 Vantagens e Desvantagens do SVS 27263 Voto Uacutetil no SVS 2727 BLOC VOTE 28271 Exemplo 28272 Voto Uacutetil no BV 29

              3 O SIMULADOR 30

              4 CENAacuteRIOS PERTINENTES 3441 CENAacuteRIO 1 VOTO TAacuteTICO 3442 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV 4143 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE 4344 CENAacuteRIO 4 COALIZOtildeES 4545 CENAacuteRIO 5 DILEMA DO PRISIONEIRO 4746 CENAacuteRIO 6 VOTO DE MINORIA 50

              5 COMO FUNCIONA O SIMULADOR 5351 CLASSE Elections 5352 CLASSE FirstPastThePost 6053 CLASSE TwoRoundSystem 6254 CLASSE InstantRunoffVoting 6255 CLASSE ApprovalVoting 6356 CLASSE BordaCount 6357 CLASSE ScoreVoting 6358 CLASSE BlocVote 6459 TECNOLOGIAS UTILIZADAS 64

              6 CONCLUSAtildeO 65

              REFEREcircNCIAS 66

              APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS 67

              APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES 68

              APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS 68

              APEcircNDICE D ndash MEacuteTODO GET_MEAN 68

              APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN 69

              APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES 69

              APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES 69

              APEcircNDICE H ndash MEacuteTODO SORT_RANKS 70

              APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES 71

              APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES 72

              APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND 73

              APEcircNDICE L ndash MEacuteTODOTRS_ACCOUNT_FOR_COALITIONS 74

              APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES 75

              APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES 76

              APEcircNDICE O ndash MEacuteTODOAVS_COUNT_VOTES_WITH_TACTICAL 76

              APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES 77

              APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES (CON-TINUACcedilAtildeO) 78

              APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES 79

              APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES 79

              APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES 80

              APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES 80

              15

              1 INTRODUCcedilAtildeO

              Em toda eleiccedilatildeo existe pelo menos um grupo de indiviacuteduos que sai completamentedesfavorecido e insatisfeito com o resultado O contentamento completo de uma populaccedilatildeoeacute certamente improvaacutevel e muitas vezes impossiacutevel considerando a gama de candidatosque se dispotildee a concorrer Em todo caso o miacutenimo que pode ser feito eacute escolher demaneira eficiente o melhor candidato ao cargo dentre as opccedilotildees disponiacuteveis Diante dissoeacute necessaacuterio avaliar como essa escolha eacute feita e quais meacutetodos satildeo capazes de tornaacute-larealidade

              11 MOTIVACcedilAtildeO E OBJETIVO

              Em conformidade com o extenso nuacutemero de sistemas eleitorais pelo mundo este tra-balho tem como objetivo testar uma porccedilatildeo desses sistemas sob a simulaccedilatildeo de diferentescenaacuterios especiacuteficos a fim de determinar quais deles podem ser considerados como os maisjustos perante a taxa de satisfaccedilatildeo meacutedia da populaccedilatildeo

              12 MEacuteTODO

              Para que essa anaacutelise seja possiacutevel foi desenvolvido um programa que permite a criaccedilatildeoe configuraccedilatildeo de diferentes cenaacuterios onde os sistemas eleitorais seratildeo simulados Nele eacutepossiacutevel definir o nuacutemero total de eleitores e candidatos como esses eleitores iratildeo votar eo niacutevel de popularidade de cada candidato Aleacutem disso eacute possiacutevel formar coalizotildees entreos candidatos e escolher a porcentagem dos eleitores que optaratildeo pelo voto uacutetil Dessamaneira seraacute possiacutevel elaborar cenaacuterios que buscam expor os pontos fortes e fracos decada sistema

              13 ESTRUTURA

              Este trabalho eacute relatado ao longo de seis capiacutetulos No Capiacutetulo 2 seratildeo apresentados ossistemas eleitorais implementados no simulador suas vantagens e desvantagens conhecidase outras caracteriacutesticas especiacuteficas de cada um A intenccedilatildeo do capiacutetulo eacute tornar o textomais autocontido trazendo conceitos jaacute estudados que ajudaratildeo na melhor compreensatildeodos capiacutetulos seguintes por isso grande parte de sua composiccedilatildeo eacute oriunda de diferentesfontes consultadas

              O Capiacutetulo 3 eacute uma apresentaccedilatildeo das funcionalidades que o simulador possui Seratildeoexplicados todos os campos de entrada e os dois modos distintos nos quais o programaopera

              16

              No Capiacutetulo 4 os sistemas seratildeo colocados em teste Todos seratildeo simulados em cenaacuteriosespeciacuteficos a fim de fazer sobressair aqueles com as maiores taxas de satisfaccedilatildeo meacutedia

              A estrutura e implementaccedilatildeo do simulador seratildeo abordadas em detalhes no Capiacutetulo5 assim como uma breve descriccedilatildeo da stack utilizada Todos os meacutetodos relevantes aofuncionamento das simulaccedilotildees seratildeo explicados passo a passo

              No Capiacutetulo 6 seratildeo apresentadas as conclusotildees referentes agrave anaacutelise dos resultadosobtidos no Capiacutetulo 4 e as consideraccedilotildees finais do projeto como um todo

              17

              2 SISTEMAS ELEITORAIS

              Atualmente mais e mais paiacuteses estatildeo adotando sistemas democraacuteticos de governoCerca de 6 em 10 governos no mundo satildeo democracias (Pew Research Center 2017) o quepode ser observado na Figura 1 abaixo Em um sistema democraacutetico a populaccedilatildeo escolheseus liacutederes atraveacutes de seu sistema eleitoral Existem diversos sistemas eleitorais em usono mundo muitos dos quais satildeo usados em conjunto para eleger um uacutenico candidato Emvaacuterios paiacuteses mais de um sistema eleitoral pode ser utilizado tambeacutem em diferentes niacuteveisde governo tanto presidencial quanto estadual ou municipal Natildeo apenas imersos nomeio poliacutetico eles tambeacutem podem ser usados em escopos menores como em esportes oucompeticcedilotildees artiacutesticas poreacutem sempre com a finalidade de alocar um ou mais indiviacuteduosa determinado cargo ou tiacutetulo

              Figura 1 ndash de paiacuteses de cada tipo de regime 1946-2016

              Fonte Center of Systemic Peacersquos Polity IV Project

              Os proacuteximos trecircs toacutepicos discutidos neste capiacutetulo referentes aos meacutetodos First Pastthe Post Two-Round System e Instant Runoff Voting possuem seus conceitos e infor-maccedilotildees relevantes com exceccedilatildeo dos exemplos traduzidos livremente do livro Behind theBallot Box A Citizenrsquos Guide to Voting Systems (AMY 2000)

              21 FISRT PAST THE POST

              O meacutetodo First Past the Post tambeacutem conhecido como Plurality Voting ou WinnerTakes All eacute o meacutetodo mais simples e direto e provavelmente o primeiro meacutetodo que sepensa quando se fala de eleiccedilotildees Os eleitores escolhem apenas um candidato e apoacutes a

              18

              contagem dos votos o candidato com o maior nuacutemero de votos eacute eleito O vencedor natildeonecessita da aprovaccedilatildeo de mais de 50 dos eleitores ele apenas precisa de uma pluralidadedos votos ou seja apenas possuir mais votos que os outros candidatos

              Esse sistema eacute utilizado em escala nos Estados Unidos para a maior parte das eleiccedilotildeesvoltadas a eleger apenas um candidato como prefeitos e governadores aleacutem de ser usadana disputa presidencial Dentre outros paiacuteses que empregam o sistema em suas corridaspresidenciais estatildeo listados o Meacutexico as Filipinas a Coreia do Sul e a Venezuela

              211 Exemplo

              Tabela 1 ndash Exemplo FPTP

              Candidatos VotosA 36B 25C 22D 17

              Neste exemplo o candidato A possui uma pluralidade dos votos com 36 e ele eacute ocandidato eleito mesmo natildeo tendo uma maioria

              212 Vantagens e Desvantagens do FPTP

              A vantagem do FPTP eacute a sua simplicidade Natildeo eacute difiacutecil para um eleitor comumcompreender o seu funcionamento eles apenas precisam se decidir por um candidato Eletambeacutem eacute muito simples e direto na sua contagem e seleccedilatildeo do vencedor

              Esse meacutetodo tambeacutem tende a criar listas de candidatos concorrentes mais curtasCandidatos independentes ou de partidos menores frequentemente acabam se sentindodesencorajados a concorrer devido agraves suas baixas chances de vitoacuteria Isso normalmentefornece aos eleitores uma faacutecil decisatildeo entre um ou dois candidatos dos maiores partidosao mesmo tempo poreacutem limitando suas opccedilotildees

              No entanto sua essecircncia eacute sua principal desvantagem a pluralidade O fato do can-didato eleito natildeo necessitar de uma maioridade dos votos da populaccedilatildeo parece violaros princiacutepios baacutesicos da democracia Democracia eacute em sua origem o poder(kratos) nopovo(demos) poreacutem na pluralidade o poder de eleger um candidato pode residir emapenas uma fraccedilatildeo relativamente pequena do povo Em um cenaacuterio hipoteacutetico comapenas trecircs candidatos um deles apenas poderia necessitar de natildeo mais do que 34 dosvotos para ser eleito o que significa que no pior dos casos 66 da populaccedilatildeo rejeitao candidato eleito O cenaacuterio soacute piora com mais e mais candidatos concorrendo Paraquatro candidatos satildeo necessaacuterios 26 dos votos no pior dos casos para cinco satildeo 21 eassim por diante

              19

              213 Voto Uacutetil no FPTP

              No FPTP tambeacutem existe a possibilidade de os eleitores evitarem votar em sua prefe-recircncia verdadeira No caso de sua preferecircncia natildeo aparentar ter boas chances de vitoacuteriamuitas vezes opta-se por uma segunda opccedilatildeo que esteja mais bem colocada nas eleiccedilotildeesO motivo disso eacute que nessas situaccedilotildees votar em sua preferecircncia pode parecer um des-perdiacutecio do seu voto e no pior dos cenaacuterios optar por natildeo transferir seu voto para umasegunda opccedilatildeo pode acabar resultando na eleiccedilatildeo de um candidato de seu desgosto As-sim votar de maneira verdadeira muitas vezes pode acabar prejudicando o eleitor que sevecirc forccedilado a abandonar seus interesses poliacuteticos mais imediatos e escolher o menor entredois(ou mais) males Os candidatos de partidos menores satildeo os que mais sofrem com essetipo de voto estrateacutegico por natildeo conseguirem agregar as maiores quantidades de votos

              Entretanto ao mesmo tempo que partidos maiores roubam votos de partidos meno-res com os votos taacuteticos partidos menores tambeacutem tem a oportunidade de ganhar algunsvotos com o denominado spoiler effect Ao entrarem na eleiccedilatildeo candidatos de partidosmenores podem adquirir votos de candidatos mais populares que possuem inclinaccedilatildeo po-liacutetica semelhante Logo eacute possiacutevel que haja certo equiliacutebrio ao se contrapor as mudanccedilasde voto devido aos votos uacuteteis agraves mudanccedilas oriundas do spoiler effect

              Poreacutem o spoiler effect natildeo necessariamente ocorre apenas entre partidos maiores emenores mas pode prejudicar candidatos de popularidades proacuteximas Por exemplo entretrecircs candidatos A B e C onde A representa determinada posiccedilatildeo no espectro poliacuteticoenquanto B e C possuem posiccedilotildees parecidas o que pode acontecer eacute B e C se prejudicaremmutuamente jaacute que ambos dividem os eleitores de um mesmo espectro poliacutetico Se esseespectro tem a maioria com 60 por exemplo com B e C compartilhando cada um 30dos votos o candidato A sairia vencedor com 40 mesmo que todos os eleitores de Bprefiram C e todos os eleitores de C prefiram B Esse exemplo demonstra claramente oproblema com os sistemas de pluralidade

              22 TWO-ROUND SYSTEM

              Uma das primeiras tentativas de lidar com a desvantagem dos sistemas por pluralidadeo Two-round System eacute usado desde o seacuteculo XIX no ocidente e atualmente ainda eacute utilizadoem corridas presidecircncias de paiacuteses como o Brasil Bulgaacuteria Chile Colocircmbia FinlacircndiaPolocircnia Portugal Ruacutessia e em inuacutemeras eleiccedilotildees locais nos Estados Unidos

              O principal objetivo do TRS eacute garantir que o vencedor tenha conseguido uma maioriados votos Para isso as eleiccedilotildees satildeo estruturadas em duas rodadas de votaccedilatildeo Na primeirarodada os eleitores se dirigem agraves urnas e votam no candidato de sua preferecircncia Apoacutesa contagem se a quantidade de votos do candidato mais votado superar a proporccedilatildeo de50 natildeo haacute a necessidade de uma segunda rodada e este candidato eacute eleito No entantose este natildeo for o caso haveraacute uma segunda rodada com apenas os dois candidatos mais

              20

              votados Nesta rodada os eleitores retornam as urnas para escolher uma das duas opccedilotildeessendo eleito o candidato mais votado agora definitivamente com uma maioria dos votos

              221 Exemplo

              Utilizando a mesma distribuiccedilatildeo de votos descrita na tabela 1 Neste caso como ocandidato A natildeo possui uma maioria dos votos ele e o candidato B iratildeo concorrer em umsegundo turno Digamos que as distribuiccedilotildees dos votos dos eleitores dos candidatos C eD em relaccedilatildeo aos candidatos A e B satildeo as seguintes

              Tabela 2 ndash 2deg turno do TRS

              Candidatos Votos dos eleitoresde C

              Votos dos eleitoresde D

              Votos do 1degturno

              A 7 5 36B 15 12 25

              O candidato B agora eacute eleito com uma maioria dos votos 52 contra 48 do candidatoA

              222 Vantagens e Desvantagens do TRS

              Por ser parecido com o FPTP esse sistema tambeacutem eacute de faacutecil compreensatildeo do eleitorcomum poreacutem a maior vantagem do TRS eacute a garantia de que o candidato vencedor teraacute oapoio da maioria dos eleitores no segundo turno eliminando a pluralidade Argumenta-seque isso daacute maior legitimidade poliacutetica ao mandato do candidato eleito

              O TRS tende a abrigar uma lista maior de candidatos sendo mais convidativo acandidatos de partidos menores mesmo que suas chances natildeo sejam maiores quandocomparadas agraves eleiccedilotildees sob o FPTP Mesmo assim essa listagem mais abrangente eacute umavantagem do sistema pois daacute aos eleitores uma variedade maior de opccedilotildees de voto

              Em relaccedilatildeo agraves suas desvantagens o TRS possui duas principais A primeira satildeo oscustos elevados do sistema decorrentes da necessidade da organizaccedilatildeo de um segundoturno de votaccedilotildees A segunda eacute o aumento no iacutendice de ausecircncias dos eleitores agraves urnasEssa ampliaccedilatildeo no natildeo comparecimento dos eleitores se daacute tambeacutem devido ao segundoturno por pura fatiga eleitoral bem como consequecircncia da desistecircncia de eleitores queapoiam candidatos que jaacute foram eliminados

              Outro ponto negativo do TRS eacute a sua natildeo-monotonicidade Isso significa que umcandidato pode ser prejudicado com um aumento em sua popularidade e suporte e domesmo modo um candidato pode se beneficiar com a perda de popularidade e suporteSe os candidatos A e B satildeo os esperados para ir ao segundo turno onde A eacute mais fortedo que B um aumento no suporte pelo candidato A pode resultar na sua derrota quandoesse aumento causa uma alteraccedilatildeo nos candidatos que satildeo selecionados para ir ao segundoturno Se esse aumento na popularidade de A resultar na eliminaccedilatildeo preacutevia de B um

              21

              terceiro candidato C pode ser vitorioso sobre A no segundo turno caso os eleitores de Bprefiram C ao candidato A Se natildeo houvesse esse crescimento de popularidade A teriaderrotado B no segundo turno Essa situaccedilatildeo seraacute vista em melhores detalhes na seccedilatildeo 43

              223 Voto Uacutetil no TRS

              Esse sistema minimiza os efeitos do voto uacutetil em relaccedilatildeo ao FPTP pois um eleitorqualquer pode tranquilamente votar em sua preferecircncia sem se preocupar em desperdiccedilaacute-lo mesmo que seu candidato natildeo tenha chances de vitoacuteria Se este natildeo for eleito aindapoderaacute escolher a sua preferecircncia dentre os dois candidatos que prosseguirem para osegundo turno

              Apesar disso ainda existe um cenaacuterio em que o eleitor pode ser tentado a natildeo votar emsua preferecircncia Eacute possiacutevel que ele opte pela sua segunda opccedilatildeo se souber que sua primeiraopccedilatildeo possui miacutenimas chances de ir ao segundo turno ou ateacute mesmo por saber que issodiminuiraacute as chances de algum outro candidato ser eleito Mesmo assim eacute evidente queo TRS natildeo proporciona o mesmo apelo ao voto taacutetico que o FPTP

              Outra caracteriacutestica do TRS eacute o incentivo a formaccedilatildeo de coalizotildees entre candidatosde partidos mais populares com candidatos de partidos menos populares As coalizotildeesfornecem benefiacutecios agrave ambas as partes onde os candidatos classificados para o segundoturno em geral se juntam a candidatos jaacute eliminados com a intenccedilatildeo de agregar maisvotos enquanto os candidatos jaacute eliminados apoiam um dos dois classificados na esperanccedilade inserir propostas proacuteprias ou modificaccedilotildees agrave chapa deles

              23 INSTANT-RUNOFF VOTING

              Instant Runoff Voting foi uma alternativa aos meacutetodos FPTP e TRS desenvolvidanos anos 70 por um professor do Instituto de Tecnologia de Massachusetts(MIT) O IRVelimina as principais desvantagens desses outros dois sistemas a pluralidade do FPTP e anecessidade de mais de uma rodada de votaccedilatildeo do TRS Este meacutetodo tambeacutem opera emmais de uma rodada poreacutem como o proacuteprio nome sugere essas rodadas satildeo instantacircneasnatildeo sendo necessaacuterio o retorno dos eleitores agraves urnas Atualmente ele eacute utilizado naIrlanda nas eleiccedilotildees presidenciais em Londres na eleiccedilatildeo de seu prefeito e em distritosindividuais na Austraacutelia para eleger membros de sua cacircmara baixa do parlamento OIRV tambeacutem eacute usado por vaacuterias organizaccedilotildees privadas nos Estados Unidos incluindoa American Political Science Association e a American Psychological Association paraeleger seus funcionaacuterios

              Nesse sistema os eleitores natildeo satildeo solicitados a votar em um uacutenico candidato aoinveacutes disso eles listam todos os candidatos concorrentes na ordem de sua preferecircnciaA partir dessas listas as primeiras opccedilotildees de cada eleitor recebem o seu voto e apoacutes acontagem se um candidato obtiver 50 dos votos mais um este candidato eacute eleito Se

              22

              isso natildeo ocorrer o candidato menos votado eacute eliminado das eleiccedilotildees e seus votos satildeotransferidos para a segunda opccedilatildeo de cada um de seus eleitores Esse procedimento serepete eliminando o candidato menos votado a cada rodada ateacute que algum dos candidatospossuam a maioridade dos votos

              231 Exemplo

              Na tabela 3 pode-se verificar a distribuiccedilatildeo de votos por perfil de eleitor e na tabela4 vecirc-se o desenvolvimento do IRV para essas distribuiccedilotildees O candidato D eacute o menosvotado e por consequecircncia eacute o primeiro a ser eliminado A segunda opccedilatildeo de todos oseleitores que votaram no candidato D eacute o candidato C por isso este recebe todos os votosdistribuiacutedos na segunda rodada Com isso o candidato B eacute eliminado com 25 dos votos eos candidatos A e C concorrem na uacuteltima rodada Mesmo com o candidato C na lideranccedilana segunda rodada a maior parte dos eleitores do B tem como preferecircncia o candidatoA por isso A eacute eleito com 55 dos votos contra 45 do C

              Tabela 3 ndash Exemplo IRV

              Rankings Ndeg de eleitoresABCD 20ABDC 16BDAC 19BDCA 6CABD 7CDBA 15DCAB 5DCBA 12

              Tabela 4 ndash Desenvolvimento do IRVTurnos D C B A

              1 17 22 25 362 eliminado 39 25 363 eliminado 45 eliminado 55

              232 Vantagens e Desvantagens do IRV

              Assim como no TRS a pluralidade eacute irrelevante no IRV e um candidato soacute eacute eleitocom a maioridade dos votos dando maior legitimidade ao mandato deste No entantopode-se argumentar que o IRV faz isso com mais eficiecircncia pois natildeo requer a execuccedilatildeode mais de uma rodada de votaccedilotildees Isso diminui os custos das eleiccedilotildees como um todoao mesmo tempo que proporciona um nuacutemero menor de isenccedilotildees por parte dos eleitoresdevido ao desgaste de todo o processo eleitoral

              23

              Aleacutem disso candidatos de partidos menores tendem a receber mais votos do queno FPTP e portanto satildeo mais encorajados a se candidatar Com uma lista maior decandidatos eleitores desfrutam de uma variedade maior de opccedilotildees de voto Contudomesmo com mais candidatos menos populares o spoiler effect mencionado anteriormentetambeacutem natildeo possui espaccedilo nesse sistema de votaccedilatildeo Partidos menores natildeo tem comoroubar votos de partidos maiores visto que esses votos eventualmente seratildeo transferidosde volta a eles durante o desenvolvimento das rodadas do IRV

              Em virtude de sua estrutura acredita-se que esse meacutetodo tende a encorajar os can-didatos tambeacutem a elaborar suas campanhas de forma mais abrangente ampliando suainfluecircncia para mais do que apenas um grupo especiacutefico de maneira que ele consiga agre-gar votos de segunda ou terceira opccedilatildeo aleacutem dos votos de seus eleitores principais

              A principal desvantagem do IRV eacute o fato de ele ainda natildeo ser amplamente utilizado aoredor do mundo Essa falta de familiaridade do sistema pode causar confusatildeo ao eleitorcomum em suas primeiras ocorrecircncias No entanto nos paiacuteses em que este eacute utilizadonatildeo parece haver confusatildeo entre os eleitores Aleacutem disso na maioria dos casos haveraacute umcusto potencialmente alto da substituiccedilatildeo ou alteraccedilatildeo dos sistemas das urnas eletrocircnicaspara que seja possiacutevel haver a implementaccedilatildeo do meacutetodo

              Aleacutem disso assim como o TRS este sistema tambeacutem possui natildeo-monotonicidade ouseja um candidato pode ser prejudicado ao ser ranqueado mais alto enquanto que outropode se beneficiar sendo ranqueado mais baixo pelos eleitores (ORNSTEIN 2018) issopode ocorrer quando esse ranqueamento causa alteraccedilotildees na ordem em que os candidatossatildeo eliminados Essa caracteriacutestica se manifesta em fenocircmenos complexos e especiacuteficos epor isso um exemplo de sua ocorrecircncia seraacute abordada em detalhes na seccedilatildeo 43

              233 Voto Uacutetil no IRV

              Como os sistemas de votaccedilatildeo anteriores o IRV natildeo eacute completamente imune ao vototaacutetico No entanto este meacutetodo se mostra bem resistente a eles quando comparado aoutros meacutetodos como o FPTP e o Borda Count (Bartholdi John J III and Orlin JamesB 1990) Distintivamente o IRV requer um maior esforccedilo do eleitor para elaborar umaestrateacutegia que melhor ajuste os resultados da eleiccedilatildeo de acordo com a sua preferecircnciaAleacutem disso eacute necessaacuterio que ele tenha informaccedilatildeo suficiente sobre os rankings de outroseleitores naturalmente obtida atraveacutes de pesquisas eleitorais

              Existe tambeacutem a possibilidade de ocorrer uma exaustatildeo dos votos quando natildeo haacuteo completo preenchimento do ranking por parte dos eleitores Nessas ocasiotildees o votonatildeo pode continuar a ser transferido a outros candidatos e ele eacute descartado Isso afetaa legitimidade do mandato do candidato eleito pois o resultado final natildeo representaraacute100 da populaccedilatildeo votante Essas ocorrecircncias no entanto podem ser minimizadas comuma melhor educaccedilatildeo eleitoral ou como foi implementado na Austraacutelia requerer que osrankings incluam uma totalidade dos candidatos concorrentes

              24

              24 APPROVAL VOTING SYSTEM

              No meacutetodo Approval Voting os eleitores natildeo satildeo limitados pelo nuacutemero de candidatosem que podem votar por isso approval cada eleitor pode votar em todos os candidatos osquais ele aprova Apoacutes as votaccedilotildees o candidato com a maior quantidade de votos eacute eleitoSegundo Hamlin (2015) a cidade de Fargo na Dakota do Norte se tornou a primeiracidade nos EUA a colocar em praacutetica este sistema em suas eleiccedilotildees gerais em novembrode 2018 AVS tambeacutem eacute utilizado para eleger o secretaacuterio-geral das Naccedilotildees Unidas e emdiversas outras organizaccedilotildees

              241 Exemplo

              Na tabela 5 abaixo pode-se encontrar 8 perfis de eleitores com seus candidatos apro-vados e quantidade de eleitores que se encaixam no perfil Na tabela 6 temos o resultadoda contabilizaccedilatildeo dos votos destes perfis O candidato mais popular eacute o B que se encontraaprovado em 5 perfis distintos totalizando 60 votos ou aproximadamente 32

              Tabela 5 ndash Exemplo AVS

              Aprovaccedilotildees Ndeg de eleitoresA 20AB 16B 19

              BDC 6CAB 7CD 15DC 5DCB 12

              Tabela 6 ndash Resultado AVSCandidatos Total de votos

              A 43B 60C 45D 38

              242 Vantagens e Desvantagens do AVS

              Aleacutem de simples este meacutetodo permite um niacutevel maior de expressividade aos eleitoresOnde no FPTP e TRS eles satildeo limitados pelo seu uacutenico voto aqui os eleitores tecircm aliberdade de demonstrar exatamente quais candidatos consideram aptos ou aceitaacuteveis aocargo

              25

              Outro efeito dessa liberdade trazida pelo AVS eacute a dizimaccedilatildeo do spoiler effect Can-didatos de partidos menores natildeo tem como roubar votos de partidos maiores nessesistema ambos os candidatos contabilizariam o voto

              243 Voto Uacutetil no AVS

              O tipo de voto uacutetil no AVS eacute denominado bullet voting Segundo The Center forElection Science (2015) esta taacutetica envolve simplesmente ignorar a possibilidade de votarem mais de um candidato e votar apenas em sua primeira opccedilatildeo Um eleitor pode serlevado a adotar essa estrateacutegia quando percebe que sua preferecircncia pode ser prejudicadacom o voto em alguma segunda opccedilatildeo sua Em um cenaacuterio extremo onde 100 doseleitores adotam esta estrateacutegia as eleiccedilotildees satildeo convertidas a um simples First Past ThePost

              25 THE BORDA COUNT

              Este meacutetodo carrega o nome em homenagem a seu criador Jean-Charles de Bordaque o desenvolveu em 1770 (LIPPMAN 2012) A contagem de Borda utiliza a abordagemde ranqueamento dos candidatos poreacutem de maneira diferente ao IRV Este eacute um sistemaque atribui uma pontuaccedilatildeo aos candidatos com base nestes rankings O candidato na basedo ranking natildeo recebe pontos o candidato imediatamente acima deste recebe 1 pontoo proacuteximo recebe 2 pontos e assim por diante ateacute o topo do ranking As pontuaccedilotildees detodos os rankings satildeo contabilizadas e o candidato com maior pontuaccedilatildeo eacute eleito Deacordo com Lippman variaccedilotildees deste meacutetodo satildeo encontradas em uso na premiaccedilatildeo dediversos esportes como na seleccedilatildeo do MVP(Most Valuable Player) da MLB(principal ligade beisebol dos EUA) e no Trofeacuteu Heisman de futebol americano universitaacuterio

              251 Exemplo

              Neste exemplo seratildeo aproveitados os mesmos rankings apresentados na tabela 3 Porserem 4 candidatos o primeiro colocado de cada ranking receberaacute 3 pontos o segundo 2pontos o terceiro 1 e o quarto 0 Assim o nuacutemero maacuteximo de pontos que um candidatopode atingir eacute igual a 300(se ficar na primeira posiccedilatildeo em todos os rankings) e o nuacutemerototal de pontos no sistema eacute 600 O nuacutemero maacuteximo de pontos que um candidato podeatingir eacute calculado com

              (cminus 1)times e

              Sendo c igual ao nuacutemero de candidatos e e o nuacutemero de eleitores Por sua vez onuacutemero total de pontos no sistema eacute

              26

              (cminus 1)times c2

              times e

              A contagem final dos pontos eacute apresentada na tabela 7 abaixo

              Tabela 7 ndash Resultado BCCandidatos Total de pontos

              A 146B 181C 126D 147

              O candidato eleito eacute o B com 181 pontos ou aproximadamente 60 da pontuaccedilatildeomaacutexima

              252 Vantagens e Desvantagens do BC

              Em comparaccedilatildeo com os meacutetodos abordados anteriormente que apenas consideramas primeiras opccedilotildees de cada eleitor este meacutetodo regularmente escolhe candidatos comaceitaccedilatildeo mais ampla ao inveacutes de uma preferecircncia direta dos eleitores (Electoral ReformSociety 2017b)

              Ele tambeacutem encoraja uma abordagem estrateacutegica por parte dos partidos onde seriade seu interesse nomear mais de um candidato para concorrer pois quanto mais candi-datos estatildeo no paacutereo maior eacute a pontuaccedilatildeo dos primeiros colocados Logo a nomeaccedilatildeo decandidatos menos populares pode beneficiar os principais candidatos de um partido

              253 Voto Uacutetil no BC

              Existem duas estrateacutegias aplicaacuteveis a esse sistema A primeira denominada compromi-sing de maneira similar a outros meacutetodos de votaccedilatildeo se resume em ranquear em primeirolugar um dos candidatos que estejam liderando as eleiccedilotildees mesmo que este natildeo seja suapreferecircncia real A segunda estrateacutegia burying eacute o oposto esta se baseia em ranquearem uacuteltimo lugar um dos candidatos liacutederes mesmo que este natildeo seja o seu candidato demaior desgosto Ambas estrateacutegias podem ser aplicadas ao mesmo tempo por um eleitor

              26 SCORE VOTING SYSTEM

              Score Voting ou Range Voting como tambeacutem eacute conhecido eacute mais um meacutetodo quetenta trazer maior liberdade de expressatildeo aos eleitores Assim como o Borda Counteste sistema funciona baseado na pontuaccedilatildeo dos candidatos no entanto ao inveacutes dessapontuaccedilatildeo ser relativa agrave posiccedilatildeo do candidato no ranking de cada eleitor este por sua veztem completa liberdade de atribuir qualquer quantidade de pontos aos candidatos dentro

              27

              de determinada escala Um eleitor pode dar o mesmo nuacutemero de pontos para diferentescandidatos e apoacutes o somatoacuterio de todas as pontuaccedilotildees o candidato com a pontuaccedilatildeo maisalta eacute eleito Incorporado ao escopo poliacutetico o SVS eacute utilizado no Partido Pirata Alematildeobem como em diversas organizaccedilotildees tais como o Fedora Project e Mozilla e tambeacutem emvariados esportes oliacutempicos e reality shows como o American Idol aponta Hamlin (2015)

              261 Exemplo

              Neste exemplo temos apresentados na tabela 8 abaixo 4 perfis distintos de eleitorese suas respectivas atribuiccedilotildees de pontos aos 4 candidatos Cada eleitor pode atribuirqualquer pontuaccedilatildeo a um candidato dentro da escala de -10 a 10 O resultado da eleiccedilatildeoapoacutes a soma de todos os pontos por candidato se encontra na tabela 9 onde o candidatoA eacute eleito com um total de 605 pontos

              Tabela 8 ndash Exemplo SVS

              Perfil A B C D Ndeg de eleitores1 10 -1 5 2 362 6 9 -3 4 253 2 0 8 4 224 3 3 3 10 17

              Tabela 9 ndash Resultado SVSCandidatos Total de pontos

              A 605B 240C 332D 430

              262 Vantagens e Desvantagens do SVS

              A grande vantagem do SVS eacute como ele proporciona aos eleitores expressar de maneiramuito proacutexima potencialmente exata suas impressotildees poliacuteticas de cada candidato Eleeacute ainda mais expressivo que o AVS Dessa maneira o spoiler effect tambeacutem se torna nuloao passo que toda intenccedilatildeo de voto eacute precisamente representada neste sistema

              Assim como outros meacutetodos eleitorais este sofre igualmente dos males produzidos pelovoto taacutetico Sua principal desvantagem eacute discutida na seccedilatildeo abaixo

              263 Voto Uacutetil no SVS

              Da mesma maneira que no Approval Voting atraveacutes do bullet voting o SVS tambeacutempode ser convertido em uma eleiccedilatildeo sob o meacutetodo FPTP em um cenaacuterio com um grande

              28

              volume de eleitores maliciosos O voto uacutetil sob este sistema se manifesta pontuando-seapenas um candidato com uma nota positiva e todos os outros com as notas mais baixasda escala Se todos os eleitores se aproveitarem dessa abordagem natildeo existiraacute distinccedilatildeoefetiva entre uma eleiccedilatildeo sob SVS e FPTP Essencialmente cada eleitor estaacute votando emapenas um candidato Essa eacute a principal desvantagem do SVS e ela consegue eliminarsua principal vantagem dar ao eleitor um poder maior de expressatildeo

              27 BLOC VOTE

              O Bloc Vote eacute um meacutetodo utilizado para a eleiccedilatildeo de candidatos a cargos no governocom mais de uma vacacircncia Pode ser considerado um meio-termo entre o FPTP e oAVS pois os eleitores podem votar em mais de um candidato poreacutem satildeo limitados pelonuacutemero de vagas Em uma eleiccedilatildeo com duas vagas por exemplo cada eleitor selecionaraacutedois candidatos ou menos Sensatamente o candidato mais votado eacute eleito Ele possuialgumas utilizaccedilotildees em eleiccedilotildees locais em algumas partes da Inglaterra (Electoral ReformSociety 2017a)

              271 Exemplo

              Neste exemplo dois candidatos seratildeo eleitos logo cada eleitor votaraacute em no maacuteximodois candidatos A distribuiccedilatildeo de votos pode ser conferida na tabela 10 e o resultado dacontagem de votos na tabela 11 abaixo Os candidatos eleitos satildeo o C totalizando 78do maacuteximo de votos possiacuteveis para um candidato e o A com 43

              Tabela 10 ndash Exemplo BV

              Aprovaccedilotildees Ndeg de eleitoresAC 20AB 16BC 19BD 6CA 7CD 15DC 17

              Tabela 11 ndash Resultado BVCandidatos Total de votos

              A 43B 41C 78D 38

              29

              272 Voto Uacutetil no BV

              Neste sistema eacute possiacutevel que um eleitor evite votar em sua primeira opccedilatildeo quandoeste natildeo tem chances de vitoacuteria e se fazendo isto ele diminuiraacute as chances de algum outrocandidato de seu desgosto ganhar Poreacutem o sistema previne um outro tipo de voto uacutetilEm eleiccedilotildees com mais de uma vaga onde os eleitores soacute podem votar em um candidatose um eleitor sabe que sua primeira opccedilatildeo tambeacutem eacute a primeira opccedilatildeo da maior parteda populaccedilatildeo e portanto muito provavelmente seraacute um dos candidatos eleitos eacute possiacutevelque ele arrisque votar em uma segunda opccedilatildeo sua na esperanccedila de a longo prazo elegersuas duas principais opccedilotildees de voto Com os eleitores podendo votar no nuacutemero exato devagas disponiacuteveis esse tipo de pensamento taacutetico perde o sentido

              30

              3 O SIMULADOR

              Para este trabalho foi implementado um simulador eleitoral na forma de uma aplicaccedilatildeoweb para que a interaccedilatildeo do usuaacuterio fosse facilitada Veremos a seguir como se daacute suautilizaccedilatildeo de forma geral

              Figura 2 ndash Captura de tela 1

              Figura 3 ndash Captura de tela 2

              A primeira opccedilatildeo encontrada pelo usuaacuterio eacute a escolha de quais sistemas de votaccedilatildeo se-ratildeo simulados (Figura 2) Todos eles podem ser selecionados para rodar simultaneamentePoreacutem natildeo eacute permitido rodar uma simulaccedilatildeo do Bloc Vote para uma eleiccedilatildeo onde apenasum candidato eacute eleito aleacutem disso natildeo existe implementaccedilatildeo dos meacutetodos TRS e IRV para

              31

              eleiccedilotildees com mais de um candidato eleito jaacute que eles se comportariam exatamente comono FPTP

              A maioria das linguagens de programaccedilatildeo senatildeo todas possuem um gerador de nuacuteme-ros pseudoaleatoacuterios que fornece a possibilidade de definir uma seed para o gerador Estaseed funciona como um ponto de partida para a geraccedilatildeo dos nuacutemero e portanto todasimulaccedilatildeo que rodar com a mesma seed sempre teraacute os mesmos resultados Se nenhumvalor for fornecido pelo usuaacuterio o tempo atual do sistema eacute utilizado As opccedilotildees subse-quentes satildeo a escolha do nuacutemero de eleitores gerados e o nuacutemero de vagas (Figura 3) Senenhum valor for fornecido o nuacutemero de eleitores padratildeo utilizado eacute 1000 e o nuacutemero devagas igual a 1

              Figura 4 ndash Captura de tela 3

              Este simulador possui dois modos para a criaccedilatildeo dos rankings dos eleitores No modoManipulate (Figura 4) primeiramente se define o nuacutemero de candidatos atraveacutes do campode entrada ao lado do tiacutetulo Candidates ou alternativamente pode-se adicionar candida-tos um a um atraveacutes do sinal de mais na parte inferior da paacutegina Para cada candidatoeacute possiacutevel definir a porcentagem de seus eleitores que optaraacute pelo voto taacutetico e pelovoto de minoria Tambeacutem eacute possiacutevel alterar o nome dos candidatos se for do interessedo usuaacuterio

              32

              Figura 5 ndash Captura de tela 4

              Figura 6 ndash Captura de tela 5

              33

              Figura 7 ndash Captura de tela 6

              Apoacutes a criaccedilatildeo dos candidatos o usuaacuterio pode criar perfis de eleitores que definiratildeo demaneira exata como partes da populaccedilatildeo iraacute votar (Figura 5) Em cada perfil se defineo valor em porcentos da populaccedilatildeo votante que o adotaraacute e a nota de cada candidatoTambeacutem eacute possiacutevel nomear cada perfil livremente

              No modo Generate (Figura 6) eacute onde o gerador de nuacutemeros pseudoaleatoacuterios eacute usadoNesse modo ao inveacutes do usuaacuterio criar perfis de eleitores ele define qual seraacute a distribuiccedilatildeoadotada para a geraccedilatildeo de notas de cada candidato Essas distribuiccedilotildees seratildeo mais bemdetalhadas no Capiacutetulo 5 Da mesma maneira que no modo Manipulate nesse modotambeacutem eacute possiacutevel definir os valores para os dois tipos de voto uacutetil os votos taacuteticos eos votos de minoria No primeiro estatildeo incluiacutedas as estrateacutegias de mudanccedila de votoespeciacuteficas de cada sistema como o bullet voting no AVS e SVS ou quando a preferecircnciade um eleitor claramente natildeo possui chances de vitoacuteria e ele muda seu voto para um doscandidatos que esteja na lideranccedila o que ocorre no FPTP e TRS O voto de minoriase apresenta apenas no FPTP em eleiccedilotildees onde mais de um candidato eacute eleito Se apreferecircncia de um eleitor claramente lidera a eleiccedilatildeo por ser tambeacutem a preferecircncia damaior parte da populaccedilatildeo esse eleitor pode mudar o seu voto para uma segunda opccedilatildeona esperanccedila de eleger dois de seus candidatos favoritos

              Por fim em ambos os modos o usuaacuterio tem a opccedilatildeo de definir coalizotildees entre oscandidatos se o sistema TRS estiver habilitado pois as coalizotildees apenas se manifestamnesse sistema Essas coalizotildees alteraratildeo as notas dos candidatos dependendo dos outroscandidatos pertencentes a elas (Figura 7)

              A aplicaccedilatildeo pode ser encontrada na paacutegina httpelectionsimpythonanywherecom

              34

              4 CENAacuteRIOS PERTINENTES

              Para todos os cenaacuterios deste capiacutetulo seraacute usada a seed do simulador igual a 100 e apopulaccedilatildeo de eleitores igual a 1000 para que exista consistecircncia na anaacutelise e tambeacutem paraque possa haver replicaccedilatildeo dos resultados se necessaacuterio

              41 CENAacuteRIO 1 VOTO TAacuteTICO

              Neste exemplo teremos quatro candidatos Ana Beto Carla e Diego Ana e Betoseratildeo gerados a partir da distribuiccedilatildeo Neutral (Figura 47) Carla da distribuiccedilatildeo Disliked(Figura 51) e Diego da Hated (Figura 55) Para a simulaccedilatildeo com a seed 100 o melhorcandidato a ser eleito ou seja aquele que maximiza a meacutedia das notas dos eleitores eacute oBeto com uma meacutedia de 0073 Para cada sistema seratildeo comparados os resultados semvoto taacutetico aos com 20 de voto taacutetico a favor da Ana Abaixo se encontram osresultados para o sistema FPTP

              Figura 8 ndash FPTP - Cenaacuterio 1 sem voto taacutetico

              Figura 9 ndash TRS segundo turno - Cenaacuterio 1 sem voto taacutetico

              35

              Figura 10 ndash IRV primeiro turno - Cenaacuterio 1

              Figura 11 ndash IRV segundo turno - Cenaacuterio 1

              Figura 12 ndash IRV terceiro turno - Cenaacuterio 1

              36

              Figura 13 ndash AVS - Cenaacuterio 1 sem voto taacutetico

              Figura 14 ndash BC - Cenaacuterio 1 sem voto taacutetico

              Figura 15 ndash SVS - Cenaacuterio 1 sem voto taacutetico

              37

              Nesse cenaacuterio sem voto taacutetico o uacutenico sistema que natildeo elege o Beto eacute o AVS Todosos outros elegem o melhor candidato Ou seja apesar de Beto ter uma melhor meacutediadas notas dos eleitores existem mais eleitores que ranqueiam Ana com uma nota acimade 0 No entanto apenas 20 dos eleitores de Diego e Carla que preferem a Ana aoinveacutes do Beto satildeo o suficiente para fazer Beto natildeo ser eleito se eles decidirem abandonarsua primeira opccedilatildeo e votar na Ana Considerando a vantagem que os votos taacuteticosproporcionam agrave Ana esta eacute eleita em todos os sistemas menos o TRS e o IRV

              Figura 16 ndash FPTP - Cenaacuterio 1 - 20 de voto taacutetico na Ana

              Figura 17 ndash TRS segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

              38

              Figura 18 ndash IRV primeiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

              Figura 19 ndash IRV segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

              Figura 20 ndash IRV terceiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

              39

              Figura 21 ndash AVS - Cenaacuterio 1 20 de voto taacutetico na Ana

              Figura 22 ndash BC - Cenaacuterio 1 20 de voto taacutetico na Ana

              Figura 23 ndash SVS - Cenaacuterio 1 20 de voto taacutetico na Ana

              40

              Eacute claro que se os eleitores que preferem o Beto tambeacutem votassem de maneira estra-teacutegica a situaccedilatildeo se equilibraria e haveria o mesmo niacutevel de concorrecircncia entre os doiscandidatos que ocorre quando natildeo haacute voto taacutetico Poreacutem no Borda Count esse equiliacute-brio pode natildeo acontecer e as estrateacutegias de compromising e burying podem acabar saindopela culatra se uma porcentagem elevada dos eleitores as adotarem Abaixo encontram-seos resultados para esse sistema quando 100 dos eleitores de Carla e Diego se comportammaliciosamente

              Figura 24 ndash BC - Cenaacuterio 1 100 de voto taacutetico na Ana e Beto

              Por causa do uso demasiado da estrateacutegia burying Ana e Beto perdem muitos pontose isso abre espaccedilo para uma vitoacuteria da Carla No entanto para porcentagens menores que100 o Beto ainda eacute o vencedor

              Essas duas estrateacutegias tambeacutem foram implementadas nesse simulador para o sistemaIRV e eacute possiacutevel ver como ele eacute resistente a elas Para que seja possiacutevel mudar os resultadosde uma eleiccedilatildeo sob o IRV eacute necessaacuterio mudar a ordem de eliminaccedilatildeo dos candidatos paraque o seu candidato preferido acabe enfrentando um candidato mais fraco nas rodadasfinais Isso natildeo ocorre com compromising e burying No proacuteximo cenaacuterio seraacute analisadacomo eacute possiacutevel modificar os resultados de uma eleiccedilatildeo sob o IRV

              Esses resultados podem ser replicados acessando os linksSem votos taacuteticos lthttpelectionsimpythonanywherecomdirect_res1111110

              --[0021][22Ana2222Beto222022Carla2222Diego22]------100gt

              Com 20 de voto taacutetico lthttpelectionsimpythonanywherecomdirect_res1111110--[0021][22Ana222022Beto2222Carla2222Diego22]1-[02000]---100gt

              Com 100 de voto taacuteticona Ana e Beto lthttpelectionsimpythonanywherecomdirect_res0000100--[0021][22Ana222022Beto222022Carla2222Diego22]1-[101000]---100gt

              41

              42 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV

              Neste cenaacuterio teremos Ana Carla e Beto concorrendo e trecircs perfis distintos que apoiamcada candidato As distribuiccedilotildees de notas dos perfis se encontram na tabela abaixo

              Tabela 12 ndash Distribuiccedilatildeo de notas - Cenaacuterio 2

              Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

              deeleitores

              1 10 5 0 422 0 10 5 303 5 0 10 28

              Com essas distribuiccedilotildees Carla eacute eliminada na primeira rodada e seus 28 de votossatildeo transferidos para a segunda opccedilatildeo de seus eleitores Ana que eacute eleita com 70 dosvotos e uma meacutedia de 56

              Figura 25 ndash IRV primeiro turno - Cenaacuterio 2

              Figura 26 ndash IRV segundo turno - Cenaacuterio 2

              42

              Cientes desse provaacutevel futuro cenaacuterio onde Ana eacute eleita uma pequena parte dos elei-tores de Beto estrategicamente o abandona e decide apoiar Carla na esperanccedila de leva-laao segundo turno contra Ana As novas distribuiccedilotildees de notas se encontram na tabelaabaixo com essa porccedilatildeo de eleitores representada pelo perfil 4

              Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2

              Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

              deeleitores

              1 10 5 0 422 0 10 5 283 5 0 10 284 0 8 10 2

              Essa mudanccedila estrateacutegica de voto altera a ordem de eliminaccedilotildees do sistema com Betosendo o primeiro a ser eliminado Com isso seus votos satildeo naturalmente transferidos paraCarla que derrota Ana no segundo turno com 58 dos votos

              Figura 27 ndash IRV primeiro turno com voto taacutetico - Cenaacuterio 2

              Figura 28 ndash IRV segundo turno com voto taacutetico - Cenaacuterio 2

              43

              Percebendo que a eleiccedilatildeo de Beto natildeo era provaacutevel seus eleitores conseguiram aomenos impedir a eleiccedilatildeo do pior candidato para eles Mas para isso foi necessaacuterio queeles tivessem a informaccedilatildeo de como os outros eleitores votariam Uma aproximaccedilatildeo dessasinformaccedilotildees poderia ser obtida em um cenaacuterio real com poucos candidatos atraveacutes depesquisas eleitorais poreacutem se o nuacutemero de candidatos eacute significativo uma noccedilatildeo completadas distribuiccedilotildees dos rankings dos eleitores se torna muito menos viaacutevel e dificulta aformulaccedilatildeo de estrateacutegias para alterar a ordem em que os candidatos satildeo eliminados

              Esses resultados podem ser replicados acessando os linksSem voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana22

              22Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

              Com voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana

              2222Beto2222Carla22]-----42Voter20Profile2001020520028Voter20Profile2010201020528Voter20Profile202520020102Voter20Profile20302082010100gt

              43 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE

              O interessante dos sistemas IRV e TRS eacute que os resultados do cenaacuterio anterior po-deriam ter sido obtidos ao inveacutes do voto taacutetico pela sua natildeo-monotonicidade Seriapossiacutevel que a Carla derrotasse a Ana no segundo turno atraveacutes do proacuteprio aumento depopularidade da Ana Assumindo que essa popularizaccedilatildeo ocorresse entre os candidatosdo perfil 2 onde 3 passasse a apoiar a Ana ao inveacutes do Beto as novas distribuiccedilotildeesseguiriam a tabela abaixo

              Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

              Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

              deeleitores

              1 10 5 0 452 0 10 5 273 5 0 10 28

              Dessa maneira Beto agora com uma porcentagem dos eleitores menor do que a deCarla seraacute eliminado na primeira rodada e como seus eleitores tecircm a Carla como segundaopccedilatildeo ela receberaacute todos os seus votos e seraacute eleita na segunda rodada As rodadas doIRV podem ser vistas nas figuras 29 e 30

              44

              Figura 29 ndash IRV primeiro turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

              Figura 30 ndash IRV segundo turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

              Tabela 15 ndash Resultados do Cenaacuterio 3Candidato

              eleitoMeacutedia das

              notasAntes da

              popularizaccedilatildeode Ana

              Ana 56

              Apoacutespopularizaccedilatildeo

              de AnaCarla 415

              Os efeitos dessa caracteriacutestica se refletem na satisfaccedilatildeo meacutedia da populaccedilatildeo A Ana eacuteclaramente a melhor candidata e mesmo com o seu ganho de popularidade (ou devido aele) a Carla eacute eleita

              Esses resultados podem ser replicados acessando os linksAntes da popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecom

              direct_res0010000---[22Ana2222Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

              45

              Apoacutes popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana2222Beto2222Carla22]-----45Voter20Profile2001020520027Voter20Profile2010201020528Voter20Profile20252002010100gt

              44 CENAacuteRIO 4 COALIZOtildeES

              O TRS por ser organizado em dois turnos separados normalmente a semanas dedistacircncia um do outro acaba abrindo brecha agrave mudanccedila de opiniatildeo por parte dos eleitorese o desenvolvimento de novas estrateacutegias por parte dos candidatos tais como a coalizatildeocom candidatos jaacute eliminados Com isso em mente nesse cenaacuterio teremos novamenteos quatro candidatos Ana Beto Carla e Diego Os trecircs primeiros seratildeo gerados dadistribuiccedilatildeo Neutral e Diego da distribuiccedilatildeo Disliked

              Figura 31 ndash TRS turno 1 - Cenaacuterio 4

              No TRS normal Ana Beto e Carla possuem com essas distribuiccedilotildees quantidades devotos muito proacuteximas com Beto e Carla indo para o segundo turno Carla estaacute 10 votosatraacutes de Beto e decide aproveitar o espaccedilo de tempo entre os dois turnos para tentaragregar mais votos Com isso Carla se aproxima de Diego e juntos formam uma coalizatildeoNo entanto com sua baixa popularidade Diego acaba ferindo a reputaccedilatildeo de Carla etorna o segundo turno muito mais faacutecil para Beto (Figura 33) Se Carla tivesse buscado osuporte de Ana por outro lado ela se veria vitoriosa no segundo turno e com uma amplavantagem sobre o Beto (Figura 34) Ou ateacute mesmo sem buscar uma coalizatildeo mesmosendo uma corrida apertada Carla teria naturalmente sido eleita (Figura 32)

              Esses resultados podem ser replicados acessando os linksSem coalizotildees lthttpelectionsimpythonanywherecomdirect_res0100000

              --[0002][22Ana222022Beto2222Carla2222Diego22]------100gt

              46

              Figura 32 ndash TRS turno 2 - Cenaacuterio 4

              Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4

              Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4

              47

              Coalizatildeo Carla e Diego lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2203Carla20Diego-100gt

              Coalizatildeo Carla e Ana lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2200Carla20Ana-100gt

              45 CENAacuteRIO 5 DILEMA DO PRISIONEIRO

              Neste cenaacuterio temos uma eleiccedilatildeo de uma vaga com trecircs candidatos concorrentes e trecircsperfis distintos de eleitores que seguiratildeo as seguintes distribuiccedilotildees

              Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5

              Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

              deeleitores

              1 10 -10 5 362 -10 10 5 343 -10 -10 5 30

              Esse contexto nos remete ao notaacutevel dilema do prisioneiro Nele dois prisioneiroscuacutemplices satildeo interrogados individualmente sem poder se comunicar um com o outro ecada um enfrenta o dilema de delatar ou natildeo o seu parceiro Se os dois prisioneirosdecidem se manter calados sobre o crime ambos satildeo sentenciados a um ano de prisatildeo Seapenas um deles dedurar o outro o traidor sai livre enquanto seu parceiro eacute condenadoa trecircs anos Se ambos dedurarem um ao outro eles satildeo condenados juntos a dois anosde prisatildeo Esse dilema eacute uma ideia claacutessica presente no estudo da teoria dos jogos sendooriginalmente elaborada por Merrill Flood e Melvin Dresher em 1950 e mais tarde sendonomeada de dilema dos prisioneiros por Albert W Tucker (POUNDSTONE 1992)

              O que esse dilema nos mostra eacute a tentaccedilatildeo que o indiviacuteduo deteacutem se sua racionalizaccedilatildeoestiver voltada para seus proacuteprios interesses e somente eles em oposiccedilatildeo a pensar no bemdo grupo como um todo Neste cenaacuterio encontramos dois grupos de eleitores expressiva-mente opostos os perfis 1 e 2 Se qualquer uma das preferecircncias desses perfis fosse eleitaisso significaria uma alta rejeiccedilatildeo de maior parte da populaccedilatildeo No entanto eles possuema segunda opccedilatildeo em comum a Carla que por sua vez eacute a preferecircncia do terceiro perfilPortanto a eleiccedilatildeo da Carla seria logicamente o resultado oacutetimo

              Mesmo assim a Ana eacute eleita nos dois sistemas acima o que natildeo parece justo poispela tabela 16 eacute evidente que apenas 36 da populaccedilatildeo a aprova enquanto que os outros64 a reprovam ao maacuteximo O sistema IRV se comporta de maneira idecircntica ao TRS

              48

              Figura 35 ndash FPTP - Cenaacuterio 5

              Figura 36 ndash TRS segundo turno - Cenaacuterio 5

              nesta situaccedilatildeo Com esse resultado a meacutedia das notas eacute -28 No entanto os trecircs sistemasseguintes nos apresentam resultados diferentes

              Tabela 17 ndash Resultados do Cenaacuterio 5

              Sistema Candidatoeleito

              Meacutedia dasnotas

              FPTP Ana -28TRS Ana -28IRV Ana -28AVS Carla 50BC Carla 50SVS Carla 50

              49

              Figura 37 ndash AVS - Cenaacuterio 5

              Figura 38 ndash BC - Cenaacuterio 5

              Tanto o AVS quanto o Borda Count e o SVS satildeo sistemas que consideram todasas opiniotildees de cada eleitor ao mesmo tempo e por isso satildeo capazes de eleger o melhorcandidato nesta situaccedilatildeo diferentemente do TRS que natildeo absorve completamente todosentimento do eleitor por todos os candidatos e o IRV que apesar de ser bem expressivoquebra esse processo em inuacutemeras rodadas o que permite a perda de informaccedilatildeo ao longodelas

              Esses resultados podem ser replicados acessando o linklthttpelectionsimpythonanywherecomdirect_res1111110---[22Ana

              222022Beto222022Carla22]-----36Voter20Profile2001020-1020534Voter20Profile201-10201020530Voter20Profile202-1020-10205100gt

              50

              Figura 39 ndash SVS - Cenaacuterio 5

              46 CENAacuteRIO 6 VOTO DE MINORIA

              Neste cenaacuterio temos uma eleiccedilatildeo com quatro candidatos e duas vagas A Ana seraacutea preferecircncia de uma extensa parte da populaccedilatildeo (distribuiccedilatildeo Loved Figura 53) Betoe Carla seratildeo candidatos razoavelmente populares (distribuiccedilatildeo Neutral Figura 47) eDiego seraacute a preferecircncia de apenas um pequeno grupo especiacutefico e rejeitado pela maioria(distribuiccedilatildeo Disliked Figura 51) Eacute intuitivo esperar que os dois candidatos eleitos seratildeoa Ana e ou o Beto ou a Carla e isso eacute exatamente o que ocorre na figura 40 no sistemaFPTP sem voto de minoria

              Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria

              Eacute evidente a discrepacircncia da quantidade de votos da Ana para os outros candidatose apesar de Beto e Carla serem mais populares que Diego os trecircs natildeo se encontrammuito afastados Poreacutem se a pequena fraccedilatildeo de candidatos que possuem a Ana como

              51

              Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego

              preferecircncia e Diego como segunda opccedilatildeo optarem pelo voto de minoria a situaccedilatildeo mudacompletamente (Figura 41) Assim apesar de extensamente rejeitado Diego conquistaa segunda vaga e a meacutedia das notas despenca de 2929 para 0505 No entanto aindaexiste um cenaacuterio pior Se os outros grupos de eleitores pensarem da mesma forma eevitarem votar na Ana achando que sua eleiccedilatildeo jaacute estaacute assegurada apenas 80 de votode minoria para esses grupos jaacute eacute o suficiente para eliminaacute-la das eleiccedilotildees (Figura 42)Com a Ana eliminada a meacutedia das notas cai ainda mais para 0058

              Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego

              O sistema Bloc Vote eacute uma das soluccedilotildees para o voto de minoria Permitindo queos eleitores votem no mesmo nuacutemero de candidatos que de vagas a serem preenchidasnatildeo existe o iacutempeto a esse tipo de voto estrateacutegico O resultado desse sistema portantoretorna a meacutedia das notas a casa dos 29 (Figura 43) Os sistemas AVS Borda Count eSVS tambeacutem impedem a presenccedila do voto de minoria e atingem resultados semelhantes

              52

              Figura 43 ndash BV - Cenaacuterio 6

              Tabela 18 ndash Resultados do Cenaacuterio 6

              Sistema Candidatoseleitos

              Meacutedia dasnotas

              FPTP sem voto de minoriaAna eBeto 2929

              FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

              FPTP com 80 de voto de minoriaBeto eCarla 0058

              Bloc VoteAna eCarla 2913

              Esses resultados podem ser replicados acessando os links

              Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

              100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

              80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

              53

              5 COMO FUNCIONA O SIMULADOR

              O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

              51 CLASSE ELECTIONS

              Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

              bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

              Figura 44 ndash estrutura candidates

              bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

              bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

              Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

              Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

              54

              Figura 45 ndash estrutura voters

              Figura 46 ndash estrutura votes

              daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

              Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

              55

              Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

              Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

              na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

              56

              Figura 49 ndash PDF - Distribuiccedilatildeo Liked

              Figura 50 ndash CDF - Distribuiccedilatildeo Liked

              (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

              Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

              57

              Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

              Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

              candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

              Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

              58

              Figura 53 ndash PDF - Distribuiccedilatildeo Loved

              Figura 54 ndash CDF - Distribuiccedilatildeo Loved

              funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

              59

              Figura 55 ndash PDF - Distribuiccedilatildeo Hated

              Figura 56 ndash CDF - Distribuiccedilatildeo Hated

              Meacutedia das Notas sumei

              sumvj nij

              etimes v

              Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

              Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

              60

              Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

              Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

              52 CLASSE FIRSTPASTTHEPOST

              Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

              Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

              61

              Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

              Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

              mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

              62

              53 CLASSE TWOROUNDSYSTEM

              A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

              54 CLASSE INSTANTRUNOFFVOTING

              A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

              Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

              63

              cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

              55 CLASSE APPROVALVOTING

              Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

              56 CLASSE BORDACOUNT

              Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

              57 CLASSE SCOREVOTING

              De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

              64

              58 CLASSE BLOCVOTE

              O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

              59 TECNOLOGIAS UTILIZADAS

              A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

              Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

              O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

              Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

              65

              6 CONCLUSAtildeO

              Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

              Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

              Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

              Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

              Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

              66

              REFEREcircNCIAS

              AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

              Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

              Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

              Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

              HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

              LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

              ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

              Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

              POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

              The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

              67

              APEcircNDICES

              APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

              Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

              if(not len(selfvoter_profiles))

              for voter in range(selfN_VOTERS)

              candidates_rank = dict()

              for candidate in reversed(range(selfN_CANDIDATES))

              if(selfBIAS_VECTOR[candidate]==4)

              candidates_rank[candidate] = self_sortear(selfloved)

              elif(selfBIAS_VECTOR[candidate]==3)

              candidates_rank[candidate] = self_sortear(selfliked)

              elif(selfBIAS_VECTOR[candidate]==2)

              candidates_rank[candidate] = self_sortear(selfdisliked)

              elif(selfBIAS_VECTOR[candidate]==1)

              candidates_rank[candidate] = self_sortear(selfhated)

              elif(selfBIAS_VECTOR[candidate]==-1)

              candidates_rank[candidate] = self_sortear(selfpolarizer

              )

              elif(selfBIAS_VECTOR[candidate]==-2)

              candidates_rank[candidate] = self_sortear(self

              more_polarizer)

              else

              candidates_rank[candidate] = self_sortear(selfneutral)

              selfvotersappend(candidates_rank)

              else

              ranges = []

              ranks = []

              for prof in selfvoter_profiles

              rangesappend(int(prof[pop_percentage]))

              rank =

              for index score in enumerate(prof[scores])

              rank[index] = score

              ranksappend(rank)

              for index _range in enumerate(ranges)

              for _ in range(int(selfN_VOTERS(_range100)))

              selfvotersappend(ranks[index])

              68

              APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

              Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

              for i in range(selfN_CANDIDATES)

              selfcandidates[i] = 0

              selfvotes[i] = set()

              APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

              Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

              for candidate in range(selfN_CANDIDATES)

              rating_sum = 0

              for voter in selfvoters

              rating_sum += voter[candidate]

              selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

              APEcircNDICE D ndash MEacuteTODO GET_MEAN

              Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

              if len(winners) gt 1 or selfN_CANDIDATES gt 10

              return selfcalculate_mean(winners)

              else

              chose_best = True if winners[0] == selfbest_candidate else

              False

              return selfstats[rsquomeansrsquo][winners[0]] chose_best

              69

              APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

              Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

              rating_sum = 0

              for voter in selfvoters

              for candidate in winners

              rating_sum += voter[candidate]

              return rating_sum(selfN_VOTERSselfN_VACANCIES) False

              APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

              Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

              for i in range(1 selfN_VACANCIES + 2)

              selfleading_candidatesappend(selfsorted_candidates[-i][self

              CANDIDATE_INDEX])

              APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

              Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

              for leader in selfelecrounds[-1]

              selfleading_candidatesappend(leader[0])

              70

              APEcircNDICE H ndash MEacuteTODO SORT_RANKS

              Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

              self_account_for_coalitions()

              for voter in selfvoters

              selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

              (1)))

              temp = []

              for voter in selfsorted_voters

              new_dict = defaultdict(list)

              for k in voter

              new_dict[k[1]]append(k[0])

              tempappend(new_dict)

              selfsorted_voters = []

              for voter_index current_voter in enumerate(temp)

              new_voter = []

              for rating candidate_indexes in current_voteritems()

              if len(current_voter[rating]) gt 1

              shuffle(current_voter[rating])

              for e in candidate_indexes

              new_voterappend((e rating))

              else

              new_voterappend((candidate_indexes[0] rating))

              selfsorted_votersappend(new_voter)

              selfcandidates[new_voter[-1][0]] += 1

              selfvotes[new_voter[-1][0]]add(voter_index)

              71

              APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

              Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

              for candidate in selfvotes_copy

              if candidate not in selfelecleading_candidates

              for voter_index in selfvotes_copy[candidate]

              for index _candidate in enumerate(reversed(selfelec

              sorted_voters[voter_index]))

              if _candidate[selfelecCANDIDATE_INDEX] in selfelec

              leading_candidates

              if randomrandom() lt selfelec

              tactical_vote_percentages[_candidate[selfelec

              CANDIDATE_INDEX]]

              selfrankings_changed[voter_index] = copy

              deepcopy(selfelecsorted_voters[voter_index])

              selfrankings_changed[voter_index][-(index + 1)]

              selfrankings_changed[voter_index][-1] = self

              rankings_changed[voter_index][-1] self

              rankings_changed[voter_index][-(index + 1)]

              selfcandidates[candidate] -= 1

              selfcandidates[_candidate[selfelec

              CANDIDATE_INDEX]] += 1

              selfvotes[candidate]remove(voter_index)

              selfvotes[_candidate[selfelecCANDIDATE_INDEX

              ]]add(voter_index)

              break

              break

              72

              APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

              Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

              half_vacancies = mathfloor(selfelecN_VACANCIES2)

              for candidate in selfelecleading_candidates

              if selfelecleading_candidatesindex(candidate) gt= half_vacancies

              continue

              for voter_index in selfvotes_copy[candidate]

              if voter_index in selfrankings_changed

              ranking = selfrankings_changed[voter_index]

              else

              ranking = copydeepcopy(selfelecsorted_voters[voter_index

              ])

              for index _candidate in enumerate(reversed(ranking))

              if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

              leading_candidates or (_candidate[selfelec

              CANDIDATE_INDEX] in selfelecleading_candidates and

              selfelecleading_candidatesindex(_candidate[selfelec

              CANDIDATE_INDEX]) gt= half_vacancies)

              if _candidate[selfelecCANDIDATE_RANK] gt= 0

              if randomrandom() lt selfelec

              minority_vote_percentages[_candidate[selfelec

              CANDIDATE_INDEX]]

              selfcandidates[candidate] -= 1

              selfcandidates[_candidate[selfelec

              CANDIDATE_INDEX]] += 1

              break

              break

              break

              73

              APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

              Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

              self_account_for_coalitions()

              for candidate in selfvotes

              if candidate = selfwinner and candidate = selfsecond_place

              for voter_index in selfvotes[candidate]

              if voter_index in selfrankings_changed

              ranking = selfrankings_changed[voter_index]

              else

              ranking = copydeepcopy(selfelecsorted_voters[

              voter_index])

              for index2 candidate in enumerate(reversed(ranking))

              if candidate[selfelecCANDIDATE_INDEX] == selfwinner

              selfcandidates[selfwinner] += 1

              selfvotes[selfwinner]add(voter_index)

              break

              elif candidate[selfelecCANDIDATE_INDEX] == self

              second_place

              selfcandidates[selfsecond_place] += 1

              selfvotes[selfsecond_place]add(voter_index)

              break

              selfsorted_candidates = selfelecsort_candidates(selfcandidates)

              winners = []

              vacancies = selfelecN_VACANCIES

              for candidate in reversed(selfsorted_candidates)

              if vacancies == 0

              break

              winnersappend(candidate[0])

              vacancies -= 1

              mean chose_best = selfelecget_mean(winners = winners)

              74

              APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

              Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

              for voter_index voter in enumerate(selfelecsorted_voters)

              voter_dict = dict()

              og_voter_dict = dict()

              for tup in voter

              voter_dict[tup[0]] = tup[1]

              og_voter_dict[tup[0]] = tup[1]

              for coalition in selfeleccoalitions

              for candidate in coalition

              add_to_score = 0

              for candidate2 in coalition

              if candidate == candidate2

              continue

              half = og_voter_dict[candidate2[rsquovaluersquo]]2

              if half lt 0

              add_to_score += mathceil(half)

              else

              add_to_score += mathfloor(half)

              if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

              voter_dict[candidate[rsquovaluersquo]] = 10

              elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

              voter_dict[candidate[rsquovaluersquo]] = -10

              else

              voter_dict[candidate[rsquovaluersquo]] += add_to_score

              selfrankings_changed[voter_index] = []

              for candidate in voter_dict

              selfrankings_changed[voter_index]append((candidate voter_dict[

              candidate]))

              selfrankings_changed[voter_index] = sorted(selfrankings_changed[

              voter_index] key=lambda x x[1])

              75

              APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

              Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

              selfelecroundsappend(selfsorted_candidates[_round])

              if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

              N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

              N_VACANCIES - 1)

              return 2

              elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

              N_VOTERS gt 05)

              return 1

              else

              selfelecexcludedadd(selfsorted_candidates[_round][selfelec

              CANDIDATE_INDEX])

              for voter_index in selfvotes[selfsorted_candidates[_round][self

              elecCANDIDATE_INDEX]]

              if voter_index in selfrankings_changed

              for candidate in reversed(selfrankings_changed[voter_index

              ])

              if candidate[selfelecCANDIDATE_INDEX] not in selfelec

              excluded

              selfcandidates[candidate[selfelecCANDIDATE_INDEX

              ]] += 1

              selfvotes[candidate[selfelecCANDIDATE_INDEX]]

              add(voter_index)

              break

              else

              continue

              else

              for candidate in reversed(selfelecsorted_voters[

              voter_index])

              if candidate[selfelecCANDIDATE_INDEX] not in selfelec

              excluded

              selfcandidates[candidate[selfelecCANDIDATE_INDEX

              ]] += 1

              selfvotes[candidate[selfelecCANDIDATE_INDEX]]

              add(voter_index)

              break

              else

              continue

              selfsorted_candidates = selfelecsort_candidates(selfcandidates)

              return 0

              76

              APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

              Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

              for index in range(selfelecN_CANDIDATES)

              selfcandidates[index] = 0

              for voter in selfelecsorted_voters

              for candidate in reversed(voter)

              if candidate[selfelecCANDIDATE_SCORE] gt 0

              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

              else

              break

              APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

              Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

              for index in range(selfelecN_CANDIDATES)

              selfcandidates[index] = 0

              for voter in selfelecsorted_voters

              if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

              elecCANDIDATE_INDEX]]

              selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

              else

              for candidate in reversed(voter)

              if candidate[selfelecCANDIDATE_SCORE] gt 0

              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

              else

              break

              77

              APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

              Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

              pos = set()

              for index perc in enumerate(selfelectactical_vote_percentages)

              if perc gt 0

              posadd(index)

              for candidate in selfeleccandidates

              if candidate not in selfleading_candidates

              for voter_index in selfvotes[candidate]

              raised = None

              for candidate_tuple in reversed(selfelecsorted_voters[voter_index

              ])

              if candidate_tuple[selfelecCANDIDATE_INDEX] in self

              leading_candidates

              if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

              if randomrandom() lt selfelectactical_vote_percentages[

              candidate_tuple[selfelecCANDIDATE_INDEX]]

              ranking = [None]selfelecN_CANDIDATES

              ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

              selfelecvoters[voter_index][candidate_tuple[selfelec

              CANDIDATE_INDEX]])

              raised = candidate_tuple[selfelecCANDIDATE_INDEX]

              break

              break

              break

              if raised = None

              for _candidate in selfleading_candidates

              if _candidate = ranking[-1][0]

              ranking[0] = (_candidate selfelecvoters[voter_index][

              _candidate])

              buried = _candidate

              break

              i = 1

              for candidate_tuple in selfelecsorted_voters[voter_index]

              if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

              buried]

              continue

              else

              ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

              selfelecvoters[voter_index][candidate_tuple[selfelec

              CANDIDATE_INDEX]])

              i += 1

              selfrankings_changed[voter_index] = ranking

              78

              APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

              Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

              for voter_index in selfvotes[candidate]

              if randomrandom() lt selfelectactical_vote_percentages[candidate

              ]

              for _candidate in selfleading_candidates

              if _candidate = candidate

              ranking = [None]selfelecN_CANDIDATES

              ranking[0] = (_candidate selfelecvoters[voter_index][

              _candidate])

              buried = _candidate

              break

              i = 1

              for candidate_tuple in selfelecsorted_voters[voter_index]

              if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

              continue

              else

              ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

              selfelecvoters[voter_index][candidate_tuple[selfelec

              CANDIDATE_INDEX]])

              i += 1

              selfrankings_changed[voter_index] = ranking

              79

              APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

              Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

              for index in range(selfelecN_CANDIDATES)

              selfcandidates[index] = 0

              for voter_index voter in enumerate(selfelecsorted_voters)

              score = 0

              if voter_index in selfrankings_changed

              for candidate in selfrankings_changed[voter_index]

              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

              score += 1

              else

              for candidate in voter

              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

              score += 1

              APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

              Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

              for voter_index voter in enumerate(selfelecsorted_voters)

              if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

              elecCANDIDATE_INDEX]]

              selfrankings_changed[voter_index] = copydeepcopy(selfelec

              sorted_voters[voter_index])

              for candidate_index candidate in enumerate(reversed(voter))

              if candidate_index == 0

              selfrankings_changed[voter_index][-(candidate_index + 1)] = (

              voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

              else

              selfrankings_changed[voter_index][-(candidate_index + 1)] = (

              voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

              80

              APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

              Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

              for index in range(selfelecN_CANDIDATES)

              selfcandidates[index] = 0

              for voter_index voter in enumerate(selfelecsorted_voters)

              if voter_index in selfrankings_changed

              for candidate in selfrankings_changed[voter_index]

              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

              selfelecCANDIDATE_RANK]

              else

              for candidate in voter

              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

              selfelecCANDIDATE_RANK]

              APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

              Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

              for index in range(selfelecN_CANDIDATES)

              selfcandidates[index] = 0

              for voter in selfelecsorted_voters

              votes = selfelecN_VACANCIES

              for candidate in reversed(voter)

              if votes == 0

              break

              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

              votes -= 1

              • Folha de aprovaccedilatildeo
              • Agradecimentos
              • Epiacutegrafe
              • Resumo
              • Abstract
              • Lista de ilustraccedilotildees
              • Lista de Coacutedigos
              • Lista de tabelas
              • Lista de abreviaturas e siglas
              • Sumaacuterio
              • INTRODUCcedilAtildeO
                • MOTIVACcedilAtildeO E OBJETIVO
                • MEacuteTODO
                • ESTRUTURA
                  • SISTEMAS ELEITORAIS
                    • FISRT PAST THE POST
                      • Exemplo
                      • Vantagens e Desvantagens do FPTP
                      • Voto Uacutetil no FPTP
                        • TWO-ROUND SYSTEM
                          • Exemplo
                          • Vantagens e Desvantagens do TRS
                          • Voto Uacutetil no TRS
                            • INSTANT-RUNOFF VOTING
                              • Exemplo
                              • Vantagens e Desvantagens do IRV
                              • Voto Uacutetil no IRV
                                • APPROVAL VOTING SYSTEM
                                  • Exemplo
                                  • Vantagens e Desvantagens do AVS
                                  • Voto Uacutetil no AVS
                                    • THE BORDA COUNT
                                      • Exemplo
                                      • Vantagens e Desvantagens do BC
                                      • Voto Uacutetil no BC
                                        • SCORE VOTING SYSTEM
                                          • Exemplo
                                          • Vantagens e Desvantagens do SVS
                                          • Voto Uacutetil no SVS
                                            • BLOC VOTE
                                              • Exemplo
                                              • Voto Uacutetil no BV
                                                  • O SIMULADOR
                                                  • CENAacuteRIOS PERTINENTES
                                                    • CENAacuteRIO 1 VOTO TAacuteTICO
                                                    • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                    • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                    • CENAacuteRIO 4 COALIZOtildeES
                                                    • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                    • CENAacuteRIO 6 VOTO DE MINORIA
                                                      • COMO FUNCIONA O SIMULADOR
                                                        • CLASSE Elections
                                                        • CLASSE FirstPastThePost
                                                        • CLASSE TwoRoundSystem
                                                        • CLASSE InstantRunoffVoting
                                                        • CLASSE ApprovalVoting
                                                        • CLASSE BordaCount
                                                        • CLASSE ScoreVoting
                                                        • CLASSE BlocVote
                                                        • TECNOLOGIAS UTILIZADAS
                                                          • CONCLUSAtildeO
                                                          • Referecircncias
                                                          • Meacutetodo create_voters
                                                          • Meacutetodo create_candidates
                                                          • Meacutetodo calculate_means
                                                          • Meacutetodo get_mean
                                                          • Meacutetodo calculate_mean
                                                          • Meacutetodo set_leading_candidates
                                                          • Meacutetodo irv_set_leading_candidates
                                                          • Meacutetodo sort_ranks
                                                          • Meacutetodo fptp_count_tactical_votes
                                                          • Meacutetodo fptp_count_minority_votes
                                                          • Meacutetodo trs_second_round
                                                          • Meacutetodo trs_account_for_coalitions
                                                          • Meacutetodo irv_count_votes
                                                          • Meacutetodo avs_count_votes
                                                          • Meacutetodo avs_count_votes_with_tactical
                                                          • Meacutetodo irv_apply_tactical_votes
                                                          • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                          • Meacutetodo bc_sum_candidates_scores
                                                          • Meacutetodo svs_apply_tactical_votes
                                                          • Meacutetodo svs_sum_candidates_scores
                                                          • Meacutetodo bv_count_votes

                Figura 37 ndash AVS - Cenaacuterio 5 49Figura 38 ndash BC - Cenaacuterio 5 49Figura 39 ndash SVS - Cenaacuterio 5 50Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria 50Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego 51Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego 51Figura 43 ndash BV - Cenaacuterio 6 52Figura 44 ndash estrutura candidates 53Figura 45 ndash estrutura voters 54Figura 46 ndash estrutura votes 54Figura 47 ndash PDF - Distribuiccedilatildeo Neutral 55Figura 48 ndash CDF - Distribuiccedilatildeo Neutral 55Figura 49 ndash PDF - Distribuiccedilatildeo Liked 56Figura 50 ndash CDF - Distribuiccedilatildeo Liked 56Figura 51 ndash PDF - Distribuiccedilatildeo Disliked 57Figura 52 ndash CDF - Distribuiccedilatildeo Disliked 57Figura 53 ndash PDF - Distribuiccedilatildeo Loved 58Figura 54 ndash CDF - Distribuiccedilatildeo Loved 58Figura 55 ndash PDF - Distribuiccedilatildeo Hated 59Figura 56 ndash CDF - Distribuiccedilatildeo Hated 59Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer 60Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer 60Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer 61Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer 61

                LISTA DE COacuteDIGOS

                A1 Meacutetodo create_voters 67B1 Meacutetodo create_candidates 68C1 Meacutetodo calculate_means 68D1 Meacutetodo get_mean 68E1 Meacutetodo calculate_mean 69F1 Meacutetodo set_leading_candidates 69G1 Meacutetodo irv_set_leading_candidates 69H1 Meacutetodo sort_ranks 70I1 Meacutetodo fptp_count_tactical_votes 71J1 Meacutetodo fptp_count_minority_votes 72K1 Meacutetodo trs_second_round 73L1 Meacutetodo trs_account_for_coalitions 74M1 Meacutetodo irv_count_votes 75N1 Meacutetodo avs_count_votes 76O1 Meacutetodo avs_count_votes_with_tactical 76P1 Meacutetodo irv_apply_tactical_votes 77Q1 Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo) 78R1 Meacutetodo bc_sum_candidates_scores 79S1 Meacutetodo svs_apply_tactical_votes 79T1 Meacutetodo svs_sum_candidates_scores 80U1 Meacutetodo bv_count_votes 80

                LISTA DE TABELAS

                Tabela 1 ndash Exemplo FPTP 18Tabela 2 ndash 2deg turno do TRS 20Tabela 3 ndash Exemplo IRV 22Tabela 4 ndash Desenvolvimento do IRV 22Tabela 5 ndash Exemplo AVS 24Tabela 6 ndash Resultado AVS 24Tabela 7 ndash Resultado BC 26Tabela 8 ndash Exemplo SVS 27Tabela 9 ndash Resultado SVS 27Tabela 10 ndash Exemplo BV 28Tabela 11 ndash Resultado BV 28Tabela 12 ndash Distribuiccedilatildeo de notas - Cenaacuterio 2 41Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2 42Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3 43Tabela 15 ndash Resultados do Cenaacuterio 3 44Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5 47Tabela 17 ndash Resultados do Cenaacuterio 5 48Tabela 18 ndash Resultados do Cenaacuterio 6 52

                LISTA DE ABREVIATURAS E SIGLAS

                FPTP First Past The Post

                TRS Two-Round System

                IRV Instant Runoff Voting

                AVS Approval Voting System

                BC Borda Count

                SVS Score Voting System

                BV Bloc Vote

                SUMAacuteRIO

                1 INTRODUCcedilAtildeO 1511 MOTIVACcedilAtildeO E OBJETIVO 1512 MEacuteTODO 1513 ESTRUTURA 15

                2 SISTEMAS ELEITORAIS 1721 FISRT PAST THE POST 17211 Exemplo 18212 Vantagens e Desvantagens do FPTP 18213 Voto Uacutetil no FPTP 1922 TWO-ROUND SYSTEM 19221 Exemplo 20222 Vantagens e Desvantagens do TRS 20223 Voto Uacutetil no TRS 2123 INSTANT-RUNOFF VOTING 21231 Exemplo 22232 Vantagens e Desvantagens do IRV 22233 Voto Uacutetil no IRV 2324 APPROVAL VOTING SYSTEM 24241 Exemplo 24242 Vantagens e Desvantagens do AVS 24243 Voto Uacutetil no AVS 2525 THE BORDA COUNT 25251 Exemplo 25252 Vantagens e Desvantagens do BC 26253 Voto Uacutetil no BC 2626 SCORE VOTING SYSTEM 26261 Exemplo 27262 Vantagens e Desvantagens do SVS 27263 Voto Uacutetil no SVS 2727 BLOC VOTE 28271 Exemplo 28272 Voto Uacutetil no BV 29

                3 O SIMULADOR 30

                4 CENAacuteRIOS PERTINENTES 3441 CENAacuteRIO 1 VOTO TAacuteTICO 3442 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV 4143 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE 4344 CENAacuteRIO 4 COALIZOtildeES 4545 CENAacuteRIO 5 DILEMA DO PRISIONEIRO 4746 CENAacuteRIO 6 VOTO DE MINORIA 50

                5 COMO FUNCIONA O SIMULADOR 5351 CLASSE Elections 5352 CLASSE FirstPastThePost 6053 CLASSE TwoRoundSystem 6254 CLASSE InstantRunoffVoting 6255 CLASSE ApprovalVoting 6356 CLASSE BordaCount 6357 CLASSE ScoreVoting 6358 CLASSE BlocVote 6459 TECNOLOGIAS UTILIZADAS 64

                6 CONCLUSAtildeO 65

                REFEREcircNCIAS 66

                APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS 67

                APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES 68

                APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS 68

                APEcircNDICE D ndash MEacuteTODO GET_MEAN 68

                APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN 69

                APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES 69

                APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES 69

                APEcircNDICE H ndash MEacuteTODO SORT_RANKS 70

                APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES 71

                APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES 72

                APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND 73

                APEcircNDICE L ndash MEacuteTODOTRS_ACCOUNT_FOR_COALITIONS 74

                APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES 75

                APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES 76

                APEcircNDICE O ndash MEacuteTODOAVS_COUNT_VOTES_WITH_TACTICAL 76

                APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES 77

                APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES (CON-TINUACcedilAtildeO) 78

                APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES 79

                APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES 79

                APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES 80

                APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES 80

                15

                1 INTRODUCcedilAtildeO

                Em toda eleiccedilatildeo existe pelo menos um grupo de indiviacuteduos que sai completamentedesfavorecido e insatisfeito com o resultado O contentamento completo de uma populaccedilatildeoeacute certamente improvaacutevel e muitas vezes impossiacutevel considerando a gama de candidatosque se dispotildee a concorrer Em todo caso o miacutenimo que pode ser feito eacute escolher demaneira eficiente o melhor candidato ao cargo dentre as opccedilotildees disponiacuteveis Diante dissoeacute necessaacuterio avaliar como essa escolha eacute feita e quais meacutetodos satildeo capazes de tornaacute-larealidade

                11 MOTIVACcedilAtildeO E OBJETIVO

                Em conformidade com o extenso nuacutemero de sistemas eleitorais pelo mundo este tra-balho tem como objetivo testar uma porccedilatildeo desses sistemas sob a simulaccedilatildeo de diferentescenaacuterios especiacuteficos a fim de determinar quais deles podem ser considerados como os maisjustos perante a taxa de satisfaccedilatildeo meacutedia da populaccedilatildeo

                12 MEacuteTODO

                Para que essa anaacutelise seja possiacutevel foi desenvolvido um programa que permite a criaccedilatildeoe configuraccedilatildeo de diferentes cenaacuterios onde os sistemas eleitorais seratildeo simulados Nele eacutepossiacutevel definir o nuacutemero total de eleitores e candidatos como esses eleitores iratildeo votar eo niacutevel de popularidade de cada candidato Aleacutem disso eacute possiacutevel formar coalizotildees entreos candidatos e escolher a porcentagem dos eleitores que optaratildeo pelo voto uacutetil Dessamaneira seraacute possiacutevel elaborar cenaacuterios que buscam expor os pontos fortes e fracos decada sistema

                13 ESTRUTURA

                Este trabalho eacute relatado ao longo de seis capiacutetulos No Capiacutetulo 2 seratildeo apresentados ossistemas eleitorais implementados no simulador suas vantagens e desvantagens conhecidase outras caracteriacutesticas especiacuteficas de cada um A intenccedilatildeo do capiacutetulo eacute tornar o textomais autocontido trazendo conceitos jaacute estudados que ajudaratildeo na melhor compreensatildeodos capiacutetulos seguintes por isso grande parte de sua composiccedilatildeo eacute oriunda de diferentesfontes consultadas

                O Capiacutetulo 3 eacute uma apresentaccedilatildeo das funcionalidades que o simulador possui Seratildeoexplicados todos os campos de entrada e os dois modos distintos nos quais o programaopera

                16

                No Capiacutetulo 4 os sistemas seratildeo colocados em teste Todos seratildeo simulados em cenaacuteriosespeciacuteficos a fim de fazer sobressair aqueles com as maiores taxas de satisfaccedilatildeo meacutedia

                A estrutura e implementaccedilatildeo do simulador seratildeo abordadas em detalhes no Capiacutetulo5 assim como uma breve descriccedilatildeo da stack utilizada Todos os meacutetodos relevantes aofuncionamento das simulaccedilotildees seratildeo explicados passo a passo

                No Capiacutetulo 6 seratildeo apresentadas as conclusotildees referentes agrave anaacutelise dos resultadosobtidos no Capiacutetulo 4 e as consideraccedilotildees finais do projeto como um todo

                17

                2 SISTEMAS ELEITORAIS

                Atualmente mais e mais paiacuteses estatildeo adotando sistemas democraacuteticos de governoCerca de 6 em 10 governos no mundo satildeo democracias (Pew Research Center 2017) o quepode ser observado na Figura 1 abaixo Em um sistema democraacutetico a populaccedilatildeo escolheseus liacutederes atraveacutes de seu sistema eleitoral Existem diversos sistemas eleitorais em usono mundo muitos dos quais satildeo usados em conjunto para eleger um uacutenico candidato Emvaacuterios paiacuteses mais de um sistema eleitoral pode ser utilizado tambeacutem em diferentes niacuteveisde governo tanto presidencial quanto estadual ou municipal Natildeo apenas imersos nomeio poliacutetico eles tambeacutem podem ser usados em escopos menores como em esportes oucompeticcedilotildees artiacutesticas poreacutem sempre com a finalidade de alocar um ou mais indiviacuteduosa determinado cargo ou tiacutetulo

                Figura 1 ndash de paiacuteses de cada tipo de regime 1946-2016

                Fonte Center of Systemic Peacersquos Polity IV Project

                Os proacuteximos trecircs toacutepicos discutidos neste capiacutetulo referentes aos meacutetodos First Pastthe Post Two-Round System e Instant Runoff Voting possuem seus conceitos e infor-maccedilotildees relevantes com exceccedilatildeo dos exemplos traduzidos livremente do livro Behind theBallot Box A Citizenrsquos Guide to Voting Systems (AMY 2000)

                21 FISRT PAST THE POST

                O meacutetodo First Past the Post tambeacutem conhecido como Plurality Voting ou WinnerTakes All eacute o meacutetodo mais simples e direto e provavelmente o primeiro meacutetodo que sepensa quando se fala de eleiccedilotildees Os eleitores escolhem apenas um candidato e apoacutes a

                18

                contagem dos votos o candidato com o maior nuacutemero de votos eacute eleito O vencedor natildeonecessita da aprovaccedilatildeo de mais de 50 dos eleitores ele apenas precisa de uma pluralidadedos votos ou seja apenas possuir mais votos que os outros candidatos

                Esse sistema eacute utilizado em escala nos Estados Unidos para a maior parte das eleiccedilotildeesvoltadas a eleger apenas um candidato como prefeitos e governadores aleacutem de ser usadana disputa presidencial Dentre outros paiacuteses que empregam o sistema em suas corridaspresidenciais estatildeo listados o Meacutexico as Filipinas a Coreia do Sul e a Venezuela

                211 Exemplo

                Tabela 1 ndash Exemplo FPTP

                Candidatos VotosA 36B 25C 22D 17

                Neste exemplo o candidato A possui uma pluralidade dos votos com 36 e ele eacute ocandidato eleito mesmo natildeo tendo uma maioria

                212 Vantagens e Desvantagens do FPTP

                A vantagem do FPTP eacute a sua simplicidade Natildeo eacute difiacutecil para um eleitor comumcompreender o seu funcionamento eles apenas precisam se decidir por um candidato Eletambeacutem eacute muito simples e direto na sua contagem e seleccedilatildeo do vencedor

                Esse meacutetodo tambeacutem tende a criar listas de candidatos concorrentes mais curtasCandidatos independentes ou de partidos menores frequentemente acabam se sentindodesencorajados a concorrer devido agraves suas baixas chances de vitoacuteria Isso normalmentefornece aos eleitores uma faacutecil decisatildeo entre um ou dois candidatos dos maiores partidosao mesmo tempo poreacutem limitando suas opccedilotildees

                No entanto sua essecircncia eacute sua principal desvantagem a pluralidade O fato do can-didato eleito natildeo necessitar de uma maioridade dos votos da populaccedilatildeo parece violaros princiacutepios baacutesicos da democracia Democracia eacute em sua origem o poder(kratos) nopovo(demos) poreacutem na pluralidade o poder de eleger um candidato pode residir emapenas uma fraccedilatildeo relativamente pequena do povo Em um cenaacuterio hipoteacutetico comapenas trecircs candidatos um deles apenas poderia necessitar de natildeo mais do que 34 dosvotos para ser eleito o que significa que no pior dos casos 66 da populaccedilatildeo rejeitao candidato eleito O cenaacuterio soacute piora com mais e mais candidatos concorrendo Paraquatro candidatos satildeo necessaacuterios 26 dos votos no pior dos casos para cinco satildeo 21 eassim por diante

                19

                213 Voto Uacutetil no FPTP

                No FPTP tambeacutem existe a possibilidade de os eleitores evitarem votar em sua prefe-recircncia verdadeira No caso de sua preferecircncia natildeo aparentar ter boas chances de vitoacuteriamuitas vezes opta-se por uma segunda opccedilatildeo que esteja mais bem colocada nas eleiccedilotildeesO motivo disso eacute que nessas situaccedilotildees votar em sua preferecircncia pode parecer um des-perdiacutecio do seu voto e no pior dos cenaacuterios optar por natildeo transferir seu voto para umasegunda opccedilatildeo pode acabar resultando na eleiccedilatildeo de um candidato de seu desgosto As-sim votar de maneira verdadeira muitas vezes pode acabar prejudicando o eleitor que sevecirc forccedilado a abandonar seus interesses poliacuteticos mais imediatos e escolher o menor entredois(ou mais) males Os candidatos de partidos menores satildeo os que mais sofrem com essetipo de voto estrateacutegico por natildeo conseguirem agregar as maiores quantidades de votos

                Entretanto ao mesmo tempo que partidos maiores roubam votos de partidos meno-res com os votos taacuteticos partidos menores tambeacutem tem a oportunidade de ganhar algunsvotos com o denominado spoiler effect Ao entrarem na eleiccedilatildeo candidatos de partidosmenores podem adquirir votos de candidatos mais populares que possuem inclinaccedilatildeo po-liacutetica semelhante Logo eacute possiacutevel que haja certo equiliacutebrio ao se contrapor as mudanccedilasde voto devido aos votos uacuteteis agraves mudanccedilas oriundas do spoiler effect

                Poreacutem o spoiler effect natildeo necessariamente ocorre apenas entre partidos maiores emenores mas pode prejudicar candidatos de popularidades proacuteximas Por exemplo entretrecircs candidatos A B e C onde A representa determinada posiccedilatildeo no espectro poliacuteticoenquanto B e C possuem posiccedilotildees parecidas o que pode acontecer eacute B e C se prejudicaremmutuamente jaacute que ambos dividem os eleitores de um mesmo espectro poliacutetico Se esseespectro tem a maioria com 60 por exemplo com B e C compartilhando cada um 30dos votos o candidato A sairia vencedor com 40 mesmo que todos os eleitores de Bprefiram C e todos os eleitores de C prefiram B Esse exemplo demonstra claramente oproblema com os sistemas de pluralidade

                22 TWO-ROUND SYSTEM

                Uma das primeiras tentativas de lidar com a desvantagem dos sistemas por pluralidadeo Two-round System eacute usado desde o seacuteculo XIX no ocidente e atualmente ainda eacute utilizadoem corridas presidecircncias de paiacuteses como o Brasil Bulgaacuteria Chile Colocircmbia FinlacircndiaPolocircnia Portugal Ruacutessia e em inuacutemeras eleiccedilotildees locais nos Estados Unidos

                O principal objetivo do TRS eacute garantir que o vencedor tenha conseguido uma maioriados votos Para isso as eleiccedilotildees satildeo estruturadas em duas rodadas de votaccedilatildeo Na primeirarodada os eleitores se dirigem agraves urnas e votam no candidato de sua preferecircncia Apoacutesa contagem se a quantidade de votos do candidato mais votado superar a proporccedilatildeo de50 natildeo haacute a necessidade de uma segunda rodada e este candidato eacute eleito No entantose este natildeo for o caso haveraacute uma segunda rodada com apenas os dois candidatos mais

                20

                votados Nesta rodada os eleitores retornam as urnas para escolher uma das duas opccedilotildeessendo eleito o candidato mais votado agora definitivamente com uma maioria dos votos

                221 Exemplo

                Utilizando a mesma distribuiccedilatildeo de votos descrita na tabela 1 Neste caso como ocandidato A natildeo possui uma maioria dos votos ele e o candidato B iratildeo concorrer em umsegundo turno Digamos que as distribuiccedilotildees dos votos dos eleitores dos candidatos C eD em relaccedilatildeo aos candidatos A e B satildeo as seguintes

                Tabela 2 ndash 2deg turno do TRS

                Candidatos Votos dos eleitoresde C

                Votos dos eleitoresde D

                Votos do 1degturno

                A 7 5 36B 15 12 25

                O candidato B agora eacute eleito com uma maioria dos votos 52 contra 48 do candidatoA

                222 Vantagens e Desvantagens do TRS

                Por ser parecido com o FPTP esse sistema tambeacutem eacute de faacutecil compreensatildeo do eleitorcomum poreacutem a maior vantagem do TRS eacute a garantia de que o candidato vencedor teraacute oapoio da maioria dos eleitores no segundo turno eliminando a pluralidade Argumenta-seque isso daacute maior legitimidade poliacutetica ao mandato do candidato eleito

                O TRS tende a abrigar uma lista maior de candidatos sendo mais convidativo acandidatos de partidos menores mesmo que suas chances natildeo sejam maiores quandocomparadas agraves eleiccedilotildees sob o FPTP Mesmo assim essa listagem mais abrangente eacute umavantagem do sistema pois daacute aos eleitores uma variedade maior de opccedilotildees de voto

                Em relaccedilatildeo agraves suas desvantagens o TRS possui duas principais A primeira satildeo oscustos elevados do sistema decorrentes da necessidade da organizaccedilatildeo de um segundoturno de votaccedilotildees A segunda eacute o aumento no iacutendice de ausecircncias dos eleitores agraves urnasEssa ampliaccedilatildeo no natildeo comparecimento dos eleitores se daacute tambeacutem devido ao segundoturno por pura fatiga eleitoral bem como consequecircncia da desistecircncia de eleitores queapoiam candidatos que jaacute foram eliminados

                Outro ponto negativo do TRS eacute a sua natildeo-monotonicidade Isso significa que umcandidato pode ser prejudicado com um aumento em sua popularidade e suporte e domesmo modo um candidato pode se beneficiar com a perda de popularidade e suporteSe os candidatos A e B satildeo os esperados para ir ao segundo turno onde A eacute mais fortedo que B um aumento no suporte pelo candidato A pode resultar na sua derrota quandoesse aumento causa uma alteraccedilatildeo nos candidatos que satildeo selecionados para ir ao segundoturno Se esse aumento na popularidade de A resultar na eliminaccedilatildeo preacutevia de B um

                21

                terceiro candidato C pode ser vitorioso sobre A no segundo turno caso os eleitores de Bprefiram C ao candidato A Se natildeo houvesse esse crescimento de popularidade A teriaderrotado B no segundo turno Essa situaccedilatildeo seraacute vista em melhores detalhes na seccedilatildeo 43

                223 Voto Uacutetil no TRS

                Esse sistema minimiza os efeitos do voto uacutetil em relaccedilatildeo ao FPTP pois um eleitorqualquer pode tranquilamente votar em sua preferecircncia sem se preocupar em desperdiccedilaacute-lo mesmo que seu candidato natildeo tenha chances de vitoacuteria Se este natildeo for eleito aindapoderaacute escolher a sua preferecircncia dentre os dois candidatos que prosseguirem para osegundo turno

                Apesar disso ainda existe um cenaacuterio em que o eleitor pode ser tentado a natildeo votar emsua preferecircncia Eacute possiacutevel que ele opte pela sua segunda opccedilatildeo se souber que sua primeiraopccedilatildeo possui miacutenimas chances de ir ao segundo turno ou ateacute mesmo por saber que issodiminuiraacute as chances de algum outro candidato ser eleito Mesmo assim eacute evidente queo TRS natildeo proporciona o mesmo apelo ao voto taacutetico que o FPTP

                Outra caracteriacutestica do TRS eacute o incentivo a formaccedilatildeo de coalizotildees entre candidatosde partidos mais populares com candidatos de partidos menos populares As coalizotildeesfornecem benefiacutecios agrave ambas as partes onde os candidatos classificados para o segundoturno em geral se juntam a candidatos jaacute eliminados com a intenccedilatildeo de agregar maisvotos enquanto os candidatos jaacute eliminados apoiam um dos dois classificados na esperanccedilade inserir propostas proacuteprias ou modificaccedilotildees agrave chapa deles

                23 INSTANT-RUNOFF VOTING

                Instant Runoff Voting foi uma alternativa aos meacutetodos FPTP e TRS desenvolvidanos anos 70 por um professor do Instituto de Tecnologia de Massachusetts(MIT) O IRVelimina as principais desvantagens desses outros dois sistemas a pluralidade do FPTP e anecessidade de mais de uma rodada de votaccedilatildeo do TRS Este meacutetodo tambeacutem opera emmais de uma rodada poreacutem como o proacuteprio nome sugere essas rodadas satildeo instantacircneasnatildeo sendo necessaacuterio o retorno dos eleitores agraves urnas Atualmente ele eacute utilizado naIrlanda nas eleiccedilotildees presidenciais em Londres na eleiccedilatildeo de seu prefeito e em distritosindividuais na Austraacutelia para eleger membros de sua cacircmara baixa do parlamento OIRV tambeacutem eacute usado por vaacuterias organizaccedilotildees privadas nos Estados Unidos incluindoa American Political Science Association e a American Psychological Association paraeleger seus funcionaacuterios

                Nesse sistema os eleitores natildeo satildeo solicitados a votar em um uacutenico candidato aoinveacutes disso eles listam todos os candidatos concorrentes na ordem de sua preferecircnciaA partir dessas listas as primeiras opccedilotildees de cada eleitor recebem o seu voto e apoacutes acontagem se um candidato obtiver 50 dos votos mais um este candidato eacute eleito Se

                22

                isso natildeo ocorrer o candidato menos votado eacute eliminado das eleiccedilotildees e seus votos satildeotransferidos para a segunda opccedilatildeo de cada um de seus eleitores Esse procedimento serepete eliminando o candidato menos votado a cada rodada ateacute que algum dos candidatospossuam a maioridade dos votos

                231 Exemplo

                Na tabela 3 pode-se verificar a distribuiccedilatildeo de votos por perfil de eleitor e na tabela4 vecirc-se o desenvolvimento do IRV para essas distribuiccedilotildees O candidato D eacute o menosvotado e por consequecircncia eacute o primeiro a ser eliminado A segunda opccedilatildeo de todos oseleitores que votaram no candidato D eacute o candidato C por isso este recebe todos os votosdistribuiacutedos na segunda rodada Com isso o candidato B eacute eliminado com 25 dos votos eos candidatos A e C concorrem na uacuteltima rodada Mesmo com o candidato C na lideranccedilana segunda rodada a maior parte dos eleitores do B tem como preferecircncia o candidatoA por isso A eacute eleito com 55 dos votos contra 45 do C

                Tabela 3 ndash Exemplo IRV

                Rankings Ndeg de eleitoresABCD 20ABDC 16BDAC 19BDCA 6CABD 7CDBA 15DCAB 5DCBA 12

                Tabela 4 ndash Desenvolvimento do IRVTurnos D C B A

                1 17 22 25 362 eliminado 39 25 363 eliminado 45 eliminado 55

                232 Vantagens e Desvantagens do IRV

                Assim como no TRS a pluralidade eacute irrelevante no IRV e um candidato soacute eacute eleitocom a maioridade dos votos dando maior legitimidade ao mandato deste No entantopode-se argumentar que o IRV faz isso com mais eficiecircncia pois natildeo requer a execuccedilatildeode mais de uma rodada de votaccedilotildees Isso diminui os custos das eleiccedilotildees como um todoao mesmo tempo que proporciona um nuacutemero menor de isenccedilotildees por parte dos eleitoresdevido ao desgaste de todo o processo eleitoral

                23

                Aleacutem disso candidatos de partidos menores tendem a receber mais votos do queno FPTP e portanto satildeo mais encorajados a se candidatar Com uma lista maior decandidatos eleitores desfrutam de uma variedade maior de opccedilotildees de voto Contudomesmo com mais candidatos menos populares o spoiler effect mencionado anteriormentetambeacutem natildeo possui espaccedilo nesse sistema de votaccedilatildeo Partidos menores natildeo tem comoroubar votos de partidos maiores visto que esses votos eventualmente seratildeo transferidosde volta a eles durante o desenvolvimento das rodadas do IRV

                Em virtude de sua estrutura acredita-se que esse meacutetodo tende a encorajar os can-didatos tambeacutem a elaborar suas campanhas de forma mais abrangente ampliando suainfluecircncia para mais do que apenas um grupo especiacutefico de maneira que ele consiga agre-gar votos de segunda ou terceira opccedilatildeo aleacutem dos votos de seus eleitores principais

                A principal desvantagem do IRV eacute o fato de ele ainda natildeo ser amplamente utilizado aoredor do mundo Essa falta de familiaridade do sistema pode causar confusatildeo ao eleitorcomum em suas primeiras ocorrecircncias No entanto nos paiacuteses em que este eacute utilizadonatildeo parece haver confusatildeo entre os eleitores Aleacutem disso na maioria dos casos haveraacute umcusto potencialmente alto da substituiccedilatildeo ou alteraccedilatildeo dos sistemas das urnas eletrocircnicaspara que seja possiacutevel haver a implementaccedilatildeo do meacutetodo

                Aleacutem disso assim como o TRS este sistema tambeacutem possui natildeo-monotonicidade ouseja um candidato pode ser prejudicado ao ser ranqueado mais alto enquanto que outropode se beneficiar sendo ranqueado mais baixo pelos eleitores (ORNSTEIN 2018) issopode ocorrer quando esse ranqueamento causa alteraccedilotildees na ordem em que os candidatossatildeo eliminados Essa caracteriacutestica se manifesta em fenocircmenos complexos e especiacuteficos epor isso um exemplo de sua ocorrecircncia seraacute abordada em detalhes na seccedilatildeo 43

                233 Voto Uacutetil no IRV

                Como os sistemas de votaccedilatildeo anteriores o IRV natildeo eacute completamente imune ao vototaacutetico No entanto este meacutetodo se mostra bem resistente a eles quando comparado aoutros meacutetodos como o FPTP e o Borda Count (Bartholdi John J III and Orlin JamesB 1990) Distintivamente o IRV requer um maior esforccedilo do eleitor para elaborar umaestrateacutegia que melhor ajuste os resultados da eleiccedilatildeo de acordo com a sua preferecircnciaAleacutem disso eacute necessaacuterio que ele tenha informaccedilatildeo suficiente sobre os rankings de outroseleitores naturalmente obtida atraveacutes de pesquisas eleitorais

                Existe tambeacutem a possibilidade de ocorrer uma exaustatildeo dos votos quando natildeo haacuteo completo preenchimento do ranking por parte dos eleitores Nessas ocasiotildees o votonatildeo pode continuar a ser transferido a outros candidatos e ele eacute descartado Isso afetaa legitimidade do mandato do candidato eleito pois o resultado final natildeo representaraacute100 da populaccedilatildeo votante Essas ocorrecircncias no entanto podem ser minimizadas comuma melhor educaccedilatildeo eleitoral ou como foi implementado na Austraacutelia requerer que osrankings incluam uma totalidade dos candidatos concorrentes

                24

                24 APPROVAL VOTING SYSTEM

                No meacutetodo Approval Voting os eleitores natildeo satildeo limitados pelo nuacutemero de candidatosem que podem votar por isso approval cada eleitor pode votar em todos os candidatos osquais ele aprova Apoacutes as votaccedilotildees o candidato com a maior quantidade de votos eacute eleitoSegundo Hamlin (2015) a cidade de Fargo na Dakota do Norte se tornou a primeiracidade nos EUA a colocar em praacutetica este sistema em suas eleiccedilotildees gerais em novembrode 2018 AVS tambeacutem eacute utilizado para eleger o secretaacuterio-geral das Naccedilotildees Unidas e emdiversas outras organizaccedilotildees

                241 Exemplo

                Na tabela 5 abaixo pode-se encontrar 8 perfis de eleitores com seus candidatos apro-vados e quantidade de eleitores que se encaixam no perfil Na tabela 6 temos o resultadoda contabilizaccedilatildeo dos votos destes perfis O candidato mais popular eacute o B que se encontraaprovado em 5 perfis distintos totalizando 60 votos ou aproximadamente 32

                Tabela 5 ndash Exemplo AVS

                Aprovaccedilotildees Ndeg de eleitoresA 20AB 16B 19

                BDC 6CAB 7CD 15DC 5DCB 12

                Tabela 6 ndash Resultado AVSCandidatos Total de votos

                A 43B 60C 45D 38

                242 Vantagens e Desvantagens do AVS

                Aleacutem de simples este meacutetodo permite um niacutevel maior de expressividade aos eleitoresOnde no FPTP e TRS eles satildeo limitados pelo seu uacutenico voto aqui os eleitores tecircm aliberdade de demonstrar exatamente quais candidatos consideram aptos ou aceitaacuteveis aocargo

                25

                Outro efeito dessa liberdade trazida pelo AVS eacute a dizimaccedilatildeo do spoiler effect Can-didatos de partidos menores natildeo tem como roubar votos de partidos maiores nessesistema ambos os candidatos contabilizariam o voto

                243 Voto Uacutetil no AVS

                O tipo de voto uacutetil no AVS eacute denominado bullet voting Segundo The Center forElection Science (2015) esta taacutetica envolve simplesmente ignorar a possibilidade de votarem mais de um candidato e votar apenas em sua primeira opccedilatildeo Um eleitor pode serlevado a adotar essa estrateacutegia quando percebe que sua preferecircncia pode ser prejudicadacom o voto em alguma segunda opccedilatildeo sua Em um cenaacuterio extremo onde 100 doseleitores adotam esta estrateacutegia as eleiccedilotildees satildeo convertidas a um simples First Past ThePost

                25 THE BORDA COUNT

                Este meacutetodo carrega o nome em homenagem a seu criador Jean-Charles de Bordaque o desenvolveu em 1770 (LIPPMAN 2012) A contagem de Borda utiliza a abordagemde ranqueamento dos candidatos poreacutem de maneira diferente ao IRV Este eacute um sistemaque atribui uma pontuaccedilatildeo aos candidatos com base nestes rankings O candidato na basedo ranking natildeo recebe pontos o candidato imediatamente acima deste recebe 1 pontoo proacuteximo recebe 2 pontos e assim por diante ateacute o topo do ranking As pontuaccedilotildees detodos os rankings satildeo contabilizadas e o candidato com maior pontuaccedilatildeo eacute eleito Deacordo com Lippman variaccedilotildees deste meacutetodo satildeo encontradas em uso na premiaccedilatildeo dediversos esportes como na seleccedilatildeo do MVP(Most Valuable Player) da MLB(principal ligade beisebol dos EUA) e no Trofeacuteu Heisman de futebol americano universitaacuterio

                251 Exemplo

                Neste exemplo seratildeo aproveitados os mesmos rankings apresentados na tabela 3 Porserem 4 candidatos o primeiro colocado de cada ranking receberaacute 3 pontos o segundo 2pontos o terceiro 1 e o quarto 0 Assim o nuacutemero maacuteximo de pontos que um candidatopode atingir eacute igual a 300(se ficar na primeira posiccedilatildeo em todos os rankings) e o nuacutemerototal de pontos no sistema eacute 600 O nuacutemero maacuteximo de pontos que um candidato podeatingir eacute calculado com

                (cminus 1)times e

                Sendo c igual ao nuacutemero de candidatos e e o nuacutemero de eleitores Por sua vez onuacutemero total de pontos no sistema eacute

                26

                (cminus 1)times c2

                times e

                A contagem final dos pontos eacute apresentada na tabela 7 abaixo

                Tabela 7 ndash Resultado BCCandidatos Total de pontos

                A 146B 181C 126D 147

                O candidato eleito eacute o B com 181 pontos ou aproximadamente 60 da pontuaccedilatildeomaacutexima

                252 Vantagens e Desvantagens do BC

                Em comparaccedilatildeo com os meacutetodos abordados anteriormente que apenas consideramas primeiras opccedilotildees de cada eleitor este meacutetodo regularmente escolhe candidatos comaceitaccedilatildeo mais ampla ao inveacutes de uma preferecircncia direta dos eleitores (Electoral ReformSociety 2017b)

                Ele tambeacutem encoraja uma abordagem estrateacutegica por parte dos partidos onde seriade seu interesse nomear mais de um candidato para concorrer pois quanto mais candi-datos estatildeo no paacutereo maior eacute a pontuaccedilatildeo dos primeiros colocados Logo a nomeaccedilatildeo decandidatos menos populares pode beneficiar os principais candidatos de um partido

                253 Voto Uacutetil no BC

                Existem duas estrateacutegias aplicaacuteveis a esse sistema A primeira denominada compromi-sing de maneira similar a outros meacutetodos de votaccedilatildeo se resume em ranquear em primeirolugar um dos candidatos que estejam liderando as eleiccedilotildees mesmo que este natildeo seja suapreferecircncia real A segunda estrateacutegia burying eacute o oposto esta se baseia em ranquearem uacuteltimo lugar um dos candidatos liacutederes mesmo que este natildeo seja o seu candidato demaior desgosto Ambas estrateacutegias podem ser aplicadas ao mesmo tempo por um eleitor

                26 SCORE VOTING SYSTEM

                Score Voting ou Range Voting como tambeacutem eacute conhecido eacute mais um meacutetodo quetenta trazer maior liberdade de expressatildeo aos eleitores Assim como o Borda Counteste sistema funciona baseado na pontuaccedilatildeo dos candidatos no entanto ao inveacutes dessapontuaccedilatildeo ser relativa agrave posiccedilatildeo do candidato no ranking de cada eleitor este por sua veztem completa liberdade de atribuir qualquer quantidade de pontos aos candidatos dentro

                27

                de determinada escala Um eleitor pode dar o mesmo nuacutemero de pontos para diferentescandidatos e apoacutes o somatoacuterio de todas as pontuaccedilotildees o candidato com a pontuaccedilatildeo maisalta eacute eleito Incorporado ao escopo poliacutetico o SVS eacute utilizado no Partido Pirata Alematildeobem como em diversas organizaccedilotildees tais como o Fedora Project e Mozilla e tambeacutem emvariados esportes oliacutempicos e reality shows como o American Idol aponta Hamlin (2015)

                261 Exemplo

                Neste exemplo temos apresentados na tabela 8 abaixo 4 perfis distintos de eleitorese suas respectivas atribuiccedilotildees de pontos aos 4 candidatos Cada eleitor pode atribuirqualquer pontuaccedilatildeo a um candidato dentro da escala de -10 a 10 O resultado da eleiccedilatildeoapoacutes a soma de todos os pontos por candidato se encontra na tabela 9 onde o candidatoA eacute eleito com um total de 605 pontos

                Tabela 8 ndash Exemplo SVS

                Perfil A B C D Ndeg de eleitores1 10 -1 5 2 362 6 9 -3 4 253 2 0 8 4 224 3 3 3 10 17

                Tabela 9 ndash Resultado SVSCandidatos Total de pontos

                A 605B 240C 332D 430

                262 Vantagens e Desvantagens do SVS

                A grande vantagem do SVS eacute como ele proporciona aos eleitores expressar de maneiramuito proacutexima potencialmente exata suas impressotildees poliacuteticas de cada candidato Eleeacute ainda mais expressivo que o AVS Dessa maneira o spoiler effect tambeacutem se torna nuloao passo que toda intenccedilatildeo de voto eacute precisamente representada neste sistema

                Assim como outros meacutetodos eleitorais este sofre igualmente dos males produzidos pelovoto taacutetico Sua principal desvantagem eacute discutida na seccedilatildeo abaixo

                263 Voto Uacutetil no SVS

                Da mesma maneira que no Approval Voting atraveacutes do bullet voting o SVS tambeacutempode ser convertido em uma eleiccedilatildeo sob o meacutetodo FPTP em um cenaacuterio com um grande

                28

                volume de eleitores maliciosos O voto uacutetil sob este sistema se manifesta pontuando-seapenas um candidato com uma nota positiva e todos os outros com as notas mais baixasda escala Se todos os eleitores se aproveitarem dessa abordagem natildeo existiraacute distinccedilatildeoefetiva entre uma eleiccedilatildeo sob SVS e FPTP Essencialmente cada eleitor estaacute votando emapenas um candidato Essa eacute a principal desvantagem do SVS e ela consegue eliminarsua principal vantagem dar ao eleitor um poder maior de expressatildeo

                27 BLOC VOTE

                O Bloc Vote eacute um meacutetodo utilizado para a eleiccedilatildeo de candidatos a cargos no governocom mais de uma vacacircncia Pode ser considerado um meio-termo entre o FPTP e oAVS pois os eleitores podem votar em mais de um candidato poreacutem satildeo limitados pelonuacutemero de vagas Em uma eleiccedilatildeo com duas vagas por exemplo cada eleitor selecionaraacutedois candidatos ou menos Sensatamente o candidato mais votado eacute eleito Ele possuialgumas utilizaccedilotildees em eleiccedilotildees locais em algumas partes da Inglaterra (Electoral ReformSociety 2017a)

                271 Exemplo

                Neste exemplo dois candidatos seratildeo eleitos logo cada eleitor votaraacute em no maacuteximodois candidatos A distribuiccedilatildeo de votos pode ser conferida na tabela 10 e o resultado dacontagem de votos na tabela 11 abaixo Os candidatos eleitos satildeo o C totalizando 78do maacuteximo de votos possiacuteveis para um candidato e o A com 43

                Tabela 10 ndash Exemplo BV

                Aprovaccedilotildees Ndeg de eleitoresAC 20AB 16BC 19BD 6CA 7CD 15DC 17

                Tabela 11 ndash Resultado BVCandidatos Total de votos

                A 43B 41C 78D 38

                29

                272 Voto Uacutetil no BV

                Neste sistema eacute possiacutevel que um eleitor evite votar em sua primeira opccedilatildeo quandoeste natildeo tem chances de vitoacuteria e se fazendo isto ele diminuiraacute as chances de algum outrocandidato de seu desgosto ganhar Poreacutem o sistema previne um outro tipo de voto uacutetilEm eleiccedilotildees com mais de uma vaga onde os eleitores soacute podem votar em um candidatose um eleitor sabe que sua primeira opccedilatildeo tambeacutem eacute a primeira opccedilatildeo da maior parteda populaccedilatildeo e portanto muito provavelmente seraacute um dos candidatos eleitos eacute possiacutevelque ele arrisque votar em uma segunda opccedilatildeo sua na esperanccedila de a longo prazo elegersuas duas principais opccedilotildees de voto Com os eleitores podendo votar no nuacutemero exato devagas disponiacuteveis esse tipo de pensamento taacutetico perde o sentido

                30

                3 O SIMULADOR

                Para este trabalho foi implementado um simulador eleitoral na forma de uma aplicaccedilatildeoweb para que a interaccedilatildeo do usuaacuterio fosse facilitada Veremos a seguir como se daacute suautilizaccedilatildeo de forma geral

                Figura 2 ndash Captura de tela 1

                Figura 3 ndash Captura de tela 2

                A primeira opccedilatildeo encontrada pelo usuaacuterio eacute a escolha de quais sistemas de votaccedilatildeo se-ratildeo simulados (Figura 2) Todos eles podem ser selecionados para rodar simultaneamentePoreacutem natildeo eacute permitido rodar uma simulaccedilatildeo do Bloc Vote para uma eleiccedilatildeo onde apenasum candidato eacute eleito aleacutem disso natildeo existe implementaccedilatildeo dos meacutetodos TRS e IRV para

                31

                eleiccedilotildees com mais de um candidato eleito jaacute que eles se comportariam exatamente comono FPTP

                A maioria das linguagens de programaccedilatildeo senatildeo todas possuem um gerador de nuacuteme-ros pseudoaleatoacuterios que fornece a possibilidade de definir uma seed para o gerador Estaseed funciona como um ponto de partida para a geraccedilatildeo dos nuacutemero e portanto todasimulaccedilatildeo que rodar com a mesma seed sempre teraacute os mesmos resultados Se nenhumvalor for fornecido pelo usuaacuterio o tempo atual do sistema eacute utilizado As opccedilotildees subse-quentes satildeo a escolha do nuacutemero de eleitores gerados e o nuacutemero de vagas (Figura 3) Senenhum valor for fornecido o nuacutemero de eleitores padratildeo utilizado eacute 1000 e o nuacutemero devagas igual a 1

                Figura 4 ndash Captura de tela 3

                Este simulador possui dois modos para a criaccedilatildeo dos rankings dos eleitores No modoManipulate (Figura 4) primeiramente se define o nuacutemero de candidatos atraveacutes do campode entrada ao lado do tiacutetulo Candidates ou alternativamente pode-se adicionar candida-tos um a um atraveacutes do sinal de mais na parte inferior da paacutegina Para cada candidatoeacute possiacutevel definir a porcentagem de seus eleitores que optaraacute pelo voto taacutetico e pelovoto de minoria Tambeacutem eacute possiacutevel alterar o nome dos candidatos se for do interessedo usuaacuterio

                32

                Figura 5 ndash Captura de tela 4

                Figura 6 ndash Captura de tela 5

                33

                Figura 7 ndash Captura de tela 6

                Apoacutes a criaccedilatildeo dos candidatos o usuaacuterio pode criar perfis de eleitores que definiratildeo demaneira exata como partes da populaccedilatildeo iraacute votar (Figura 5) Em cada perfil se defineo valor em porcentos da populaccedilatildeo votante que o adotaraacute e a nota de cada candidatoTambeacutem eacute possiacutevel nomear cada perfil livremente

                No modo Generate (Figura 6) eacute onde o gerador de nuacutemeros pseudoaleatoacuterios eacute usadoNesse modo ao inveacutes do usuaacuterio criar perfis de eleitores ele define qual seraacute a distribuiccedilatildeoadotada para a geraccedilatildeo de notas de cada candidato Essas distribuiccedilotildees seratildeo mais bemdetalhadas no Capiacutetulo 5 Da mesma maneira que no modo Manipulate nesse modotambeacutem eacute possiacutevel definir os valores para os dois tipos de voto uacutetil os votos taacuteticos eos votos de minoria No primeiro estatildeo incluiacutedas as estrateacutegias de mudanccedila de votoespeciacuteficas de cada sistema como o bullet voting no AVS e SVS ou quando a preferecircnciade um eleitor claramente natildeo possui chances de vitoacuteria e ele muda seu voto para um doscandidatos que esteja na lideranccedila o que ocorre no FPTP e TRS O voto de minoriase apresenta apenas no FPTP em eleiccedilotildees onde mais de um candidato eacute eleito Se apreferecircncia de um eleitor claramente lidera a eleiccedilatildeo por ser tambeacutem a preferecircncia damaior parte da populaccedilatildeo esse eleitor pode mudar o seu voto para uma segunda opccedilatildeona esperanccedila de eleger dois de seus candidatos favoritos

                Por fim em ambos os modos o usuaacuterio tem a opccedilatildeo de definir coalizotildees entre oscandidatos se o sistema TRS estiver habilitado pois as coalizotildees apenas se manifestamnesse sistema Essas coalizotildees alteraratildeo as notas dos candidatos dependendo dos outroscandidatos pertencentes a elas (Figura 7)

                A aplicaccedilatildeo pode ser encontrada na paacutegina httpelectionsimpythonanywherecom

                34

                4 CENAacuteRIOS PERTINENTES

                Para todos os cenaacuterios deste capiacutetulo seraacute usada a seed do simulador igual a 100 e apopulaccedilatildeo de eleitores igual a 1000 para que exista consistecircncia na anaacutelise e tambeacutem paraque possa haver replicaccedilatildeo dos resultados se necessaacuterio

                41 CENAacuteRIO 1 VOTO TAacuteTICO

                Neste exemplo teremos quatro candidatos Ana Beto Carla e Diego Ana e Betoseratildeo gerados a partir da distribuiccedilatildeo Neutral (Figura 47) Carla da distribuiccedilatildeo Disliked(Figura 51) e Diego da Hated (Figura 55) Para a simulaccedilatildeo com a seed 100 o melhorcandidato a ser eleito ou seja aquele que maximiza a meacutedia das notas dos eleitores eacute oBeto com uma meacutedia de 0073 Para cada sistema seratildeo comparados os resultados semvoto taacutetico aos com 20 de voto taacutetico a favor da Ana Abaixo se encontram osresultados para o sistema FPTP

                Figura 8 ndash FPTP - Cenaacuterio 1 sem voto taacutetico

                Figura 9 ndash TRS segundo turno - Cenaacuterio 1 sem voto taacutetico

                35

                Figura 10 ndash IRV primeiro turno - Cenaacuterio 1

                Figura 11 ndash IRV segundo turno - Cenaacuterio 1

                Figura 12 ndash IRV terceiro turno - Cenaacuterio 1

                36

                Figura 13 ndash AVS - Cenaacuterio 1 sem voto taacutetico

                Figura 14 ndash BC - Cenaacuterio 1 sem voto taacutetico

                Figura 15 ndash SVS - Cenaacuterio 1 sem voto taacutetico

                37

                Nesse cenaacuterio sem voto taacutetico o uacutenico sistema que natildeo elege o Beto eacute o AVS Todosos outros elegem o melhor candidato Ou seja apesar de Beto ter uma melhor meacutediadas notas dos eleitores existem mais eleitores que ranqueiam Ana com uma nota acimade 0 No entanto apenas 20 dos eleitores de Diego e Carla que preferem a Ana aoinveacutes do Beto satildeo o suficiente para fazer Beto natildeo ser eleito se eles decidirem abandonarsua primeira opccedilatildeo e votar na Ana Considerando a vantagem que os votos taacuteticosproporcionam agrave Ana esta eacute eleita em todos os sistemas menos o TRS e o IRV

                Figura 16 ndash FPTP - Cenaacuterio 1 - 20 de voto taacutetico na Ana

                Figura 17 ndash TRS segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                38

                Figura 18 ndash IRV primeiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                Figura 19 ndash IRV segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                Figura 20 ndash IRV terceiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                39

                Figura 21 ndash AVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                Figura 22 ndash BC - Cenaacuterio 1 20 de voto taacutetico na Ana

                Figura 23 ndash SVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                40

                Eacute claro que se os eleitores que preferem o Beto tambeacutem votassem de maneira estra-teacutegica a situaccedilatildeo se equilibraria e haveria o mesmo niacutevel de concorrecircncia entre os doiscandidatos que ocorre quando natildeo haacute voto taacutetico Poreacutem no Borda Count esse equiliacute-brio pode natildeo acontecer e as estrateacutegias de compromising e burying podem acabar saindopela culatra se uma porcentagem elevada dos eleitores as adotarem Abaixo encontram-seos resultados para esse sistema quando 100 dos eleitores de Carla e Diego se comportammaliciosamente

                Figura 24 ndash BC - Cenaacuterio 1 100 de voto taacutetico na Ana e Beto

                Por causa do uso demasiado da estrateacutegia burying Ana e Beto perdem muitos pontose isso abre espaccedilo para uma vitoacuteria da Carla No entanto para porcentagens menores que100 o Beto ainda eacute o vencedor

                Essas duas estrateacutegias tambeacutem foram implementadas nesse simulador para o sistemaIRV e eacute possiacutevel ver como ele eacute resistente a elas Para que seja possiacutevel mudar os resultadosde uma eleiccedilatildeo sob o IRV eacute necessaacuterio mudar a ordem de eliminaccedilatildeo dos candidatos paraque o seu candidato preferido acabe enfrentando um candidato mais fraco nas rodadasfinais Isso natildeo ocorre com compromising e burying No proacuteximo cenaacuterio seraacute analisadacomo eacute possiacutevel modificar os resultados de uma eleiccedilatildeo sob o IRV

                Esses resultados podem ser replicados acessando os linksSem votos taacuteticos lthttpelectionsimpythonanywherecomdirect_res1111110

                --[0021][22Ana2222Beto222022Carla2222Diego22]------100gt

                Com 20 de voto taacutetico lthttpelectionsimpythonanywherecomdirect_res1111110--[0021][22Ana222022Beto2222Carla2222Diego22]1-[02000]---100gt

                Com 100 de voto taacuteticona Ana e Beto lthttpelectionsimpythonanywherecomdirect_res0000100--[0021][22Ana222022Beto222022Carla2222Diego22]1-[101000]---100gt

                41

                42 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV

                Neste cenaacuterio teremos Ana Carla e Beto concorrendo e trecircs perfis distintos que apoiamcada candidato As distribuiccedilotildees de notas dos perfis se encontram na tabela abaixo

                Tabela 12 ndash Distribuiccedilatildeo de notas - Cenaacuterio 2

                Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                deeleitores

                1 10 5 0 422 0 10 5 303 5 0 10 28

                Com essas distribuiccedilotildees Carla eacute eliminada na primeira rodada e seus 28 de votossatildeo transferidos para a segunda opccedilatildeo de seus eleitores Ana que eacute eleita com 70 dosvotos e uma meacutedia de 56

                Figura 25 ndash IRV primeiro turno - Cenaacuterio 2

                Figura 26 ndash IRV segundo turno - Cenaacuterio 2

                42

                Cientes desse provaacutevel futuro cenaacuterio onde Ana eacute eleita uma pequena parte dos elei-tores de Beto estrategicamente o abandona e decide apoiar Carla na esperanccedila de leva-laao segundo turno contra Ana As novas distribuiccedilotildees de notas se encontram na tabelaabaixo com essa porccedilatildeo de eleitores representada pelo perfil 4

                Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2

                Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                deeleitores

                1 10 5 0 422 0 10 5 283 5 0 10 284 0 8 10 2

                Essa mudanccedila estrateacutegica de voto altera a ordem de eliminaccedilotildees do sistema com Betosendo o primeiro a ser eliminado Com isso seus votos satildeo naturalmente transferidos paraCarla que derrota Ana no segundo turno com 58 dos votos

                Figura 27 ndash IRV primeiro turno com voto taacutetico - Cenaacuterio 2

                Figura 28 ndash IRV segundo turno com voto taacutetico - Cenaacuterio 2

                43

                Percebendo que a eleiccedilatildeo de Beto natildeo era provaacutevel seus eleitores conseguiram aomenos impedir a eleiccedilatildeo do pior candidato para eles Mas para isso foi necessaacuterio queeles tivessem a informaccedilatildeo de como os outros eleitores votariam Uma aproximaccedilatildeo dessasinformaccedilotildees poderia ser obtida em um cenaacuterio real com poucos candidatos atraveacutes depesquisas eleitorais poreacutem se o nuacutemero de candidatos eacute significativo uma noccedilatildeo completadas distribuiccedilotildees dos rankings dos eleitores se torna muito menos viaacutevel e dificulta aformulaccedilatildeo de estrateacutegias para alterar a ordem em que os candidatos satildeo eliminados

                Esses resultados podem ser replicados acessando os linksSem voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana22

                22Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                Com voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana

                2222Beto2222Carla22]-----42Voter20Profile2001020520028Voter20Profile2010201020528Voter20Profile202520020102Voter20Profile20302082010100gt

                43 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE

                O interessante dos sistemas IRV e TRS eacute que os resultados do cenaacuterio anterior po-deriam ter sido obtidos ao inveacutes do voto taacutetico pela sua natildeo-monotonicidade Seriapossiacutevel que a Carla derrotasse a Ana no segundo turno atraveacutes do proacuteprio aumento depopularidade da Ana Assumindo que essa popularizaccedilatildeo ocorresse entre os candidatosdo perfil 2 onde 3 passasse a apoiar a Ana ao inveacutes do Beto as novas distribuiccedilotildeesseguiriam a tabela abaixo

                Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                deeleitores

                1 10 5 0 452 0 10 5 273 5 0 10 28

                Dessa maneira Beto agora com uma porcentagem dos eleitores menor do que a deCarla seraacute eliminado na primeira rodada e como seus eleitores tecircm a Carla como segundaopccedilatildeo ela receberaacute todos os seus votos e seraacute eleita na segunda rodada As rodadas doIRV podem ser vistas nas figuras 29 e 30

                44

                Figura 29 ndash IRV primeiro turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                Figura 30 ndash IRV segundo turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                Tabela 15 ndash Resultados do Cenaacuterio 3Candidato

                eleitoMeacutedia das

                notasAntes da

                popularizaccedilatildeode Ana

                Ana 56

                Apoacutespopularizaccedilatildeo

                de AnaCarla 415

                Os efeitos dessa caracteriacutestica se refletem na satisfaccedilatildeo meacutedia da populaccedilatildeo A Ana eacuteclaramente a melhor candidata e mesmo com o seu ganho de popularidade (ou devido aele) a Carla eacute eleita

                Esses resultados podem ser replicados acessando os linksAntes da popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecom

                direct_res0010000---[22Ana2222Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                45

                Apoacutes popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana2222Beto2222Carla22]-----45Voter20Profile2001020520027Voter20Profile2010201020528Voter20Profile20252002010100gt

                44 CENAacuteRIO 4 COALIZOtildeES

                O TRS por ser organizado em dois turnos separados normalmente a semanas dedistacircncia um do outro acaba abrindo brecha agrave mudanccedila de opiniatildeo por parte dos eleitorese o desenvolvimento de novas estrateacutegias por parte dos candidatos tais como a coalizatildeocom candidatos jaacute eliminados Com isso em mente nesse cenaacuterio teremos novamenteos quatro candidatos Ana Beto Carla e Diego Os trecircs primeiros seratildeo gerados dadistribuiccedilatildeo Neutral e Diego da distribuiccedilatildeo Disliked

                Figura 31 ndash TRS turno 1 - Cenaacuterio 4

                No TRS normal Ana Beto e Carla possuem com essas distribuiccedilotildees quantidades devotos muito proacuteximas com Beto e Carla indo para o segundo turno Carla estaacute 10 votosatraacutes de Beto e decide aproveitar o espaccedilo de tempo entre os dois turnos para tentaragregar mais votos Com isso Carla se aproxima de Diego e juntos formam uma coalizatildeoNo entanto com sua baixa popularidade Diego acaba ferindo a reputaccedilatildeo de Carla etorna o segundo turno muito mais faacutecil para Beto (Figura 33) Se Carla tivesse buscado osuporte de Ana por outro lado ela se veria vitoriosa no segundo turno e com uma amplavantagem sobre o Beto (Figura 34) Ou ateacute mesmo sem buscar uma coalizatildeo mesmosendo uma corrida apertada Carla teria naturalmente sido eleita (Figura 32)

                Esses resultados podem ser replicados acessando os linksSem coalizotildees lthttpelectionsimpythonanywherecomdirect_res0100000

                --[0002][22Ana222022Beto2222Carla2222Diego22]------100gt

                46

                Figura 32 ndash TRS turno 2 - Cenaacuterio 4

                Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4

                Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4

                47

                Coalizatildeo Carla e Diego lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2203Carla20Diego-100gt

                Coalizatildeo Carla e Ana lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2200Carla20Ana-100gt

                45 CENAacuteRIO 5 DILEMA DO PRISIONEIRO

                Neste cenaacuterio temos uma eleiccedilatildeo de uma vaga com trecircs candidatos concorrentes e trecircsperfis distintos de eleitores que seguiratildeo as seguintes distribuiccedilotildees

                Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5

                Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                deeleitores

                1 10 -10 5 362 -10 10 5 343 -10 -10 5 30

                Esse contexto nos remete ao notaacutevel dilema do prisioneiro Nele dois prisioneiroscuacutemplices satildeo interrogados individualmente sem poder se comunicar um com o outro ecada um enfrenta o dilema de delatar ou natildeo o seu parceiro Se os dois prisioneirosdecidem se manter calados sobre o crime ambos satildeo sentenciados a um ano de prisatildeo Seapenas um deles dedurar o outro o traidor sai livre enquanto seu parceiro eacute condenadoa trecircs anos Se ambos dedurarem um ao outro eles satildeo condenados juntos a dois anosde prisatildeo Esse dilema eacute uma ideia claacutessica presente no estudo da teoria dos jogos sendooriginalmente elaborada por Merrill Flood e Melvin Dresher em 1950 e mais tarde sendonomeada de dilema dos prisioneiros por Albert W Tucker (POUNDSTONE 1992)

                O que esse dilema nos mostra eacute a tentaccedilatildeo que o indiviacuteduo deteacutem se sua racionalizaccedilatildeoestiver voltada para seus proacuteprios interesses e somente eles em oposiccedilatildeo a pensar no bemdo grupo como um todo Neste cenaacuterio encontramos dois grupos de eleitores expressiva-mente opostos os perfis 1 e 2 Se qualquer uma das preferecircncias desses perfis fosse eleitaisso significaria uma alta rejeiccedilatildeo de maior parte da populaccedilatildeo No entanto eles possuema segunda opccedilatildeo em comum a Carla que por sua vez eacute a preferecircncia do terceiro perfilPortanto a eleiccedilatildeo da Carla seria logicamente o resultado oacutetimo

                Mesmo assim a Ana eacute eleita nos dois sistemas acima o que natildeo parece justo poispela tabela 16 eacute evidente que apenas 36 da populaccedilatildeo a aprova enquanto que os outros64 a reprovam ao maacuteximo O sistema IRV se comporta de maneira idecircntica ao TRS

                48

                Figura 35 ndash FPTP - Cenaacuterio 5

                Figura 36 ndash TRS segundo turno - Cenaacuterio 5

                nesta situaccedilatildeo Com esse resultado a meacutedia das notas eacute -28 No entanto os trecircs sistemasseguintes nos apresentam resultados diferentes

                Tabela 17 ndash Resultados do Cenaacuterio 5

                Sistema Candidatoeleito

                Meacutedia dasnotas

                FPTP Ana -28TRS Ana -28IRV Ana -28AVS Carla 50BC Carla 50SVS Carla 50

                49

                Figura 37 ndash AVS - Cenaacuterio 5

                Figura 38 ndash BC - Cenaacuterio 5

                Tanto o AVS quanto o Borda Count e o SVS satildeo sistemas que consideram todasas opiniotildees de cada eleitor ao mesmo tempo e por isso satildeo capazes de eleger o melhorcandidato nesta situaccedilatildeo diferentemente do TRS que natildeo absorve completamente todosentimento do eleitor por todos os candidatos e o IRV que apesar de ser bem expressivoquebra esse processo em inuacutemeras rodadas o que permite a perda de informaccedilatildeo ao longodelas

                Esses resultados podem ser replicados acessando o linklthttpelectionsimpythonanywherecomdirect_res1111110---[22Ana

                222022Beto222022Carla22]-----36Voter20Profile2001020-1020534Voter20Profile201-10201020530Voter20Profile202-1020-10205100gt

                50

                Figura 39 ndash SVS - Cenaacuterio 5

                46 CENAacuteRIO 6 VOTO DE MINORIA

                Neste cenaacuterio temos uma eleiccedilatildeo com quatro candidatos e duas vagas A Ana seraacutea preferecircncia de uma extensa parte da populaccedilatildeo (distribuiccedilatildeo Loved Figura 53) Betoe Carla seratildeo candidatos razoavelmente populares (distribuiccedilatildeo Neutral Figura 47) eDiego seraacute a preferecircncia de apenas um pequeno grupo especiacutefico e rejeitado pela maioria(distribuiccedilatildeo Disliked Figura 51) Eacute intuitivo esperar que os dois candidatos eleitos seratildeoa Ana e ou o Beto ou a Carla e isso eacute exatamente o que ocorre na figura 40 no sistemaFPTP sem voto de minoria

                Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria

                Eacute evidente a discrepacircncia da quantidade de votos da Ana para os outros candidatose apesar de Beto e Carla serem mais populares que Diego os trecircs natildeo se encontrammuito afastados Poreacutem se a pequena fraccedilatildeo de candidatos que possuem a Ana como

                51

                Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego

                preferecircncia e Diego como segunda opccedilatildeo optarem pelo voto de minoria a situaccedilatildeo mudacompletamente (Figura 41) Assim apesar de extensamente rejeitado Diego conquistaa segunda vaga e a meacutedia das notas despenca de 2929 para 0505 No entanto aindaexiste um cenaacuterio pior Se os outros grupos de eleitores pensarem da mesma forma eevitarem votar na Ana achando que sua eleiccedilatildeo jaacute estaacute assegurada apenas 80 de votode minoria para esses grupos jaacute eacute o suficiente para eliminaacute-la das eleiccedilotildees (Figura 42)Com a Ana eliminada a meacutedia das notas cai ainda mais para 0058

                Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego

                O sistema Bloc Vote eacute uma das soluccedilotildees para o voto de minoria Permitindo queos eleitores votem no mesmo nuacutemero de candidatos que de vagas a serem preenchidasnatildeo existe o iacutempeto a esse tipo de voto estrateacutegico O resultado desse sistema portantoretorna a meacutedia das notas a casa dos 29 (Figura 43) Os sistemas AVS Borda Count eSVS tambeacutem impedem a presenccedila do voto de minoria e atingem resultados semelhantes

                52

                Figura 43 ndash BV - Cenaacuterio 6

                Tabela 18 ndash Resultados do Cenaacuterio 6

                Sistema Candidatoseleitos

                Meacutedia dasnotas

                FPTP sem voto de minoriaAna eBeto 2929

                FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

                FPTP com 80 de voto de minoriaBeto eCarla 0058

                Bloc VoteAna eCarla 2913

                Esses resultados podem ser replicados acessando os links

                Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

                100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

                80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

                53

                5 COMO FUNCIONA O SIMULADOR

                O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

                51 CLASSE ELECTIONS

                Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

                bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

                Figura 44 ndash estrutura candidates

                bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

                bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

                Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

                Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

                54

                Figura 45 ndash estrutura voters

                Figura 46 ndash estrutura votes

                daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

                Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

                55

                Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

                Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

                na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

                56

                Figura 49 ndash PDF - Distribuiccedilatildeo Liked

                Figura 50 ndash CDF - Distribuiccedilatildeo Liked

                (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

                Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

                57

                Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

                Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

                candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

                Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

                58

                Figura 53 ndash PDF - Distribuiccedilatildeo Loved

                Figura 54 ndash CDF - Distribuiccedilatildeo Loved

                funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

                59

                Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                Meacutedia das Notas sumei

                sumvj nij

                etimes v

                Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                60

                Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                52 CLASSE FIRSTPASTTHEPOST

                Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                61

                Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                62

                53 CLASSE TWOROUNDSYSTEM

                A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                54 CLASSE INSTANTRUNOFFVOTING

                A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                63

                cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                55 CLASSE APPROVALVOTING

                Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                56 CLASSE BORDACOUNT

                Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                57 CLASSE SCOREVOTING

                De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                64

                58 CLASSE BLOCVOTE

                O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                59 TECNOLOGIAS UTILIZADAS

                A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                65

                6 CONCLUSAtildeO

                Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                66

                REFEREcircNCIAS

                AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                67

                APEcircNDICES

                APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                if(not len(selfvoter_profiles))

                for voter in range(selfN_VOTERS)

                candidates_rank = dict()

                for candidate in reversed(range(selfN_CANDIDATES))

                if(selfBIAS_VECTOR[candidate]==4)

                candidates_rank[candidate] = self_sortear(selfloved)

                elif(selfBIAS_VECTOR[candidate]==3)

                candidates_rank[candidate] = self_sortear(selfliked)

                elif(selfBIAS_VECTOR[candidate]==2)

                candidates_rank[candidate] = self_sortear(selfdisliked)

                elif(selfBIAS_VECTOR[candidate]==1)

                candidates_rank[candidate] = self_sortear(selfhated)

                elif(selfBIAS_VECTOR[candidate]==-1)

                candidates_rank[candidate] = self_sortear(selfpolarizer

                )

                elif(selfBIAS_VECTOR[candidate]==-2)

                candidates_rank[candidate] = self_sortear(self

                more_polarizer)

                else

                candidates_rank[candidate] = self_sortear(selfneutral)

                selfvotersappend(candidates_rank)

                else

                ranges = []

                ranks = []

                for prof in selfvoter_profiles

                rangesappend(int(prof[pop_percentage]))

                rank =

                for index score in enumerate(prof[scores])

                rank[index] = score

                ranksappend(rank)

                for index _range in enumerate(ranges)

                for _ in range(int(selfN_VOTERS(_range100)))

                selfvotersappend(ranks[index])

                68

                APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                for i in range(selfN_CANDIDATES)

                selfcandidates[i] = 0

                selfvotes[i] = set()

                APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                for candidate in range(selfN_CANDIDATES)

                rating_sum = 0

                for voter in selfvoters

                rating_sum += voter[candidate]

                selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                APEcircNDICE D ndash MEacuteTODO GET_MEAN

                Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                if len(winners) gt 1 or selfN_CANDIDATES gt 10

                return selfcalculate_mean(winners)

                else

                chose_best = True if winners[0] == selfbest_candidate else

                False

                return selfstats[rsquomeansrsquo][winners[0]] chose_best

                69

                APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                rating_sum = 0

                for voter in selfvoters

                for candidate in winners

                rating_sum += voter[candidate]

                return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                for i in range(1 selfN_VACANCIES + 2)

                selfleading_candidatesappend(selfsorted_candidates[-i][self

                CANDIDATE_INDEX])

                APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                for leader in selfelecrounds[-1]

                selfleading_candidatesappend(leader[0])

                70

                APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                self_account_for_coalitions()

                for voter in selfvoters

                selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                (1)))

                temp = []

                for voter in selfsorted_voters

                new_dict = defaultdict(list)

                for k in voter

                new_dict[k[1]]append(k[0])

                tempappend(new_dict)

                selfsorted_voters = []

                for voter_index current_voter in enumerate(temp)

                new_voter = []

                for rating candidate_indexes in current_voteritems()

                if len(current_voter[rating]) gt 1

                shuffle(current_voter[rating])

                for e in candidate_indexes

                new_voterappend((e rating))

                else

                new_voterappend((candidate_indexes[0] rating))

                selfsorted_votersappend(new_voter)

                selfcandidates[new_voter[-1][0]] += 1

                selfvotes[new_voter[-1][0]]add(voter_index)

                71

                APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                for candidate in selfvotes_copy

                if candidate not in selfelecleading_candidates

                for voter_index in selfvotes_copy[candidate]

                for index _candidate in enumerate(reversed(selfelec

                sorted_voters[voter_index]))

                if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                leading_candidates

                if randomrandom() lt selfelec

                tactical_vote_percentages[_candidate[selfelec

                CANDIDATE_INDEX]]

                selfrankings_changed[voter_index] = copy

                deepcopy(selfelecsorted_voters[voter_index])

                selfrankings_changed[voter_index][-(index + 1)]

                selfrankings_changed[voter_index][-1] = self

                rankings_changed[voter_index][-1] self

                rankings_changed[voter_index][-(index + 1)]

                selfcandidates[candidate] -= 1

                selfcandidates[_candidate[selfelec

                CANDIDATE_INDEX]] += 1

                selfvotes[candidate]remove(voter_index)

                selfvotes[_candidate[selfelecCANDIDATE_INDEX

                ]]add(voter_index)

                break

                break

                72

                APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                half_vacancies = mathfloor(selfelecN_VACANCIES2)

                for candidate in selfelecleading_candidates

                if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                continue

                for voter_index in selfvotes_copy[candidate]

                if voter_index in selfrankings_changed

                ranking = selfrankings_changed[voter_index]

                else

                ranking = copydeepcopy(selfelecsorted_voters[voter_index

                ])

                for index _candidate in enumerate(reversed(ranking))

                if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                leading_candidates or (_candidate[selfelec

                CANDIDATE_INDEX] in selfelecleading_candidates and

                selfelecleading_candidatesindex(_candidate[selfelec

                CANDIDATE_INDEX]) gt= half_vacancies)

                if _candidate[selfelecCANDIDATE_RANK] gt= 0

                if randomrandom() lt selfelec

                minority_vote_percentages[_candidate[selfelec

                CANDIDATE_INDEX]]

                selfcandidates[candidate] -= 1

                selfcandidates[_candidate[selfelec

                CANDIDATE_INDEX]] += 1

                break

                break

                break

                73

                APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                self_account_for_coalitions()

                for candidate in selfvotes

                if candidate = selfwinner and candidate = selfsecond_place

                for voter_index in selfvotes[candidate]

                if voter_index in selfrankings_changed

                ranking = selfrankings_changed[voter_index]

                else

                ranking = copydeepcopy(selfelecsorted_voters[

                voter_index])

                for index2 candidate in enumerate(reversed(ranking))

                if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                selfcandidates[selfwinner] += 1

                selfvotes[selfwinner]add(voter_index)

                break

                elif candidate[selfelecCANDIDATE_INDEX] == self

                second_place

                selfcandidates[selfsecond_place] += 1

                selfvotes[selfsecond_place]add(voter_index)

                break

                selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                winners = []

                vacancies = selfelecN_VACANCIES

                for candidate in reversed(selfsorted_candidates)

                if vacancies == 0

                break

                winnersappend(candidate[0])

                vacancies -= 1

                mean chose_best = selfelecget_mean(winners = winners)

                74

                APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                for voter_index voter in enumerate(selfelecsorted_voters)

                voter_dict = dict()

                og_voter_dict = dict()

                for tup in voter

                voter_dict[tup[0]] = tup[1]

                og_voter_dict[tup[0]] = tup[1]

                for coalition in selfeleccoalitions

                for candidate in coalition

                add_to_score = 0

                for candidate2 in coalition

                if candidate == candidate2

                continue

                half = og_voter_dict[candidate2[rsquovaluersquo]]2

                if half lt 0

                add_to_score += mathceil(half)

                else

                add_to_score += mathfloor(half)

                if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                voter_dict[candidate[rsquovaluersquo]] = 10

                elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                voter_dict[candidate[rsquovaluersquo]] = -10

                else

                voter_dict[candidate[rsquovaluersquo]] += add_to_score

                selfrankings_changed[voter_index] = []

                for candidate in voter_dict

                selfrankings_changed[voter_index]append((candidate voter_dict[

                candidate]))

                selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                voter_index] key=lambda x x[1])

                75

                APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                selfelecroundsappend(selfsorted_candidates[_round])

                if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                N_VACANCIES - 1)

                return 2

                elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                N_VOTERS gt 05)

                return 1

                else

                selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                CANDIDATE_INDEX])

                for voter_index in selfvotes[selfsorted_candidates[_round][self

                elecCANDIDATE_INDEX]]

                if voter_index in selfrankings_changed

                for candidate in reversed(selfrankings_changed[voter_index

                ])

                if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                excluded

                selfcandidates[candidate[selfelecCANDIDATE_INDEX

                ]] += 1

                selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                add(voter_index)

                break

                else

                continue

                else

                for candidate in reversed(selfelecsorted_voters[

                voter_index])

                if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                excluded

                selfcandidates[candidate[selfelecCANDIDATE_INDEX

                ]] += 1

                selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                add(voter_index)

                break

                else

                continue

                selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                return 0

                76

                APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                for index in range(selfelecN_CANDIDATES)

                selfcandidates[index] = 0

                for voter in selfelecsorted_voters

                for candidate in reversed(voter)

                if candidate[selfelecCANDIDATE_SCORE] gt 0

                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                else

                break

                APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                for index in range(selfelecN_CANDIDATES)

                selfcandidates[index] = 0

                for voter in selfelecsorted_voters

                if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                elecCANDIDATE_INDEX]]

                selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                else

                for candidate in reversed(voter)

                if candidate[selfelecCANDIDATE_SCORE] gt 0

                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                else

                break

                77

                APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                pos = set()

                for index perc in enumerate(selfelectactical_vote_percentages)

                if perc gt 0

                posadd(index)

                for candidate in selfeleccandidates

                if candidate not in selfleading_candidates

                for voter_index in selfvotes[candidate]

                raised = None

                for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                ])

                if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                leading_candidates

                if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                if randomrandom() lt selfelectactical_vote_percentages[

                candidate_tuple[selfelecCANDIDATE_INDEX]]

                ranking = [None]selfelecN_CANDIDATES

                ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                selfelecvoters[voter_index][candidate_tuple[selfelec

                CANDIDATE_INDEX]])

                raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                break

                break

                break

                if raised = None

                for _candidate in selfleading_candidates

                if _candidate = ranking[-1][0]

                ranking[0] = (_candidate selfelecvoters[voter_index][

                _candidate])

                buried = _candidate

                break

                i = 1

                for candidate_tuple in selfelecsorted_voters[voter_index]

                if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                buried]

                continue

                else

                ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                selfelecvoters[voter_index][candidate_tuple[selfelec

                CANDIDATE_INDEX]])

                i += 1

                selfrankings_changed[voter_index] = ranking

                78

                APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                for voter_index in selfvotes[candidate]

                if randomrandom() lt selfelectactical_vote_percentages[candidate

                ]

                for _candidate in selfleading_candidates

                if _candidate = candidate

                ranking = [None]selfelecN_CANDIDATES

                ranking[0] = (_candidate selfelecvoters[voter_index][

                _candidate])

                buried = _candidate

                break

                i = 1

                for candidate_tuple in selfelecsorted_voters[voter_index]

                if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                continue

                else

                ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                selfelecvoters[voter_index][candidate_tuple[selfelec

                CANDIDATE_INDEX]])

                i += 1

                selfrankings_changed[voter_index] = ranking

                79

                APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                for index in range(selfelecN_CANDIDATES)

                selfcandidates[index] = 0

                for voter_index voter in enumerate(selfelecsorted_voters)

                score = 0

                if voter_index in selfrankings_changed

                for candidate in selfrankings_changed[voter_index]

                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                score += 1

                else

                for candidate in voter

                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                score += 1

                APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                for voter_index voter in enumerate(selfelecsorted_voters)

                if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                elecCANDIDATE_INDEX]]

                selfrankings_changed[voter_index] = copydeepcopy(selfelec

                sorted_voters[voter_index])

                for candidate_index candidate in enumerate(reversed(voter))

                if candidate_index == 0

                selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                else

                selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                80

                APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                for index in range(selfelecN_CANDIDATES)

                selfcandidates[index] = 0

                for voter_index voter in enumerate(selfelecsorted_voters)

                if voter_index in selfrankings_changed

                for candidate in selfrankings_changed[voter_index]

                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                selfelecCANDIDATE_RANK]

                else

                for candidate in voter

                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                selfelecCANDIDATE_RANK]

                APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                for index in range(selfelecN_CANDIDATES)

                selfcandidates[index] = 0

                for voter in selfelecsorted_voters

                votes = selfelecN_VACANCIES

                for candidate in reversed(voter)

                if votes == 0

                break

                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                votes -= 1

                • Folha de aprovaccedilatildeo
                • Agradecimentos
                • Epiacutegrafe
                • Resumo
                • Abstract
                • Lista de ilustraccedilotildees
                • Lista de Coacutedigos
                • Lista de tabelas
                • Lista de abreviaturas e siglas
                • Sumaacuterio
                • INTRODUCcedilAtildeO
                  • MOTIVACcedilAtildeO E OBJETIVO
                  • MEacuteTODO
                  • ESTRUTURA
                    • SISTEMAS ELEITORAIS
                      • FISRT PAST THE POST
                        • Exemplo
                        • Vantagens e Desvantagens do FPTP
                        • Voto Uacutetil no FPTP
                          • TWO-ROUND SYSTEM
                            • Exemplo
                            • Vantagens e Desvantagens do TRS
                            • Voto Uacutetil no TRS
                              • INSTANT-RUNOFF VOTING
                                • Exemplo
                                • Vantagens e Desvantagens do IRV
                                • Voto Uacutetil no IRV
                                  • APPROVAL VOTING SYSTEM
                                    • Exemplo
                                    • Vantagens e Desvantagens do AVS
                                    • Voto Uacutetil no AVS
                                      • THE BORDA COUNT
                                        • Exemplo
                                        • Vantagens e Desvantagens do BC
                                        • Voto Uacutetil no BC
                                          • SCORE VOTING SYSTEM
                                            • Exemplo
                                            • Vantagens e Desvantagens do SVS
                                            • Voto Uacutetil no SVS
                                              • BLOC VOTE
                                                • Exemplo
                                                • Voto Uacutetil no BV
                                                    • O SIMULADOR
                                                    • CENAacuteRIOS PERTINENTES
                                                      • CENAacuteRIO 1 VOTO TAacuteTICO
                                                      • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                      • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                      • CENAacuteRIO 4 COALIZOtildeES
                                                      • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                      • CENAacuteRIO 6 VOTO DE MINORIA
                                                        • COMO FUNCIONA O SIMULADOR
                                                          • CLASSE Elections
                                                          • CLASSE FirstPastThePost
                                                          • CLASSE TwoRoundSystem
                                                          • CLASSE InstantRunoffVoting
                                                          • CLASSE ApprovalVoting
                                                          • CLASSE BordaCount
                                                          • CLASSE ScoreVoting
                                                          • CLASSE BlocVote
                                                          • TECNOLOGIAS UTILIZADAS
                                                            • CONCLUSAtildeO
                                                            • Referecircncias
                                                            • Meacutetodo create_voters
                                                            • Meacutetodo create_candidates
                                                            • Meacutetodo calculate_means
                                                            • Meacutetodo get_mean
                                                            • Meacutetodo calculate_mean
                                                            • Meacutetodo set_leading_candidates
                                                            • Meacutetodo irv_set_leading_candidates
                                                            • Meacutetodo sort_ranks
                                                            • Meacutetodo fptp_count_tactical_votes
                                                            • Meacutetodo fptp_count_minority_votes
                                                            • Meacutetodo trs_second_round
                                                            • Meacutetodo trs_account_for_coalitions
                                                            • Meacutetodo irv_count_votes
                                                            • Meacutetodo avs_count_votes
                                                            • Meacutetodo avs_count_votes_with_tactical
                                                            • Meacutetodo irv_apply_tactical_votes
                                                            • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                            • Meacutetodo bc_sum_candidates_scores
                                                            • Meacutetodo svs_apply_tactical_votes
                                                            • Meacutetodo svs_sum_candidates_scores
                                                            • Meacutetodo bv_count_votes

                  LISTA DE COacuteDIGOS

                  A1 Meacutetodo create_voters 67B1 Meacutetodo create_candidates 68C1 Meacutetodo calculate_means 68D1 Meacutetodo get_mean 68E1 Meacutetodo calculate_mean 69F1 Meacutetodo set_leading_candidates 69G1 Meacutetodo irv_set_leading_candidates 69H1 Meacutetodo sort_ranks 70I1 Meacutetodo fptp_count_tactical_votes 71J1 Meacutetodo fptp_count_minority_votes 72K1 Meacutetodo trs_second_round 73L1 Meacutetodo trs_account_for_coalitions 74M1 Meacutetodo irv_count_votes 75N1 Meacutetodo avs_count_votes 76O1 Meacutetodo avs_count_votes_with_tactical 76P1 Meacutetodo irv_apply_tactical_votes 77Q1 Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo) 78R1 Meacutetodo bc_sum_candidates_scores 79S1 Meacutetodo svs_apply_tactical_votes 79T1 Meacutetodo svs_sum_candidates_scores 80U1 Meacutetodo bv_count_votes 80

                  LISTA DE TABELAS

                  Tabela 1 ndash Exemplo FPTP 18Tabela 2 ndash 2deg turno do TRS 20Tabela 3 ndash Exemplo IRV 22Tabela 4 ndash Desenvolvimento do IRV 22Tabela 5 ndash Exemplo AVS 24Tabela 6 ndash Resultado AVS 24Tabela 7 ndash Resultado BC 26Tabela 8 ndash Exemplo SVS 27Tabela 9 ndash Resultado SVS 27Tabela 10 ndash Exemplo BV 28Tabela 11 ndash Resultado BV 28Tabela 12 ndash Distribuiccedilatildeo de notas - Cenaacuterio 2 41Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2 42Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3 43Tabela 15 ndash Resultados do Cenaacuterio 3 44Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5 47Tabela 17 ndash Resultados do Cenaacuterio 5 48Tabela 18 ndash Resultados do Cenaacuterio 6 52

                  LISTA DE ABREVIATURAS E SIGLAS

                  FPTP First Past The Post

                  TRS Two-Round System

                  IRV Instant Runoff Voting

                  AVS Approval Voting System

                  BC Borda Count

                  SVS Score Voting System

                  BV Bloc Vote

                  SUMAacuteRIO

                  1 INTRODUCcedilAtildeO 1511 MOTIVACcedilAtildeO E OBJETIVO 1512 MEacuteTODO 1513 ESTRUTURA 15

                  2 SISTEMAS ELEITORAIS 1721 FISRT PAST THE POST 17211 Exemplo 18212 Vantagens e Desvantagens do FPTP 18213 Voto Uacutetil no FPTP 1922 TWO-ROUND SYSTEM 19221 Exemplo 20222 Vantagens e Desvantagens do TRS 20223 Voto Uacutetil no TRS 2123 INSTANT-RUNOFF VOTING 21231 Exemplo 22232 Vantagens e Desvantagens do IRV 22233 Voto Uacutetil no IRV 2324 APPROVAL VOTING SYSTEM 24241 Exemplo 24242 Vantagens e Desvantagens do AVS 24243 Voto Uacutetil no AVS 2525 THE BORDA COUNT 25251 Exemplo 25252 Vantagens e Desvantagens do BC 26253 Voto Uacutetil no BC 2626 SCORE VOTING SYSTEM 26261 Exemplo 27262 Vantagens e Desvantagens do SVS 27263 Voto Uacutetil no SVS 2727 BLOC VOTE 28271 Exemplo 28272 Voto Uacutetil no BV 29

                  3 O SIMULADOR 30

                  4 CENAacuteRIOS PERTINENTES 3441 CENAacuteRIO 1 VOTO TAacuteTICO 3442 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV 4143 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE 4344 CENAacuteRIO 4 COALIZOtildeES 4545 CENAacuteRIO 5 DILEMA DO PRISIONEIRO 4746 CENAacuteRIO 6 VOTO DE MINORIA 50

                  5 COMO FUNCIONA O SIMULADOR 5351 CLASSE Elections 5352 CLASSE FirstPastThePost 6053 CLASSE TwoRoundSystem 6254 CLASSE InstantRunoffVoting 6255 CLASSE ApprovalVoting 6356 CLASSE BordaCount 6357 CLASSE ScoreVoting 6358 CLASSE BlocVote 6459 TECNOLOGIAS UTILIZADAS 64

                  6 CONCLUSAtildeO 65

                  REFEREcircNCIAS 66

                  APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS 67

                  APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES 68

                  APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS 68

                  APEcircNDICE D ndash MEacuteTODO GET_MEAN 68

                  APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN 69

                  APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES 69

                  APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES 69

                  APEcircNDICE H ndash MEacuteTODO SORT_RANKS 70

                  APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES 71

                  APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES 72

                  APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND 73

                  APEcircNDICE L ndash MEacuteTODOTRS_ACCOUNT_FOR_COALITIONS 74

                  APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES 75

                  APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES 76

                  APEcircNDICE O ndash MEacuteTODOAVS_COUNT_VOTES_WITH_TACTICAL 76

                  APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES 77

                  APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES (CON-TINUACcedilAtildeO) 78

                  APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES 79

                  APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES 79

                  APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES 80

                  APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES 80

                  15

                  1 INTRODUCcedilAtildeO

                  Em toda eleiccedilatildeo existe pelo menos um grupo de indiviacuteduos que sai completamentedesfavorecido e insatisfeito com o resultado O contentamento completo de uma populaccedilatildeoeacute certamente improvaacutevel e muitas vezes impossiacutevel considerando a gama de candidatosque se dispotildee a concorrer Em todo caso o miacutenimo que pode ser feito eacute escolher demaneira eficiente o melhor candidato ao cargo dentre as opccedilotildees disponiacuteveis Diante dissoeacute necessaacuterio avaliar como essa escolha eacute feita e quais meacutetodos satildeo capazes de tornaacute-larealidade

                  11 MOTIVACcedilAtildeO E OBJETIVO

                  Em conformidade com o extenso nuacutemero de sistemas eleitorais pelo mundo este tra-balho tem como objetivo testar uma porccedilatildeo desses sistemas sob a simulaccedilatildeo de diferentescenaacuterios especiacuteficos a fim de determinar quais deles podem ser considerados como os maisjustos perante a taxa de satisfaccedilatildeo meacutedia da populaccedilatildeo

                  12 MEacuteTODO

                  Para que essa anaacutelise seja possiacutevel foi desenvolvido um programa que permite a criaccedilatildeoe configuraccedilatildeo de diferentes cenaacuterios onde os sistemas eleitorais seratildeo simulados Nele eacutepossiacutevel definir o nuacutemero total de eleitores e candidatos como esses eleitores iratildeo votar eo niacutevel de popularidade de cada candidato Aleacutem disso eacute possiacutevel formar coalizotildees entreos candidatos e escolher a porcentagem dos eleitores que optaratildeo pelo voto uacutetil Dessamaneira seraacute possiacutevel elaborar cenaacuterios que buscam expor os pontos fortes e fracos decada sistema

                  13 ESTRUTURA

                  Este trabalho eacute relatado ao longo de seis capiacutetulos No Capiacutetulo 2 seratildeo apresentados ossistemas eleitorais implementados no simulador suas vantagens e desvantagens conhecidase outras caracteriacutesticas especiacuteficas de cada um A intenccedilatildeo do capiacutetulo eacute tornar o textomais autocontido trazendo conceitos jaacute estudados que ajudaratildeo na melhor compreensatildeodos capiacutetulos seguintes por isso grande parte de sua composiccedilatildeo eacute oriunda de diferentesfontes consultadas

                  O Capiacutetulo 3 eacute uma apresentaccedilatildeo das funcionalidades que o simulador possui Seratildeoexplicados todos os campos de entrada e os dois modos distintos nos quais o programaopera

                  16

                  No Capiacutetulo 4 os sistemas seratildeo colocados em teste Todos seratildeo simulados em cenaacuteriosespeciacuteficos a fim de fazer sobressair aqueles com as maiores taxas de satisfaccedilatildeo meacutedia

                  A estrutura e implementaccedilatildeo do simulador seratildeo abordadas em detalhes no Capiacutetulo5 assim como uma breve descriccedilatildeo da stack utilizada Todos os meacutetodos relevantes aofuncionamento das simulaccedilotildees seratildeo explicados passo a passo

                  No Capiacutetulo 6 seratildeo apresentadas as conclusotildees referentes agrave anaacutelise dos resultadosobtidos no Capiacutetulo 4 e as consideraccedilotildees finais do projeto como um todo

                  17

                  2 SISTEMAS ELEITORAIS

                  Atualmente mais e mais paiacuteses estatildeo adotando sistemas democraacuteticos de governoCerca de 6 em 10 governos no mundo satildeo democracias (Pew Research Center 2017) o quepode ser observado na Figura 1 abaixo Em um sistema democraacutetico a populaccedilatildeo escolheseus liacutederes atraveacutes de seu sistema eleitoral Existem diversos sistemas eleitorais em usono mundo muitos dos quais satildeo usados em conjunto para eleger um uacutenico candidato Emvaacuterios paiacuteses mais de um sistema eleitoral pode ser utilizado tambeacutem em diferentes niacuteveisde governo tanto presidencial quanto estadual ou municipal Natildeo apenas imersos nomeio poliacutetico eles tambeacutem podem ser usados em escopos menores como em esportes oucompeticcedilotildees artiacutesticas poreacutem sempre com a finalidade de alocar um ou mais indiviacuteduosa determinado cargo ou tiacutetulo

                  Figura 1 ndash de paiacuteses de cada tipo de regime 1946-2016

                  Fonte Center of Systemic Peacersquos Polity IV Project

                  Os proacuteximos trecircs toacutepicos discutidos neste capiacutetulo referentes aos meacutetodos First Pastthe Post Two-Round System e Instant Runoff Voting possuem seus conceitos e infor-maccedilotildees relevantes com exceccedilatildeo dos exemplos traduzidos livremente do livro Behind theBallot Box A Citizenrsquos Guide to Voting Systems (AMY 2000)

                  21 FISRT PAST THE POST

                  O meacutetodo First Past the Post tambeacutem conhecido como Plurality Voting ou WinnerTakes All eacute o meacutetodo mais simples e direto e provavelmente o primeiro meacutetodo que sepensa quando se fala de eleiccedilotildees Os eleitores escolhem apenas um candidato e apoacutes a

                  18

                  contagem dos votos o candidato com o maior nuacutemero de votos eacute eleito O vencedor natildeonecessita da aprovaccedilatildeo de mais de 50 dos eleitores ele apenas precisa de uma pluralidadedos votos ou seja apenas possuir mais votos que os outros candidatos

                  Esse sistema eacute utilizado em escala nos Estados Unidos para a maior parte das eleiccedilotildeesvoltadas a eleger apenas um candidato como prefeitos e governadores aleacutem de ser usadana disputa presidencial Dentre outros paiacuteses que empregam o sistema em suas corridaspresidenciais estatildeo listados o Meacutexico as Filipinas a Coreia do Sul e a Venezuela

                  211 Exemplo

                  Tabela 1 ndash Exemplo FPTP

                  Candidatos VotosA 36B 25C 22D 17

                  Neste exemplo o candidato A possui uma pluralidade dos votos com 36 e ele eacute ocandidato eleito mesmo natildeo tendo uma maioria

                  212 Vantagens e Desvantagens do FPTP

                  A vantagem do FPTP eacute a sua simplicidade Natildeo eacute difiacutecil para um eleitor comumcompreender o seu funcionamento eles apenas precisam se decidir por um candidato Eletambeacutem eacute muito simples e direto na sua contagem e seleccedilatildeo do vencedor

                  Esse meacutetodo tambeacutem tende a criar listas de candidatos concorrentes mais curtasCandidatos independentes ou de partidos menores frequentemente acabam se sentindodesencorajados a concorrer devido agraves suas baixas chances de vitoacuteria Isso normalmentefornece aos eleitores uma faacutecil decisatildeo entre um ou dois candidatos dos maiores partidosao mesmo tempo poreacutem limitando suas opccedilotildees

                  No entanto sua essecircncia eacute sua principal desvantagem a pluralidade O fato do can-didato eleito natildeo necessitar de uma maioridade dos votos da populaccedilatildeo parece violaros princiacutepios baacutesicos da democracia Democracia eacute em sua origem o poder(kratos) nopovo(demos) poreacutem na pluralidade o poder de eleger um candidato pode residir emapenas uma fraccedilatildeo relativamente pequena do povo Em um cenaacuterio hipoteacutetico comapenas trecircs candidatos um deles apenas poderia necessitar de natildeo mais do que 34 dosvotos para ser eleito o que significa que no pior dos casos 66 da populaccedilatildeo rejeitao candidato eleito O cenaacuterio soacute piora com mais e mais candidatos concorrendo Paraquatro candidatos satildeo necessaacuterios 26 dos votos no pior dos casos para cinco satildeo 21 eassim por diante

                  19

                  213 Voto Uacutetil no FPTP

                  No FPTP tambeacutem existe a possibilidade de os eleitores evitarem votar em sua prefe-recircncia verdadeira No caso de sua preferecircncia natildeo aparentar ter boas chances de vitoacuteriamuitas vezes opta-se por uma segunda opccedilatildeo que esteja mais bem colocada nas eleiccedilotildeesO motivo disso eacute que nessas situaccedilotildees votar em sua preferecircncia pode parecer um des-perdiacutecio do seu voto e no pior dos cenaacuterios optar por natildeo transferir seu voto para umasegunda opccedilatildeo pode acabar resultando na eleiccedilatildeo de um candidato de seu desgosto As-sim votar de maneira verdadeira muitas vezes pode acabar prejudicando o eleitor que sevecirc forccedilado a abandonar seus interesses poliacuteticos mais imediatos e escolher o menor entredois(ou mais) males Os candidatos de partidos menores satildeo os que mais sofrem com essetipo de voto estrateacutegico por natildeo conseguirem agregar as maiores quantidades de votos

                  Entretanto ao mesmo tempo que partidos maiores roubam votos de partidos meno-res com os votos taacuteticos partidos menores tambeacutem tem a oportunidade de ganhar algunsvotos com o denominado spoiler effect Ao entrarem na eleiccedilatildeo candidatos de partidosmenores podem adquirir votos de candidatos mais populares que possuem inclinaccedilatildeo po-liacutetica semelhante Logo eacute possiacutevel que haja certo equiliacutebrio ao se contrapor as mudanccedilasde voto devido aos votos uacuteteis agraves mudanccedilas oriundas do spoiler effect

                  Poreacutem o spoiler effect natildeo necessariamente ocorre apenas entre partidos maiores emenores mas pode prejudicar candidatos de popularidades proacuteximas Por exemplo entretrecircs candidatos A B e C onde A representa determinada posiccedilatildeo no espectro poliacuteticoenquanto B e C possuem posiccedilotildees parecidas o que pode acontecer eacute B e C se prejudicaremmutuamente jaacute que ambos dividem os eleitores de um mesmo espectro poliacutetico Se esseespectro tem a maioria com 60 por exemplo com B e C compartilhando cada um 30dos votos o candidato A sairia vencedor com 40 mesmo que todos os eleitores de Bprefiram C e todos os eleitores de C prefiram B Esse exemplo demonstra claramente oproblema com os sistemas de pluralidade

                  22 TWO-ROUND SYSTEM

                  Uma das primeiras tentativas de lidar com a desvantagem dos sistemas por pluralidadeo Two-round System eacute usado desde o seacuteculo XIX no ocidente e atualmente ainda eacute utilizadoem corridas presidecircncias de paiacuteses como o Brasil Bulgaacuteria Chile Colocircmbia FinlacircndiaPolocircnia Portugal Ruacutessia e em inuacutemeras eleiccedilotildees locais nos Estados Unidos

                  O principal objetivo do TRS eacute garantir que o vencedor tenha conseguido uma maioriados votos Para isso as eleiccedilotildees satildeo estruturadas em duas rodadas de votaccedilatildeo Na primeirarodada os eleitores se dirigem agraves urnas e votam no candidato de sua preferecircncia Apoacutesa contagem se a quantidade de votos do candidato mais votado superar a proporccedilatildeo de50 natildeo haacute a necessidade de uma segunda rodada e este candidato eacute eleito No entantose este natildeo for o caso haveraacute uma segunda rodada com apenas os dois candidatos mais

                  20

                  votados Nesta rodada os eleitores retornam as urnas para escolher uma das duas opccedilotildeessendo eleito o candidato mais votado agora definitivamente com uma maioria dos votos

                  221 Exemplo

                  Utilizando a mesma distribuiccedilatildeo de votos descrita na tabela 1 Neste caso como ocandidato A natildeo possui uma maioria dos votos ele e o candidato B iratildeo concorrer em umsegundo turno Digamos que as distribuiccedilotildees dos votos dos eleitores dos candidatos C eD em relaccedilatildeo aos candidatos A e B satildeo as seguintes

                  Tabela 2 ndash 2deg turno do TRS

                  Candidatos Votos dos eleitoresde C

                  Votos dos eleitoresde D

                  Votos do 1degturno

                  A 7 5 36B 15 12 25

                  O candidato B agora eacute eleito com uma maioria dos votos 52 contra 48 do candidatoA

                  222 Vantagens e Desvantagens do TRS

                  Por ser parecido com o FPTP esse sistema tambeacutem eacute de faacutecil compreensatildeo do eleitorcomum poreacutem a maior vantagem do TRS eacute a garantia de que o candidato vencedor teraacute oapoio da maioria dos eleitores no segundo turno eliminando a pluralidade Argumenta-seque isso daacute maior legitimidade poliacutetica ao mandato do candidato eleito

                  O TRS tende a abrigar uma lista maior de candidatos sendo mais convidativo acandidatos de partidos menores mesmo que suas chances natildeo sejam maiores quandocomparadas agraves eleiccedilotildees sob o FPTP Mesmo assim essa listagem mais abrangente eacute umavantagem do sistema pois daacute aos eleitores uma variedade maior de opccedilotildees de voto

                  Em relaccedilatildeo agraves suas desvantagens o TRS possui duas principais A primeira satildeo oscustos elevados do sistema decorrentes da necessidade da organizaccedilatildeo de um segundoturno de votaccedilotildees A segunda eacute o aumento no iacutendice de ausecircncias dos eleitores agraves urnasEssa ampliaccedilatildeo no natildeo comparecimento dos eleitores se daacute tambeacutem devido ao segundoturno por pura fatiga eleitoral bem como consequecircncia da desistecircncia de eleitores queapoiam candidatos que jaacute foram eliminados

                  Outro ponto negativo do TRS eacute a sua natildeo-monotonicidade Isso significa que umcandidato pode ser prejudicado com um aumento em sua popularidade e suporte e domesmo modo um candidato pode se beneficiar com a perda de popularidade e suporteSe os candidatos A e B satildeo os esperados para ir ao segundo turno onde A eacute mais fortedo que B um aumento no suporte pelo candidato A pode resultar na sua derrota quandoesse aumento causa uma alteraccedilatildeo nos candidatos que satildeo selecionados para ir ao segundoturno Se esse aumento na popularidade de A resultar na eliminaccedilatildeo preacutevia de B um

                  21

                  terceiro candidato C pode ser vitorioso sobre A no segundo turno caso os eleitores de Bprefiram C ao candidato A Se natildeo houvesse esse crescimento de popularidade A teriaderrotado B no segundo turno Essa situaccedilatildeo seraacute vista em melhores detalhes na seccedilatildeo 43

                  223 Voto Uacutetil no TRS

                  Esse sistema minimiza os efeitos do voto uacutetil em relaccedilatildeo ao FPTP pois um eleitorqualquer pode tranquilamente votar em sua preferecircncia sem se preocupar em desperdiccedilaacute-lo mesmo que seu candidato natildeo tenha chances de vitoacuteria Se este natildeo for eleito aindapoderaacute escolher a sua preferecircncia dentre os dois candidatos que prosseguirem para osegundo turno

                  Apesar disso ainda existe um cenaacuterio em que o eleitor pode ser tentado a natildeo votar emsua preferecircncia Eacute possiacutevel que ele opte pela sua segunda opccedilatildeo se souber que sua primeiraopccedilatildeo possui miacutenimas chances de ir ao segundo turno ou ateacute mesmo por saber que issodiminuiraacute as chances de algum outro candidato ser eleito Mesmo assim eacute evidente queo TRS natildeo proporciona o mesmo apelo ao voto taacutetico que o FPTP

                  Outra caracteriacutestica do TRS eacute o incentivo a formaccedilatildeo de coalizotildees entre candidatosde partidos mais populares com candidatos de partidos menos populares As coalizotildeesfornecem benefiacutecios agrave ambas as partes onde os candidatos classificados para o segundoturno em geral se juntam a candidatos jaacute eliminados com a intenccedilatildeo de agregar maisvotos enquanto os candidatos jaacute eliminados apoiam um dos dois classificados na esperanccedilade inserir propostas proacuteprias ou modificaccedilotildees agrave chapa deles

                  23 INSTANT-RUNOFF VOTING

                  Instant Runoff Voting foi uma alternativa aos meacutetodos FPTP e TRS desenvolvidanos anos 70 por um professor do Instituto de Tecnologia de Massachusetts(MIT) O IRVelimina as principais desvantagens desses outros dois sistemas a pluralidade do FPTP e anecessidade de mais de uma rodada de votaccedilatildeo do TRS Este meacutetodo tambeacutem opera emmais de uma rodada poreacutem como o proacuteprio nome sugere essas rodadas satildeo instantacircneasnatildeo sendo necessaacuterio o retorno dos eleitores agraves urnas Atualmente ele eacute utilizado naIrlanda nas eleiccedilotildees presidenciais em Londres na eleiccedilatildeo de seu prefeito e em distritosindividuais na Austraacutelia para eleger membros de sua cacircmara baixa do parlamento OIRV tambeacutem eacute usado por vaacuterias organizaccedilotildees privadas nos Estados Unidos incluindoa American Political Science Association e a American Psychological Association paraeleger seus funcionaacuterios

                  Nesse sistema os eleitores natildeo satildeo solicitados a votar em um uacutenico candidato aoinveacutes disso eles listam todos os candidatos concorrentes na ordem de sua preferecircnciaA partir dessas listas as primeiras opccedilotildees de cada eleitor recebem o seu voto e apoacutes acontagem se um candidato obtiver 50 dos votos mais um este candidato eacute eleito Se

                  22

                  isso natildeo ocorrer o candidato menos votado eacute eliminado das eleiccedilotildees e seus votos satildeotransferidos para a segunda opccedilatildeo de cada um de seus eleitores Esse procedimento serepete eliminando o candidato menos votado a cada rodada ateacute que algum dos candidatospossuam a maioridade dos votos

                  231 Exemplo

                  Na tabela 3 pode-se verificar a distribuiccedilatildeo de votos por perfil de eleitor e na tabela4 vecirc-se o desenvolvimento do IRV para essas distribuiccedilotildees O candidato D eacute o menosvotado e por consequecircncia eacute o primeiro a ser eliminado A segunda opccedilatildeo de todos oseleitores que votaram no candidato D eacute o candidato C por isso este recebe todos os votosdistribuiacutedos na segunda rodada Com isso o candidato B eacute eliminado com 25 dos votos eos candidatos A e C concorrem na uacuteltima rodada Mesmo com o candidato C na lideranccedilana segunda rodada a maior parte dos eleitores do B tem como preferecircncia o candidatoA por isso A eacute eleito com 55 dos votos contra 45 do C

                  Tabela 3 ndash Exemplo IRV

                  Rankings Ndeg de eleitoresABCD 20ABDC 16BDAC 19BDCA 6CABD 7CDBA 15DCAB 5DCBA 12

                  Tabela 4 ndash Desenvolvimento do IRVTurnos D C B A

                  1 17 22 25 362 eliminado 39 25 363 eliminado 45 eliminado 55

                  232 Vantagens e Desvantagens do IRV

                  Assim como no TRS a pluralidade eacute irrelevante no IRV e um candidato soacute eacute eleitocom a maioridade dos votos dando maior legitimidade ao mandato deste No entantopode-se argumentar que o IRV faz isso com mais eficiecircncia pois natildeo requer a execuccedilatildeode mais de uma rodada de votaccedilotildees Isso diminui os custos das eleiccedilotildees como um todoao mesmo tempo que proporciona um nuacutemero menor de isenccedilotildees por parte dos eleitoresdevido ao desgaste de todo o processo eleitoral

                  23

                  Aleacutem disso candidatos de partidos menores tendem a receber mais votos do queno FPTP e portanto satildeo mais encorajados a se candidatar Com uma lista maior decandidatos eleitores desfrutam de uma variedade maior de opccedilotildees de voto Contudomesmo com mais candidatos menos populares o spoiler effect mencionado anteriormentetambeacutem natildeo possui espaccedilo nesse sistema de votaccedilatildeo Partidos menores natildeo tem comoroubar votos de partidos maiores visto que esses votos eventualmente seratildeo transferidosde volta a eles durante o desenvolvimento das rodadas do IRV

                  Em virtude de sua estrutura acredita-se que esse meacutetodo tende a encorajar os can-didatos tambeacutem a elaborar suas campanhas de forma mais abrangente ampliando suainfluecircncia para mais do que apenas um grupo especiacutefico de maneira que ele consiga agre-gar votos de segunda ou terceira opccedilatildeo aleacutem dos votos de seus eleitores principais

                  A principal desvantagem do IRV eacute o fato de ele ainda natildeo ser amplamente utilizado aoredor do mundo Essa falta de familiaridade do sistema pode causar confusatildeo ao eleitorcomum em suas primeiras ocorrecircncias No entanto nos paiacuteses em que este eacute utilizadonatildeo parece haver confusatildeo entre os eleitores Aleacutem disso na maioria dos casos haveraacute umcusto potencialmente alto da substituiccedilatildeo ou alteraccedilatildeo dos sistemas das urnas eletrocircnicaspara que seja possiacutevel haver a implementaccedilatildeo do meacutetodo

                  Aleacutem disso assim como o TRS este sistema tambeacutem possui natildeo-monotonicidade ouseja um candidato pode ser prejudicado ao ser ranqueado mais alto enquanto que outropode se beneficiar sendo ranqueado mais baixo pelos eleitores (ORNSTEIN 2018) issopode ocorrer quando esse ranqueamento causa alteraccedilotildees na ordem em que os candidatossatildeo eliminados Essa caracteriacutestica se manifesta em fenocircmenos complexos e especiacuteficos epor isso um exemplo de sua ocorrecircncia seraacute abordada em detalhes na seccedilatildeo 43

                  233 Voto Uacutetil no IRV

                  Como os sistemas de votaccedilatildeo anteriores o IRV natildeo eacute completamente imune ao vototaacutetico No entanto este meacutetodo se mostra bem resistente a eles quando comparado aoutros meacutetodos como o FPTP e o Borda Count (Bartholdi John J III and Orlin JamesB 1990) Distintivamente o IRV requer um maior esforccedilo do eleitor para elaborar umaestrateacutegia que melhor ajuste os resultados da eleiccedilatildeo de acordo com a sua preferecircnciaAleacutem disso eacute necessaacuterio que ele tenha informaccedilatildeo suficiente sobre os rankings de outroseleitores naturalmente obtida atraveacutes de pesquisas eleitorais

                  Existe tambeacutem a possibilidade de ocorrer uma exaustatildeo dos votos quando natildeo haacuteo completo preenchimento do ranking por parte dos eleitores Nessas ocasiotildees o votonatildeo pode continuar a ser transferido a outros candidatos e ele eacute descartado Isso afetaa legitimidade do mandato do candidato eleito pois o resultado final natildeo representaraacute100 da populaccedilatildeo votante Essas ocorrecircncias no entanto podem ser minimizadas comuma melhor educaccedilatildeo eleitoral ou como foi implementado na Austraacutelia requerer que osrankings incluam uma totalidade dos candidatos concorrentes

                  24

                  24 APPROVAL VOTING SYSTEM

                  No meacutetodo Approval Voting os eleitores natildeo satildeo limitados pelo nuacutemero de candidatosem que podem votar por isso approval cada eleitor pode votar em todos os candidatos osquais ele aprova Apoacutes as votaccedilotildees o candidato com a maior quantidade de votos eacute eleitoSegundo Hamlin (2015) a cidade de Fargo na Dakota do Norte se tornou a primeiracidade nos EUA a colocar em praacutetica este sistema em suas eleiccedilotildees gerais em novembrode 2018 AVS tambeacutem eacute utilizado para eleger o secretaacuterio-geral das Naccedilotildees Unidas e emdiversas outras organizaccedilotildees

                  241 Exemplo

                  Na tabela 5 abaixo pode-se encontrar 8 perfis de eleitores com seus candidatos apro-vados e quantidade de eleitores que se encaixam no perfil Na tabela 6 temos o resultadoda contabilizaccedilatildeo dos votos destes perfis O candidato mais popular eacute o B que se encontraaprovado em 5 perfis distintos totalizando 60 votos ou aproximadamente 32

                  Tabela 5 ndash Exemplo AVS

                  Aprovaccedilotildees Ndeg de eleitoresA 20AB 16B 19

                  BDC 6CAB 7CD 15DC 5DCB 12

                  Tabela 6 ndash Resultado AVSCandidatos Total de votos

                  A 43B 60C 45D 38

                  242 Vantagens e Desvantagens do AVS

                  Aleacutem de simples este meacutetodo permite um niacutevel maior de expressividade aos eleitoresOnde no FPTP e TRS eles satildeo limitados pelo seu uacutenico voto aqui os eleitores tecircm aliberdade de demonstrar exatamente quais candidatos consideram aptos ou aceitaacuteveis aocargo

                  25

                  Outro efeito dessa liberdade trazida pelo AVS eacute a dizimaccedilatildeo do spoiler effect Can-didatos de partidos menores natildeo tem como roubar votos de partidos maiores nessesistema ambos os candidatos contabilizariam o voto

                  243 Voto Uacutetil no AVS

                  O tipo de voto uacutetil no AVS eacute denominado bullet voting Segundo The Center forElection Science (2015) esta taacutetica envolve simplesmente ignorar a possibilidade de votarem mais de um candidato e votar apenas em sua primeira opccedilatildeo Um eleitor pode serlevado a adotar essa estrateacutegia quando percebe que sua preferecircncia pode ser prejudicadacom o voto em alguma segunda opccedilatildeo sua Em um cenaacuterio extremo onde 100 doseleitores adotam esta estrateacutegia as eleiccedilotildees satildeo convertidas a um simples First Past ThePost

                  25 THE BORDA COUNT

                  Este meacutetodo carrega o nome em homenagem a seu criador Jean-Charles de Bordaque o desenvolveu em 1770 (LIPPMAN 2012) A contagem de Borda utiliza a abordagemde ranqueamento dos candidatos poreacutem de maneira diferente ao IRV Este eacute um sistemaque atribui uma pontuaccedilatildeo aos candidatos com base nestes rankings O candidato na basedo ranking natildeo recebe pontos o candidato imediatamente acima deste recebe 1 pontoo proacuteximo recebe 2 pontos e assim por diante ateacute o topo do ranking As pontuaccedilotildees detodos os rankings satildeo contabilizadas e o candidato com maior pontuaccedilatildeo eacute eleito Deacordo com Lippman variaccedilotildees deste meacutetodo satildeo encontradas em uso na premiaccedilatildeo dediversos esportes como na seleccedilatildeo do MVP(Most Valuable Player) da MLB(principal ligade beisebol dos EUA) e no Trofeacuteu Heisman de futebol americano universitaacuterio

                  251 Exemplo

                  Neste exemplo seratildeo aproveitados os mesmos rankings apresentados na tabela 3 Porserem 4 candidatos o primeiro colocado de cada ranking receberaacute 3 pontos o segundo 2pontos o terceiro 1 e o quarto 0 Assim o nuacutemero maacuteximo de pontos que um candidatopode atingir eacute igual a 300(se ficar na primeira posiccedilatildeo em todos os rankings) e o nuacutemerototal de pontos no sistema eacute 600 O nuacutemero maacuteximo de pontos que um candidato podeatingir eacute calculado com

                  (cminus 1)times e

                  Sendo c igual ao nuacutemero de candidatos e e o nuacutemero de eleitores Por sua vez onuacutemero total de pontos no sistema eacute

                  26

                  (cminus 1)times c2

                  times e

                  A contagem final dos pontos eacute apresentada na tabela 7 abaixo

                  Tabela 7 ndash Resultado BCCandidatos Total de pontos

                  A 146B 181C 126D 147

                  O candidato eleito eacute o B com 181 pontos ou aproximadamente 60 da pontuaccedilatildeomaacutexima

                  252 Vantagens e Desvantagens do BC

                  Em comparaccedilatildeo com os meacutetodos abordados anteriormente que apenas consideramas primeiras opccedilotildees de cada eleitor este meacutetodo regularmente escolhe candidatos comaceitaccedilatildeo mais ampla ao inveacutes de uma preferecircncia direta dos eleitores (Electoral ReformSociety 2017b)

                  Ele tambeacutem encoraja uma abordagem estrateacutegica por parte dos partidos onde seriade seu interesse nomear mais de um candidato para concorrer pois quanto mais candi-datos estatildeo no paacutereo maior eacute a pontuaccedilatildeo dos primeiros colocados Logo a nomeaccedilatildeo decandidatos menos populares pode beneficiar os principais candidatos de um partido

                  253 Voto Uacutetil no BC

                  Existem duas estrateacutegias aplicaacuteveis a esse sistema A primeira denominada compromi-sing de maneira similar a outros meacutetodos de votaccedilatildeo se resume em ranquear em primeirolugar um dos candidatos que estejam liderando as eleiccedilotildees mesmo que este natildeo seja suapreferecircncia real A segunda estrateacutegia burying eacute o oposto esta se baseia em ranquearem uacuteltimo lugar um dos candidatos liacutederes mesmo que este natildeo seja o seu candidato demaior desgosto Ambas estrateacutegias podem ser aplicadas ao mesmo tempo por um eleitor

                  26 SCORE VOTING SYSTEM

                  Score Voting ou Range Voting como tambeacutem eacute conhecido eacute mais um meacutetodo quetenta trazer maior liberdade de expressatildeo aos eleitores Assim como o Borda Counteste sistema funciona baseado na pontuaccedilatildeo dos candidatos no entanto ao inveacutes dessapontuaccedilatildeo ser relativa agrave posiccedilatildeo do candidato no ranking de cada eleitor este por sua veztem completa liberdade de atribuir qualquer quantidade de pontos aos candidatos dentro

                  27

                  de determinada escala Um eleitor pode dar o mesmo nuacutemero de pontos para diferentescandidatos e apoacutes o somatoacuterio de todas as pontuaccedilotildees o candidato com a pontuaccedilatildeo maisalta eacute eleito Incorporado ao escopo poliacutetico o SVS eacute utilizado no Partido Pirata Alematildeobem como em diversas organizaccedilotildees tais como o Fedora Project e Mozilla e tambeacutem emvariados esportes oliacutempicos e reality shows como o American Idol aponta Hamlin (2015)

                  261 Exemplo

                  Neste exemplo temos apresentados na tabela 8 abaixo 4 perfis distintos de eleitorese suas respectivas atribuiccedilotildees de pontos aos 4 candidatos Cada eleitor pode atribuirqualquer pontuaccedilatildeo a um candidato dentro da escala de -10 a 10 O resultado da eleiccedilatildeoapoacutes a soma de todos os pontos por candidato se encontra na tabela 9 onde o candidatoA eacute eleito com um total de 605 pontos

                  Tabela 8 ndash Exemplo SVS

                  Perfil A B C D Ndeg de eleitores1 10 -1 5 2 362 6 9 -3 4 253 2 0 8 4 224 3 3 3 10 17

                  Tabela 9 ndash Resultado SVSCandidatos Total de pontos

                  A 605B 240C 332D 430

                  262 Vantagens e Desvantagens do SVS

                  A grande vantagem do SVS eacute como ele proporciona aos eleitores expressar de maneiramuito proacutexima potencialmente exata suas impressotildees poliacuteticas de cada candidato Eleeacute ainda mais expressivo que o AVS Dessa maneira o spoiler effect tambeacutem se torna nuloao passo que toda intenccedilatildeo de voto eacute precisamente representada neste sistema

                  Assim como outros meacutetodos eleitorais este sofre igualmente dos males produzidos pelovoto taacutetico Sua principal desvantagem eacute discutida na seccedilatildeo abaixo

                  263 Voto Uacutetil no SVS

                  Da mesma maneira que no Approval Voting atraveacutes do bullet voting o SVS tambeacutempode ser convertido em uma eleiccedilatildeo sob o meacutetodo FPTP em um cenaacuterio com um grande

                  28

                  volume de eleitores maliciosos O voto uacutetil sob este sistema se manifesta pontuando-seapenas um candidato com uma nota positiva e todos os outros com as notas mais baixasda escala Se todos os eleitores se aproveitarem dessa abordagem natildeo existiraacute distinccedilatildeoefetiva entre uma eleiccedilatildeo sob SVS e FPTP Essencialmente cada eleitor estaacute votando emapenas um candidato Essa eacute a principal desvantagem do SVS e ela consegue eliminarsua principal vantagem dar ao eleitor um poder maior de expressatildeo

                  27 BLOC VOTE

                  O Bloc Vote eacute um meacutetodo utilizado para a eleiccedilatildeo de candidatos a cargos no governocom mais de uma vacacircncia Pode ser considerado um meio-termo entre o FPTP e oAVS pois os eleitores podem votar em mais de um candidato poreacutem satildeo limitados pelonuacutemero de vagas Em uma eleiccedilatildeo com duas vagas por exemplo cada eleitor selecionaraacutedois candidatos ou menos Sensatamente o candidato mais votado eacute eleito Ele possuialgumas utilizaccedilotildees em eleiccedilotildees locais em algumas partes da Inglaterra (Electoral ReformSociety 2017a)

                  271 Exemplo

                  Neste exemplo dois candidatos seratildeo eleitos logo cada eleitor votaraacute em no maacuteximodois candidatos A distribuiccedilatildeo de votos pode ser conferida na tabela 10 e o resultado dacontagem de votos na tabela 11 abaixo Os candidatos eleitos satildeo o C totalizando 78do maacuteximo de votos possiacuteveis para um candidato e o A com 43

                  Tabela 10 ndash Exemplo BV

                  Aprovaccedilotildees Ndeg de eleitoresAC 20AB 16BC 19BD 6CA 7CD 15DC 17

                  Tabela 11 ndash Resultado BVCandidatos Total de votos

                  A 43B 41C 78D 38

                  29

                  272 Voto Uacutetil no BV

                  Neste sistema eacute possiacutevel que um eleitor evite votar em sua primeira opccedilatildeo quandoeste natildeo tem chances de vitoacuteria e se fazendo isto ele diminuiraacute as chances de algum outrocandidato de seu desgosto ganhar Poreacutem o sistema previne um outro tipo de voto uacutetilEm eleiccedilotildees com mais de uma vaga onde os eleitores soacute podem votar em um candidatose um eleitor sabe que sua primeira opccedilatildeo tambeacutem eacute a primeira opccedilatildeo da maior parteda populaccedilatildeo e portanto muito provavelmente seraacute um dos candidatos eleitos eacute possiacutevelque ele arrisque votar em uma segunda opccedilatildeo sua na esperanccedila de a longo prazo elegersuas duas principais opccedilotildees de voto Com os eleitores podendo votar no nuacutemero exato devagas disponiacuteveis esse tipo de pensamento taacutetico perde o sentido

                  30

                  3 O SIMULADOR

                  Para este trabalho foi implementado um simulador eleitoral na forma de uma aplicaccedilatildeoweb para que a interaccedilatildeo do usuaacuterio fosse facilitada Veremos a seguir como se daacute suautilizaccedilatildeo de forma geral

                  Figura 2 ndash Captura de tela 1

                  Figura 3 ndash Captura de tela 2

                  A primeira opccedilatildeo encontrada pelo usuaacuterio eacute a escolha de quais sistemas de votaccedilatildeo se-ratildeo simulados (Figura 2) Todos eles podem ser selecionados para rodar simultaneamentePoreacutem natildeo eacute permitido rodar uma simulaccedilatildeo do Bloc Vote para uma eleiccedilatildeo onde apenasum candidato eacute eleito aleacutem disso natildeo existe implementaccedilatildeo dos meacutetodos TRS e IRV para

                  31

                  eleiccedilotildees com mais de um candidato eleito jaacute que eles se comportariam exatamente comono FPTP

                  A maioria das linguagens de programaccedilatildeo senatildeo todas possuem um gerador de nuacuteme-ros pseudoaleatoacuterios que fornece a possibilidade de definir uma seed para o gerador Estaseed funciona como um ponto de partida para a geraccedilatildeo dos nuacutemero e portanto todasimulaccedilatildeo que rodar com a mesma seed sempre teraacute os mesmos resultados Se nenhumvalor for fornecido pelo usuaacuterio o tempo atual do sistema eacute utilizado As opccedilotildees subse-quentes satildeo a escolha do nuacutemero de eleitores gerados e o nuacutemero de vagas (Figura 3) Senenhum valor for fornecido o nuacutemero de eleitores padratildeo utilizado eacute 1000 e o nuacutemero devagas igual a 1

                  Figura 4 ndash Captura de tela 3

                  Este simulador possui dois modos para a criaccedilatildeo dos rankings dos eleitores No modoManipulate (Figura 4) primeiramente se define o nuacutemero de candidatos atraveacutes do campode entrada ao lado do tiacutetulo Candidates ou alternativamente pode-se adicionar candida-tos um a um atraveacutes do sinal de mais na parte inferior da paacutegina Para cada candidatoeacute possiacutevel definir a porcentagem de seus eleitores que optaraacute pelo voto taacutetico e pelovoto de minoria Tambeacutem eacute possiacutevel alterar o nome dos candidatos se for do interessedo usuaacuterio

                  32

                  Figura 5 ndash Captura de tela 4

                  Figura 6 ndash Captura de tela 5

                  33

                  Figura 7 ndash Captura de tela 6

                  Apoacutes a criaccedilatildeo dos candidatos o usuaacuterio pode criar perfis de eleitores que definiratildeo demaneira exata como partes da populaccedilatildeo iraacute votar (Figura 5) Em cada perfil se defineo valor em porcentos da populaccedilatildeo votante que o adotaraacute e a nota de cada candidatoTambeacutem eacute possiacutevel nomear cada perfil livremente

                  No modo Generate (Figura 6) eacute onde o gerador de nuacutemeros pseudoaleatoacuterios eacute usadoNesse modo ao inveacutes do usuaacuterio criar perfis de eleitores ele define qual seraacute a distribuiccedilatildeoadotada para a geraccedilatildeo de notas de cada candidato Essas distribuiccedilotildees seratildeo mais bemdetalhadas no Capiacutetulo 5 Da mesma maneira que no modo Manipulate nesse modotambeacutem eacute possiacutevel definir os valores para os dois tipos de voto uacutetil os votos taacuteticos eos votos de minoria No primeiro estatildeo incluiacutedas as estrateacutegias de mudanccedila de votoespeciacuteficas de cada sistema como o bullet voting no AVS e SVS ou quando a preferecircnciade um eleitor claramente natildeo possui chances de vitoacuteria e ele muda seu voto para um doscandidatos que esteja na lideranccedila o que ocorre no FPTP e TRS O voto de minoriase apresenta apenas no FPTP em eleiccedilotildees onde mais de um candidato eacute eleito Se apreferecircncia de um eleitor claramente lidera a eleiccedilatildeo por ser tambeacutem a preferecircncia damaior parte da populaccedilatildeo esse eleitor pode mudar o seu voto para uma segunda opccedilatildeona esperanccedila de eleger dois de seus candidatos favoritos

                  Por fim em ambos os modos o usuaacuterio tem a opccedilatildeo de definir coalizotildees entre oscandidatos se o sistema TRS estiver habilitado pois as coalizotildees apenas se manifestamnesse sistema Essas coalizotildees alteraratildeo as notas dos candidatos dependendo dos outroscandidatos pertencentes a elas (Figura 7)

                  A aplicaccedilatildeo pode ser encontrada na paacutegina httpelectionsimpythonanywherecom

                  34

                  4 CENAacuteRIOS PERTINENTES

                  Para todos os cenaacuterios deste capiacutetulo seraacute usada a seed do simulador igual a 100 e apopulaccedilatildeo de eleitores igual a 1000 para que exista consistecircncia na anaacutelise e tambeacutem paraque possa haver replicaccedilatildeo dos resultados se necessaacuterio

                  41 CENAacuteRIO 1 VOTO TAacuteTICO

                  Neste exemplo teremos quatro candidatos Ana Beto Carla e Diego Ana e Betoseratildeo gerados a partir da distribuiccedilatildeo Neutral (Figura 47) Carla da distribuiccedilatildeo Disliked(Figura 51) e Diego da Hated (Figura 55) Para a simulaccedilatildeo com a seed 100 o melhorcandidato a ser eleito ou seja aquele que maximiza a meacutedia das notas dos eleitores eacute oBeto com uma meacutedia de 0073 Para cada sistema seratildeo comparados os resultados semvoto taacutetico aos com 20 de voto taacutetico a favor da Ana Abaixo se encontram osresultados para o sistema FPTP

                  Figura 8 ndash FPTP - Cenaacuterio 1 sem voto taacutetico

                  Figura 9 ndash TRS segundo turno - Cenaacuterio 1 sem voto taacutetico

                  35

                  Figura 10 ndash IRV primeiro turno - Cenaacuterio 1

                  Figura 11 ndash IRV segundo turno - Cenaacuterio 1

                  Figura 12 ndash IRV terceiro turno - Cenaacuterio 1

                  36

                  Figura 13 ndash AVS - Cenaacuterio 1 sem voto taacutetico

                  Figura 14 ndash BC - Cenaacuterio 1 sem voto taacutetico

                  Figura 15 ndash SVS - Cenaacuterio 1 sem voto taacutetico

                  37

                  Nesse cenaacuterio sem voto taacutetico o uacutenico sistema que natildeo elege o Beto eacute o AVS Todosos outros elegem o melhor candidato Ou seja apesar de Beto ter uma melhor meacutediadas notas dos eleitores existem mais eleitores que ranqueiam Ana com uma nota acimade 0 No entanto apenas 20 dos eleitores de Diego e Carla que preferem a Ana aoinveacutes do Beto satildeo o suficiente para fazer Beto natildeo ser eleito se eles decidirem abandonarsua primeira opccedilatildeo e votar na Ana Considerando a vantagem que os votos taacuteticosproporcionam agrave Ana esta eacute eleita em todos os sistemas menos o TRS e o IRV

                  Figura 16 ndash FPTP - Cenaacuterio 1 - 20 de voto taacutetico na Ana

                  Figura 17 ndash TRS segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                  38

                  Figura 18 ndash IRV primeiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                  Figura 19 ndash IRV segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                  Figura 20 ndash IRV terceiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                  39

                  Figura 21 ndash AVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                  Figura 22 ndash BC - Cenaacuterio 1 20 de voto taacutetico na Ana

                  Figura 23 ndash SVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                  40

                  Eacute claro que se os eleitores que preferem o Beto tambeacutem votassem de maneira estra-teacutegica a situaccedilatildeo se equilibraria e haveria o mesmo niacutevel de concorrecircncia entre os doiscandidatos que ocorre quando natildeo haacute voto taacutetico Poreacutem no Borda Count esse equiliacute-brio pode natildeo acontecer e as estrateacutegias de compromising e burying podem acabar saindopela culatra se uma porcentagem elevada dos eleitores as adotarem Abaixo encontram-seos resultados para esse sistema quando 100 dos eleitores de Carla e Diego se comportammaliciosamente

                  Figura 24 ndash BC - Cenaacuterio 1 100 de voto taacutetico na Ana e Beto

                  Por causa do uso demasiado da estrateacutegia burying Ana e Beto perdem muitos pontose isso abre espaccedilo para uma vitoacuteria da Carla No entanto para porcentagens menores que100 o Beto ainda eacute o vencedor

                  Essas duas estrateacutegias tambeacutem foram implementadas nesse simulador para o sistemaIRV e eacute possiacutevel ver como ele eacute resistente a elas Para que seja possiacutevel mudar os resultadosde uma eleiccedilatildeo sob o IRV eacute necessaacuterio mudar a ordem de eliminaccedilatildeo dos candidatos paraque o seu candidato preferido acabe enfrentando um candidato mais fraco nas rodadasfinais Isso natildeo ocorre com compromising e burying No proacuteximo cenaacuterio seraacute analisadacomo eacute possiacutevel modificar os resultados de uma eleiccedilatildeo sob o IRV

                  Esses resultados podem ser replicados acessando os linksSem votos taacuteticos lthttpelectionsimpythonanywherecomdirect_res1111110

                  --[0021][22Ana2222Beto222022Carla2222Diego22]------100gt

                  Com 20 de voto taacutetico lthttpelectionsimpythonanywherecomdirect_res1111110--[0021][22Ana222022Beto2222Carla2222Diego22]1-[02000]---100gt

                  Com 100 de voto taacuteticona Ana e Beto lthttpelectionsimpythonanywherecomdirect_res0000100--[0021][22Ana222022Beto222022Carla2222Diego22]1-[101000]---100gt

                  41

                  42 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV

                  Neste cenaacuterio teremos Ana Carla e Beto concorrendo e trecircs perfis distintos que apoiamcada candidato As distribuiccedilotildees de notas dos perfis se encontram na tabela abaixo

                  Tabela 12 ndash Distribuiccedilatildeo de notas - Cenaacuterio 2

                  Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                  deeleitores

                  1 10 5 0 422 0 10 5 303 5 0 10 28

                  Com essas distribuiccedilotildees Carla eacute eliminada na primeira rodada e seus 28 de votossatildeo transferidos para a segunda opccedilatildeo de seus eleitores Ana que eacute eleita com 70 dosvotos e uma meacutedia de 56

                  Figura 25 ndash IRV primeiro turno - Cenaacuterio 2

                  Figura 26 ndash IRV segundo turno - Cenaacuterio 2

                  42

                  Cientes desse provaacutevel futuro cenaacuterio onde Ana eacute eleita uma pequena parte dos elei-tores de Beto estrategicamente o abandona e decide apoiar Carla na esperanccedila de leva-laao segundo turno contra Ana As novas distribuiccedilotildees de notas se encontram na tabelaabaixo com essa porccedilatildeo de eleitores representada pelo perfil 4

                  Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2

                  Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                  deeleitores

                  1 10 5 0 422 0 10 5 283 5 0 10 284 0 8 10 2

                  Essa mudanccedila estrateacutegica de voto altera a ordem de eliminaccedilotildees do sistema com Betosendo o primeiro a ser eliminado Com isso seus votos satildeo naturalmente transferidos paraCarla que derrota Ana no segundo turno com 58 dos votos

                  Figura 27 ndash IRV primeiro turno com voto taacutetico - Cenaacuterio 2

                  Figura 28 ndash IRV segundo turno com voto taacutetico - Cenaacuterio 2

                  43

                  Percebendo que a eleiccedilatildeo de Beto natildeo era provaacutevel seus eleitores conseguiram aomenos impedir a eleiccedilatildeo do pior candidato para eles Mas para isso foi necessaacuterio queeles tivessem a informaccedilatildeo de como os outros eleitores votariam Uma aproximaccedilatildeo dessasinformaccedilotildees poderia ser obtida em um cenaacuterio real com poucos candidatos atraveacutes depesquisas eleitorais poreacutem se o nuacutemero de candidatos eacute significativo uma noccedilatildeo completadas distribuiccedilotildees dos rankings dos eleitores se torna muito menos viaacutevel e dificulta aformulaccedilatildeo de estrateacutegias para alterar a ordem em que os candidatos satildeo eliminados

                  Esses resultados podem ser replicados acessando os linksSem voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana22

                  22Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                  Com voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana

                  2222Beto2222Carla22]-----42Voter20Profile2001020520028Voter20Profile2010201020528Voter20Profile202520020102Voter20Profile20302082010100gt

                  43 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE

                  O interessante dos sistemas IRV e TRS eacute que os resultados do cenaacuterio anterior po-deriam ter sido obtidos ao inveacutes do voto taacutetico pela sua natildeo-monotonicidade Seriapossiacutevel que a Carla derrotasse a Ana no segundo turno atraveacutes do proacuteprio aumento depopularidade da Ana Assumindo que essa popularizaccedilatildeo ocorresse entre os candidatosdo perfil 2 onde 3 passasse a apoiar a Ana ao inveacutes do Beto as novas distribuiccedilotildeesseguiriam a tabela abaixo

                  Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                  Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                  deeleitores

                  1 10 5 0 452 0 10 5 273 5 0 10 28

                  Dessa maneira Beto agora com uma porcentagem dos eleitores menor do que a deCarla seraacute eliminado na primeira rodada e como seus eleitores tecircm a Carla como segundaopccedilatildeo ela receberaacute todos os seus votos e seraacute eleita na segunda rodada As rodadas doIRV podem ser vistas nas figuras 29 e 30

                  44

                  Figura 29 ndash IRV primeiro turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                  Figura 30 ndash IRV segundo turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                  Tabela 15 ndash Resultados do Cenaacuterio 3Candidato

                  eleitoMeacutedia das

                  notasAntes da

                  popularizaccedilatildeode Ana

                  Ana 56

                  Apoacutespopularizaccedilatildeo

                  de AnaCarla 415

                  Os efeitos dessa caracteriacutestica se refletem na satisfaccedilatildeo meacutedia da populaccedilatildeo A Ana eacuteclaramente a melhor candidata e mesmo com o seu ganho de popularidade (ou devido aele) a Carla eacute eleita

                  Esses resultados podem ser replicados acessando os linksAntes da popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecom

                  direct_res0010000---[22Ana2222Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                  45

                  Apoacutes popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana2222Beto2222Carla22]-----45Voter20Profile2001020520027Voter20Profile2010201020528Voter20Profile20252002010100gt

                  44 CENAacuteRIO 4 COALIZOtildeES

                  O TRS por ser organizado em dois turnos separados normalmente a semanas dedistacircncia um do outro acaba abrindo brecha agrave mudanccedila de opiniatildeo por parte dos eleitorese o desenvolvimento de novas estrateacutegias por parte dos candidatos tais como a coalizatildeocom candidatos jaacute eliminados Com isso em mente nesse cenaacuterio teremos novamenteos quatro candidatos Ana Beto Carla e Diego Os trecircs primeiros seratildeo gerados dadistribuiccedilatildeo Neutral e Diego da distribuiccedilatildeo Disliked

                  Figura 31 ndash TRS turno 1 - Cenaacuterio 4

                  No TRS normal Ana Beto e Carla possuem com essas distribuiccedilotildees quantidades devotos muito proacuteximas com Beto e Carla indo para o segundo turno Carla estaacute 10 votosatraacutes de Beto e decide aproveitar o espaccedilo de tempo entre os dois turnos para tentaragregar mais votos Com isso Carla se aproxima de Diego e juntos formam uma coalizatildeoNo entanto com sua baixa popularidade Diego acaba ferindo a reputaccedilatildeo de Carla etorna o segundo turno muito mais faacutecil para Beto (Figura 33) Se Carla tivesse buscado osuporte de Ana por outro lado ela se veria vitoriosa no segundo turno e com uma amplavantagem sobre o Beto (Figura 34) Ou ateacute mesmo sem buscar uma coalizatildeo mesmosendo uma corrida apertada Carla teria naturalmente sido eleita (Figura 32)

                  Esses resultados podem ser replicados acessando os linksSem coalizotildees lthttpelectionsimpythonanywherecomdirect_res0100000

                  --[0002][22Ana222022Beto2222Carla2222Diego22]------100gt

                  46

                  Figura 32 ndash TRS turno 2 - Cenaacuterio 4

                  Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4

                  Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4

                  47

                  Coalizatildeo Carla e Diego lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2203Carla20Diego-100gt

                  Coalizatildeo Carla e Ana lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2200Carla20Ana-100gt

                  45 CENAacuteRIO 5 DILEMA DO PRISIONEIRO

                  Neste cenaacuterio temos uma eleiccedilatildeo de uma vaga com trecircs candidatos concorrentes e trecircsperfis distintos de eleitores que seguiratildeo as seguintes distribuiccedilotildees

                  Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5

                  Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                  deeleitores

                  1 10 -10 5 362 -10 10 5 343 -10 -10 5 30

                  Esse contexto nos remete ao notaacutevel dilema do prisioneiro Nele dois prisioneiroscuacutemplices satildeo interrogados individualmente sem poder se comunicar um com o outro ecada um enfrenta o dilema de delatar ou natildeo o seu parceiro Se os dois prisioneirosdecidem se manter calados sobre o crime ambos satildeo sentenciados a um ano de prisatildeo Seapenas um deles dedurar o outro o traidor sai livre enquanto seu parceiro eacute condenadoa trecircs anos Se ambos dedurarem um ao outro eles satildeo condenados juntos a dois anosde prisatildeo Esse dilema eacute uma ideia claacutessica presente no estudo da teoria dos jogos sendooriginalmente elaborada por Merrill Flood e Melvin Dresher em 1950 e mais tarde sendonomeada de dilema dos prisioneiros por Albert W Tucker (POUNDSTONE 1992)

                  O que esse dilema nos mostra eacute a tentaccedilatildeo que o indiviacuteduo deteacutem se sua racionalizaccedilatildeoestiver voltada para seus proacuteprios interesses e somente eles em oposiccedilatildeo a pensar no bemdo grupo como um todo Neste cenaacuterio encontramos dois grupos de eleitores expressiva-mente opostos os perfis 1 e 2 Se qualquer uma das preferecircncias desses perfis fosse eleitaisso significaria uma alta rejeiccedilatildeo de maior parte da populaccedilatildeo No entanto eles possuema segunda opccedilatildeo em comum a Carla que por sua vez eacute a preferecircncia do terceiro perfilPortanto a eleiccedilatildeo da Carla seria logicamente o resultado oacutetimo

                  Mesmo assim a Ana eacute eleita nos dois sistemas acima o que natildeo parece justo poispela tabela 16 eacute evidente que apenas 36 da populaccedilatildeo a aprova enquanto que os outros64 a reprovam ao maacuteximo O sistema IRV se comporta de maneira idecircntica ao TRS

                  48

                  Figura 35 ndash FPTP - Cenaacuterio 5

                  Figura 36 ndash TRS segundo turno - Cenaacuterio 5

                  nesta situaccedilatildeo Com esse resultado a meacutedia das notas eacute -28 No entanto os trecircs sistemasseguintes nos apresentam resultados diferentes

                  Tabela 17 ndash Resultados do Cenaacuterio 5

                  Sistema Candidatoeleito

                  Meacutedia dasnotas

                  FPTP Ana -28TRS Ana -28IRV Ana -28AVS Carla 50BC Carla 50SVS Carla 50

                  49

                  Figura 37 ndash AVS - Cenaacuterio 5

                  Figura 38 ndash BC - Cenaacuterio 5

                  Tanto o AVS quanto o Borda Count e o SVS satildeo sistemas que consideram todasas opiniotildees de cada eleitor ao mesmo tempo e por isso satildeo capazes de eleger o melhorcandidato nesta situaccedilatildeo diferentemente do TRS que natildeo absorve completamente todosentimento do eleitor por todos os candidatos e o IRV que apesar de ser bem expressivoquebra esse processo em inuacutemeras rodadas o que permite a perda de informaccedilatildeo ao longodelas

                  Esses resultados podem ser replicados acessando o linklthttpelectionsimpythonanywherecomdirect_res1111110---[22Ana

                  222022Beto222022Carla22]-----36Voter20Profile2001020-1020534Voter20Profile201-10201020530Voter20Profile202-1020-10205100gt

                  50

                  Figura 39 ndash SVS - Cenaacuterio 5

                  46 CENAacuteRIO 6 VOTO DE MINORIA

                  Neste cenaacuterio temos uma eleiccedilatildeo com quatro candidatos e duas vagas A Ana seraacutea preferecircncia de uma extensa parte da populaccedilatildeo (distribuiccedilatildeo Loved Figura 53) Betoe Carla seratildeo candidatos razoavelmente populares (distribuiccedilatildeo Neutral Figura 47) eDiego seraacute a preferecircncia de apenas um pequeno grupo especiacutefico e rejeitado pela maioria(distribuiccedilatildeo Disliked Figura 51) Eacute intuitivo esperar que os dois candidatos eleitos seratildeoa Ana e ou o Beto ou a Carla e isso eacute exatamente o que ocorre na figura 40 no sistemaFPTP sem voto de minoria

                  Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria

                  Eacute evidente a discrepacircncia da quantidade de votos da Ana para os outros candidatose apesar de Beto e Carla serem mais populares que Diego os trecircs natildeo se encontrammuito afastados Poreacutem se a pequena fraccedilatildeo de candidatos que possuem a Ana como

                  51

                  Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego

                  preferecircncia e Diego como segunda opccedilatildeo optarem pelo voto de minoria a situaccedilatildeo mudacompletamente (Figura 41) Assim apesar de extensamente rejeitado Diego conquistaa segunda vaga e a meacutedia das notas despenca de 2929 para 0505 No entanto aindaexiste um cenaacuterio pior Se os outros grupos de eleitores pensarem da mesma forma eevitarem votar na Ana achando que sua eleiccedilatildeo jaacute estaacute assegurada apenas 80 de votode minoria para esses grupos jaacute eacute o suficiente para eliminaacute-la das eleiccedilotildees (Figura 42)Com a Ana eliminada a meacutedia das notas cai ainda mais para 0058

                  Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego

                  O sistema Bloc Vote eacute uma das soluccedilotildees para o voto de minoria Permitindo queos eleitores votem no mesmo nuacutemero de candidatos que de vagas a serem preenchidasnatildeo existe o iacutempeto a esse tipo de voto estrateacutegico O resultado desse sistema portantoretorna a meacutedia das notas a casa dos 29 (Figura 43) Os sistemas AVS Borda Count eSVS tambeacutem impedem a presenccedila do voto de minoria e atingem resultados semelhantes

                  52

                  Figura 43 ndash BV - Cenaacuterio 6

                  Tabela 18 ndash Resultados do Cenaacuterio 6

                  Sistema Candidatoseleitos

                  Meacutedia dasnotas

                  FPTP sem voto de minoriaAna eBeto 2929

                  FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

                  FPTP com 80 de voto de minoriaBeto eCarla 0058

                  Bloc VoteAna eCarla 2913

                  Esses resultados podem ser replicados acessando os links

                  Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

                  100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

                  80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

                  53

                  5 COMO FUNCIONA O SIMULADOR

                  O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

                  51 CLASSE ELECTIONS

                  Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

                  bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

                  Figura 44 ndash estrutura candidates

                  bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

                  bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

                  Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

                  Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

                  54

                  Figura 45 ndash estrutura voters

                  Figura 46 ndash estrutura votes

                  daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

                  Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

                  55

                  Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

                  Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

                  na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

                  56

                  Figura 49 ndash PDF - Distribuiccedilatildeo Liked

                  Figura 50 ndash CDF - Distribuiccedilatildeo Liked

                  (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

                  Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

                  57

                  Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

                  Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

                  candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

                  Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

                  58

                  Figura 53 ndash PDF - Distribuiccedilatildeo Loved

                  Figura 54 ndash CDF - Distribuiccedilatildeo Loved

                  funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

                  59

                  Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                  Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                  Meacutedia das Notas sumei

                  sumvj nij

                  etimes v

                  Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                  Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                  60

                  Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                  Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                  52 CLASSE FIRSTPASTTHEPOST

                  Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                  Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                  61

                  Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                  Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                  mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                  62

                  53 CLASSE TWOROUNDSYSTEM

                  A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                  54 CLASSE INSTANTRUNOFFVOTING

                  A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                  Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                  63

                  cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                  55 CLASSE APPROVALVOTING

                  Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                  56 CLASSE BORDACOUNT

                  Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                  57 CLASSE SCOREVOTING

                  De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                  64

                  58 CLASSE BLOCVOTE

                  O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                  59 TECNOLOGIAS UTILIZADAS

                  A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                  Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                  O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                  Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                  65

                  6 CONCLUSAtildeO

                  Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                  Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                  Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                  Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                  Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                  66

                  REFEREcircNCIAS

                  AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                  Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                  Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                  Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                  HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                  LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                  ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                  Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                  POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                  The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                  67

                  APEcircNDICES

                  APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                  Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                  if(not len(selfvoter_profiles))

                  for voter in range(selfN_VOTERS)

                  candidates_rank = dict()

                  for candidate in reversed(range(selfN_CANDIDATES))

                  if(selfBIAS_VECTOR[candidate]==4)

                  candidates_rank[candidate] = self_sortear(selfloved)

                  elif(selfBIAS_VECTOR[candidate]==3)

                  candidates_rank[candidate] = self_sortear(selfliked)

                  elif(selfBIAS_VECTOR[candidate]==2)

                  candidates_rank[candidate] = self_sortear(selfdisliked)

                  elif(selfBIAS_VECTOR[candidate]==1)

                  candidates_rank[candidate] = self_sortear(selfhated)

                  elif(selfBIAS_VECTOR[candidate]==-1)

                  candidates_rank[candidate] = self_sortear(selfpolarizer

                  )

                  elif(selfBIAS_VECTOR[candidate]==-2)

                  candidates_rank[candidate] = self_sortear(self

                  more_polarizer)

                  else

                  candidates_rank[candidate] = self_sortear(selfneutral)

                  selfvotersappend(candidates_rank)

                  else

                  ranges = []

                  ranks = []

                  for prof in selfvoter_profiles

                  rangesappend(int(prof[pop_percentage]))

                  rank =

                  for index score in enumerate(prof[scores])

                  rank[index] = score

                  ranksappend(rank)

                  for index _range in enumerate(ranges)

                  for _ in range(int(selfN_VOTERS(_range100)))

                  selfvotersappend(ranks[index])

                  68

                  APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                  Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                  for i in range(selfN_CANDIDATES)

                  selfcandidates[i] = 0

                  selfvotes[i] = set()

                  APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                  Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                  for candidate in range(selfN_CANDIDATES)

                  rating_sum = 0

                  for voter in selfvoters

                  rating_sum += voter[candidate]

                  selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                  APEcircNDICE D ndash MEacuteTODO GET_MEAN

                  Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                  if len(winners) gt 1 or selfN_CANDIDATES gt 10

                  return selfcalculate_mean(winners)

                  else

                  chose_best = True if winners[0] == selfbest_candidate else

                  False

                  return selfstats[rsquomeansrsquo][winners[0]] chose_best

                  69

                  APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                  Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                  rating_sum = 0

                  for voter in selfvoters

                  for candidate in winners

                  rating_sum += voter[candidate]

                  return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                  APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                  Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                  for i in range(1 selfN_VACANCIES + 2)

                  selfleading_candidatesappend(selfsorted_candidates[-i][self

                  CANDIDATE_INDEX])

                  APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                  Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                  for leader in selfelecrounds[-1]

                  selfleading_candidatesappend(leader[0])

                  70

                  APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                  Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                  self_account_for_coalitions()

                  for voter in selfvoters

                  selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                  (1)))

                  temp = []

                  for voter in selfsorted_voters

                  new_dict = defaultdict(list)

                  for k in voter

                  new_dict[k[1]]append(k[0])

                  tempappend(new_dict)

                  selfsorted_voters = []

                  for voter_index current_voter in enumerate(temp)

                  new_voter = []

                  for rating candidate_indexes in current_voteritems()

                  if len(current_voter[rating]) gt 1

                  shuffle(current_voter[rating])

                  for e in candidate_indexes

                  new_voterappend((e rating))

                  else

                  new_voterappend((candidate_indexes[0] rating))

                  selfsorted_votersappend(new_voter)

                  selfcandidates[new_voter[-1][0]] += 1

                  selfvotes[new_voter[-1][0]]add(voter_index)

                  71

                  APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                  Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                  for candidate in selfvotes_copy

                  if candidate not in selfelecleading_candidates

                  for voter_index in selfvotes_copy[candidate]

                  for index _candidate in enumerate(reversed(selfelec

                  sorted_voters[voter_index]))

                  if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                  leading_candidates

                  if randomrandom() lt selfelec

                  tactical_vote_percentages[_candidate[selfelec

                  CANDIDATE_INDEX]]

                  selfrankings_changed[voter_index] = copy

                  deepcopy(selfelecsorted_voters[voter_index])

                  selfrankings_changed[voter_index][-(index + 1)]

                  selfrankings_changed[voter_index][-1] = self

                  rankings_changed[voter_index][-1] self

                  rankings_changed[voter_index][-(index + 1)]

                  selfcandidates[candidate] -= 1

                  selfcandidates[_candidate[selfelec

                  CANDIDATE_INDEX]] += 1

                  selfvotes[candidate]remove(voter_index)

                  selfvotes[_candidate[selfelecCANDIDATE_INDEX

                  ]]add(voter_index)

                  break

                  break

                  72

                  APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                  Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                  half_vacancies = mathfloor(selfelecN_VACANCIES2)

                  for candidate in selfelecleading_candidates

                  if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                  continue

                  for voter_index in selfvotes_copy[candidate]

                  if voter_index in selfrankings_changed

                  ranking = selfrankings_changed[voter_index]

                  else

                  ranking = copydeepcopy(selfelecsorted_voters[voter_index

                  ])

                  for index _candidate in enumerate(reversed(ranking))

                  if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                  leading_candidates or (_candidate[selfelec

                  CANDIDATE_INDEX] in selfelecleading_candidates and

                  selfelecleading_candidatesindex(_candidate[selfelec

                  CANDIDATE_INDEX]) gt= half_vacancies)

                  if _candidate[selfelecCANDIDATE_RANK] gt= 0

                  if randomrandom() lt selfelec

                  minority_vote_percentages[_candidate[selfelec

                  CANDIDATE_INDEX]]

                  selfcandidates[candidate] -= 1

                  selfcandidates[_candidate[selfelec

                  CANDIDATE_INDEX]] += 1

                  break

                  break

                  break

                  73

                  APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                  Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                  self_account_for_coalitions()

                  for candidate in selfvotes

                  if candidate = selfwinner and candidate = selfsecond_place

                  for voter_index in selfvotes[candidate]

                  if voter_index in selfrankings_changed

                  ranking = selfrankings_changed[voter_index]

                  else

                  ranking = copydeepcopy(selfelecsorted_voters[

                  voter_index])

                  for index2 candidate in enumerate(reversed(ranking))

                  if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                  selfcandidates[selfwinner] += 1

                  selfvotes[selfwinner]add(voter_index)

                  break

                  elif candidate[selfelecCANDIDATE_INDEX] == self

                  second_place

                  selfcandidates[selfsecond_place] += 1

                  selfvotes[selfsecond_place]add(voter_index)

                  break

                  selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                  winners = []

                  vacancies = selfelecN_VACANCIES

                  for candidate in reversed(selfsorted_candidates)

                  if vacancies == 0

                  break

                  winnersappend(candidate[0])

                  vacancies -= 1

                  mean chose_best = selfelecget_mean(winners = winners)

                  74

                  APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                  Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                  for voter_index voter in enumerate(selfelecsorted_voters)

                  voter_dict = dict()

                  og_voter_dict = dict()

                  for tup in voter

                  voter_dict[tup[0]] = tup[1]

                  og_voter_dict[tup[0]] = tup[1]

                  for coalition in selfeleccoalitions

                  for candidate in coalition

                  add_to_score = 0

                  for candidate2 in coalition

                  if candidate == candidate2

                  continue

                  half = og_voter_dict[candidate2[rsquovaluersquo]]2

                  if half lt 0

                  add_to_score += mathceil(half)

                  else

                  add_to_score += mathfloor(half)

                  if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                  voter_dict[candidate[rsquovaluersquo]] = 10

                  elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                  voter_dict[candidate[rsquovaluersquo]] = -10

                  else

                  voter_dict[candidate[rsquovaluersquo]] += add_to_score

                  selfrankings_changed[voter_index] = []

                  for candidate in voter_dict

                  selfrankings_changed[voter_index]append((candidate voter_dict[

                  candidate]))

                  selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                  voter_index] key=lambda x x[1])

                  75

                  APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                  Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                  selfelecroundsappend(selfsorted_candidates[_round])

                  if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                  N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                  N_VACANCIES - 1)

                  return 2

                  elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                  N_VOTERS gt 05)

                  return 1

                  else

                  selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                  CANDIDATE_INDEX])

                  for voter_index in selfvotes[selfsorted_candidates[_round][self

                  elecCANDIDATE_INDEX]]

                  if voter_index in selfrankings_changed

                  for candidate in reversed(selfrankings_changed[voter_index

                  ])

                  if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                  excluded

                  selfcandidates[candidate[selfelecCANDIDATE_INDEX

                  ]] += 1

                  selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                  add(voter_index)

                  break

                  else

                  continue

                  else

                  for candidate in reversed(selfelecsorted_voters[

                  voter_index])

                  if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                  excluded

                  selfcandidates[candidate[selfelecCANDIDATE_INDEX

                  ]] += 1

                  selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                  add(voter_index)

                  break

                  else

                  continue

                  selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                  return 0

                  76

                  APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                  Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                  for index in range(selfelecN_CANDIDATES)

                  selfcandidates[index] = 0

                  for voter in selfelecsorted_voters

                  for candidate in reversed(voter)

                  if candidate[selfelecCANDIDATE_SCORE] gt 0

                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                  else

                  break

                  APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                  Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                  for index in range(selfelecN_CANDIDATES)

                  selfcandidates[index] = 0

                  for voter in selfelecsorted_voters

                  if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                  elecCANDIDATE_INDEX]]

                  selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                  else

                  for candidate in reversed(voter)

                  if candidate[selfelecCANDIDATE_SCORE] gt 0

                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                  else

                  break

                  77

                  APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                  Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                  pos = set()

                  for index perc in enumerate(selfelectactical_vote_percentages)

                  if perc gt 0

                  posadd(index)

                  for candidate in selfeleccandidates

                  if candidate not in selfleading_candidates

                  for voter_index in selfvotes[candidate]

                  raised = None

                  for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                  ])

                  if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                  leading_candidates

                  if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                  if randomrandom() lt selfelectactical_vote_percentages[

                  candidate_tuple[selfelecCANDIDATE_INDEX]]

                  ranking = [None]selfelecN_CANDIDATES

                  ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                  selfelecvoters[voter_index][candidate_tuple[selfelec

                  CANDIDATE_INDEX]])

                  raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                  break

                  break

                  break

                  if raised = None

                  for _candidate in selfleading_candidates

                  if _candidate = ranking[-1][0]

                  ranking[0] = (_candidate selfelecvoters[voter_index][

                  _candidate])

                  buried = _candidate

                  break

                  i = 1

                  for candidate_tuple in selfelecsorted_voters[voter_index]

                  if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                  buried]

                  continue

                  else

                  ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                  selfelecvoters[voter_index][candidate_tuple[selfelec

                  CANDIDATE_INDEX]])

                  i += 1

                  selfrankings_changed[voter_index] = ranking

                  78

                  APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                  Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                  for voter_index in selfvotes[candidate]

                  if randomrandom() lt selfelectactical_vote_percentages[candidate

                  ]

                  for _candidate in selfleading_candidates

                  if _candidate = candidate

                  ranking = [None]selfelecN_CANDIDATES

                  ranking[0] = (_candidate selfelecvoters[voter_index][

                  _candidate])

                  buried = _candidate

                  break

                  i = 1

                  for candidate_tuple in selfelecsorted_voters[voter_index]

                  if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                  continue

                  else

                  ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                  selfelecvoters[voter_index][candidate_tuple[selfelec

                  CANDIDATE_INDEX]])

                  i += 1

                  selfrankings_changed[voter_index] = ranking

                  79

                  APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                  Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                  for index in range(selfelecN_CANDIDATES)

                  selfcandidates[index] = 0

                  for voter_index voter in enumerate(selfelecsorted_voters)

                  score = 0

                  if voter_index in selfrankings_changed

                  for candidate in selfrankings_changed[voter_index]

                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                  score += 1

                  else

                  for candidate in voter

                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                  score += 1

                  APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                  Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                  for voter_index voter in enumerate(selfelecsorted_voters)

                  if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                  elecCANDIDATE_INDEX]]

                  selfrankings_changed[voter_index] = copydeepcopy(selfelec

                  sorted_voters[voter_index])

                  for candidate_index candidate in enumerate(reversed(voter))

                  if candidate_index == 0

                  selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                  voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                  else

                  selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                  voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                  80

                  APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                  Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                  for index in range(selfelecN_CANDIDATES)

                  selfcandidates[index] = 0

                  for voter_index voter in enumerate(selfelecsorted_voters)

                  if voter_index in selfrankings_changed

                  for candidate in selfrankings_changed[voter_index]

                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                  selfelecCANDIDATE_RANK]

                  else

                  for candidate in voter

                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                  selfelecCANDIDATE_RANK]

                  APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                  Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                  for index in range(selfelecN_CANDIDATES)

                  selfcandidates[index] = 0

                  for voter in selfelecsorted_voters

                  votes = selfelecN_VACANCIES

                  for candidate in reversed(voter)

                  if votes == 0

                  break

                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                  votes -= 1

                  • Folha de aprovaccedilatildeo
                  • Agradecimentos
                  • Epiacutegrafe
                  • Resumo
                  • Abstract
                  • Lista de ilustraccedilotildees
                  • Lista de Coacutedigos
                  • Lista de tabelas
                  • Lista de abreviaturas e siglas
                  • Sumaacuterio
                  • INTRODUCcedilAtildeO
                    • MOTIVACcedilAtildeO E OBJETIVO
                    • MEacuteTODO
                    • ESTRUTURA
                      • SISTEMAS ELEITORAIS
                        • FISRT PAST THE POST
                          • Exemplo
                          • Vantagens e Desvantagens do FPTP
                          • Voto Uacutetil no FPTP
                            • TWO-ROUND SYSTEM
                              • Exemplo
                              • Vantagens e Desvantagens do TRS
                              • Voto Uacutetil no TRS
                                • INSTANT-RUNOFF VOTING
                                  • Exemplo
                                  • Vantagens e Desvantagens do IRV
                                  • Voto Uacutetil no IRV
                                    • APPROVAL VOTING SYSTEM
                                      • Exemplo
                                      • Vantagens e Desvantagens do AVS
                                      • Voto Uacutetil no AVS
                                        • THE BORDA COUNT
                                          • Exemplo
                                          • Vantagens e Desvantagens do BC
                                          • Voto Uacutetil no BC
                                            • SCORE VOTING SYSTEM
                                              • Exemplo
                                              • Vantagens e Desvantagens do SVS
                                              • Voto Uacutetil no SVS
                                                • BLOC VOTE
                                                  • Exemplo
                                                  • Voto Uacutetil no BV
                                                      • O SIMULADOR
                                                      • CENAacuteRIOS PERTINENTES
                                                        • CENAacuteRIO 1 VOTO TAacuteTICO
                                                        • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                        • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                        • CENAacuteRIO 4 COALIZOtildeES
                                                        • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                        • CENAacuteRIO 6 VOTO DE MINORIA
                                                          • COMO FUNCIONA O SIMULADOR
                                                            • CLASSE Elections
                                                            • CLASSE FirstPastThePost
                                                            • CLASSE TwoRoundSystem
                                                            • CLASSE InstantRunoffVoting
                                                            • CLASSE ApprovalVoting
                                                            • CLASSE BordaCount
                                                            • CLASSE ScoreVoting
                                                            • CLASSE BlocVote
                                                            • TECNOLOGIAS UTILIZADAS
                                                              • CONCLUSAtildeO
                                                              • Referecircncias
                                                              • Meacutetodo create_voters
                                                              • Meacutetodo create_candidates
                                                              • Meacutetodo calculate_means
                                                              • Meacutetodo get_mean
                                                              • Meacutetodo calculate_mean
                                                              • Meacutetodo set_leading_candidates
                                                              • Meacutetodo irv_set_leading_candidates
                                                              • Meacutetodo sort_ranks
                                                              • Meacutetodo fptp_count_tactical_votes
                                                              • Meacutetodo fptp_count_minority_votes
                                                              • Meacutetodo trs_second_round
                                                              • Meacutetodo trs_account_for_coalitions
                                                              • Meacutetodo irv_count_votes
                                                              • Meacutetodo avs_count_votes
                                                              • Meacutetodo avs_count_votes_with_tactical
                                                              • Meacutetodo irv_apply_tactical_votes
                                                              • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                              • Meacutetodo bc_sum_candidates_scores
                                                              • Meacutetodo svs_apply_tactical_votes
                                                              • Meacutetodo svs_sum_candidates_scores
                                                              • Meacutetodo bv_count_votes

                    LISTA DE TABELAS

                    Tabela 1 ndash Exemplo FPTP 18Tabela 2 ndash 2deg turno do TRS 20Tabela 3 ndash Exemplo IRV 22Tabela 4 ndash Desenvolvimento do IRV 22Tabela 5 ndash Exemplo AVS 24Tabela 6 ndash Resultado AVS 24Tabela 7 ndash Resultado BC 26Tabela 8 ndash Exemplo SVS 27Tabela 9 ndash Resultado SVS 27Tabela 10 ndash Exemplo BV 28Tabela 11 ndash Resultado BV 28Tabela 12 ndash Distribuiccedilatildeo de notas - Cenaacuterio 2 41Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2 42Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3 43Tabela 15 ndash Resultados do Cenaacuterio 3 44Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5 47Tabela 17 ndash Resultados do Cenaacuterio 5 48Tabela 18 ndash Resultados do Cenaacuterio 6 52

                    LISTA DE ABREVIATURAS E SIGLAS

                    FPTP First Past The Post

                    TRS Two-Round System

                    IRV Instant Runoff Voting

                    AVS Approval Voting System

                    BC Borda Count

                    SVS Score Voting System

                    BV Bloc Vote

                    SUMAacuteRIO

                    1 INTRODUCcedilAtildeO 1511 MOTIVACcedilAtildeO E OBJETIVO 1512 MEacuteTODO 1513 ESTRUTURA 15

                    2 SISTEMAS ELEITORAIS 1721 FISRT PAST THE POST 17211 Exemplo 18212 Vantagens e Desvantagens do FPTP 18213 Voto Uacutetil no FPTP 1922 TWO-ROUND SYSTEM 19221 Exemplo 20222 Vantagens e Desvantagens do TRS 20223 Voto Uacutetil no TRS 2123 INSTANT-RUNOFF VOTING 21231 Exemplo 22232 Vantagens e Desvantagens do IRV 22233 Voto Uacutetil no IRV 2324 APPROVAL VOTING SYSTEM 24241 Exemplo 24242 Vantagens e Desvantagens do AVS 24243 Voto Uacutetil no AVS 2525 THE BORDA COUNT 25251 Exemplo 25252 Vantagens e Desvantagens do BC 26253 Voto Uacutetil no BC 2626 SCORE VOTING SYSTEM 26261 Exemplo 27262 Vantagens e Desvantagens do SVS 27263 Voto Uacutetil no SVS 2727 BLOC VOTE 28271 Exemplo 28272 Voto Uacutetil no BV 29

                    3 O SIMULADOR 30

                    4 CENAacuteRIOS PERTINENTES 3441 CENAacuteRIO 1 VOTO TAacuteTICO 3442 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV 4143 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE 4344 CENAacuteRIO 4 COALIZOtildeES 4545 CENAacuteRIO 5 DILEMA DO PRISIONEIRO 4746 CENAacuteRIO 6 VOTO DE MINORIA 50

                    5 COMO FUNCIONA O SIMULADOR 5351 CLASSE Elections 5352 CLASSE FirstPastThePost 6053 CLASSE TwoRoundSystem 6254 CLASSE InstantRunoffVoting 6255 CLASSE ApprovalVoting 6356 CLASSE BordaCount 6357 CLASSE ScoreVoting 6358 CLASSE BlocVote 6459 TECNOLOGIAS UTILIZADAS 64

                    6 CONCLUSAtildeO 65

                    REFEREcircNCIAS 66

                    APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS 67

                    APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES 68

                    APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS 68

                    APEcircNDICE D ndash MEacuteTODO GET_MEAN 68

                    APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN 69

                    APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES 69

                    APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES 69

                    APEcircNDICE H ndash MEacuteTODO SORT_RANKS 70

                    APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES 71

                    APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES 72

                    APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND 73

                    APEcircNDICE L ndash MEacuteTODOTRS_ACCOUNT_FOR_COALITIONS 74

                    APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES 75

                    APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES 76

                    APEcircNDICE O ndash MEacuteTODOAVS_COUNT_VOTES_WITH_TACTICAL 76

                    APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES 77

                    APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES (CON-TINUACcedilAtildeO) 78

                    APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES 79

                    APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES 79

                    APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES 80

                    APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES 80

                    15

                    1 INTRODUCcedilAtildeO

                    Em toda eleiccedilatildeo existe pelo menos um grupo de indiviacuteduos que sai completamentedesfavorecido e insatisfeito com o resultado O contentamento completo de uma populaccedilatildeoeacute certamente improvaacutevel e muitas vezes impossiacutevel considerando a gama de candidatosque se dispotildee a concorrer Em todo caso o miacutenimo que pode ser feito eacute escolher demaneira eficiente o melhor candidato ao cargo dentre as opccedilotildees disponiacuteveis Diante dissoeacute necessaacuterio avaliar como essa escolha eacute feita e quais meacutetodos satildeo capazes de tornaacute-larealidade

                    11 MOTIVACcedilAtildeO E OBJETIVO

                    Em conformidade com o extenso nuacutemero de sistemas eleitorais pelo mundo este tra-balho tem como objetivo testar uma porccedilatildeo desses sistemas sob a simulaccedilatildeo de diferentescenaacuterios especiacuteficos a fim de determinar quais deles podem ser considerados como os maisjustos perante a taxa de satisfaccedilatildeo meacutedia da populaccedilatildeo

                    12 MEacuteTODO

                    Para que essa anaacutelise seja possiacutevel foi desenvolvido um programa que permite a criaccedilatildeoe configuraccedilatildeo de diferentes cenaacuterios onde os sistemas eleitorais seratildeo simulados Nele eacutepossiacutevel definir o nuacutemero total de eleitores e candidatos como esses eleitores iratildeo votar eo niacutevel de popularidade de cada candidato Aleacutem disso eacute possiacutevel formar coalizotildees entreos candidatos e escolher a porcentagem dos eleitores que optaratildeo pelo voto uacutetil Dessamaneira seraacute possiacutevel elaborar cenaacuterios que buscam expor os pontos fortes e fracos decada sistema

                    13 ESTRUTURA

                    Este trabalho eacute relatado ao longo de seis capiacutetulos No Capiacutetulo 2 seratildeo apresentados ossistemas eleitorais implementados no simulador suas vantagens e desvantagens conhecidase outras caracteriacutesticas especiacuteficas de cada um A intenccedilatildeo do capiacutetulo eacute tornar o textomais autocontido trazendo conceitos jaacute estudados que ajudaratildeo na melhor compreensatildeodos capiacutetulos seguintes por isso grande parte de sua composiccedilatildeo eacute oriunda de diferentesfontes consultadas

                    O Capiacutetulo 3 eacute uma apresentaccedilatildeo das funcionalidades que o simulador possui Seratildeoexplicados todos os campos de entrada e os dois modos distintos nos quais o programaopera

                    16

                    No Capiacutetulo 4 os sistemas seratildeo colocados em teste Todos seratildeo simulados em cenaacuteriosespeciacuteficos a fim de fazer sobressair aqueles com as maiores taxas de satisfaccedilatildeo meacutedia

                    A estrutura e implementaccedilatildeo do simulador seratildeo abordadas em detalhes no Capiacutetulo5 assim como uma breve descriccedilatildeo da stack utilizada Todos os meacutetodos relevantes aofuncionamento das simulaccedilotildees seratildeo explicados passo a passo

                    No Capiacutetulo 6 seratildeo apresentadas as conclusotildees referentes agrave anaacutelise dos resultadosobtidos no Capiacutetulo 4 e as consideraccedilotildees finais do projeto como um todo

                    17

                    2 SISTEMAS ELEITORAIS

                    Atualmente mais e mais paiacuteses estatildeo adotando sistemas democraacuteticos de governoCerca de 6 em 10 governos no mundo satildeo democracias (Pew Research Center 2017) o quepode ser observado na Figura 1 abaixo Em um sistema democraacutetico a populaccedilatildeo escolheseus liacutederes atraveacutes de seu sistema eleitoral Existem diversos sistemas eleitorais em usono mundo muitos dos quais satildeo usados em conjunto para eleger um uacutenico candidato Emvaacuterios paiacuteses mais de um sistema eleitoral pode ser utilizado tambeacutem em diferentes niacuteveisde governo tanto presidencial quanto estadual ou municipal Natildeo apenas imersos nomeio poliacutetico eles tambeacutem podem ser usados em escopos menores como em esportes oucompeticcedilotildees artiacutesticas poreacutem sempre com a finalidade de alocar um ou mais indiviacuteduosa determinado cargo ou tiacutetulo

                    Figura 1 ndash de paiacuteses de cada tipo de regime 1946-2016

                    Fonte Center of Systemic Peacersquos Polity IV Project

                    Os proacuteximos trecircs toacutepicos discutidos neste capiacutetulo referentes aos meacutetodos First Pastthe Post Two-Round System e Instant Runoff Voting possuem seus conceitos e infor-maccedilotildees relevantes com exceccedilatildeo dos exemplos traduzidos livremente do livro Behind theBallot Box A Citizenrsquos Guide to Voting Systems (AMY 2000)

                    21 FISRT PAST THE POST

                    O meacutetodo First Past the Post tambeacutem conhecido como Plurality Voting ou WinnerTakes All eacute o meacutetodo mais simples e direto e provavelmente o primeiro meacutetodo que sepensa quando se fala de eleiccedilotildees Os eleitores escolhem apenas um candidato e apoacutes a

                    18

                    contagem dos votos o candidato com o maior nuacutemero de votos eacute eleito O vencedor natildeonecessita da aprovaccedilatildeo de mais de 50 dos eleitores ele apenas precisa de uma pluralidadedos votos ou seja apenas possuir mais votos que os outros candidatos

                    Esse sistema eacute utilizado em escala nos Estados Unidos para a maior parte das eleiccedilotildeesvoltadas a eleger apenas um candidato como prefeitos e governadores aleacutem de ser usadana disputa presidencial Dentre outros paiacuteses que empregam o sistema em suas corridaspresidenciais estatildeo listados o Meacutexico as Filipinas a Coreia do Sul e a Venezuela

                    211 Exemplo

                    Tabela 1 ndash Exemplo FPTP

                    Candidatos VotosA 36B 25C 22D 17

                    Neste exemplo o candidato A possui uma pluralidade dos votos com 36 e ele eacute ocandidato eleito mesmo natildeo tendo uma maioria

                    212 Vantagens e Desvantagens do FPTP

                    A vantagem do FPTP eacute a sua simplicidade Natildeo eacute difiacutecil para um eleitor comumcompreender o seu funcionamento eles apenas precisam se decidir por um candidato Eletambeacutem eacute muito simples e direto na sua contagem e seleccedilatildeo do vencedor

                    Esse meacutetodo tambeacutem tende a criar listas de candidatos concorrentes mais curtasCandidatos independentes ou de partidos menores frequentemente acabam se sentindodesencorajados a concorrer devido agraves suas baixas chances de vitoacuteria Isso normalmentefornece aos eleitores uma faacutecil decisatildeo entre um ou dois candidatos dos maiores partidosao mesmo tempo poreacutem limitando suas opccedilotildees

                    No entanto sua essecircncia eacute sua principal desvantagem a pluralidade O fato do can-didato eleito natildeo necessitar de uma maioridade dos votos da populaccedilatildeo parece violaros princiacutepios baacutesicos da democracia Democracia eacute em sua origem o poder(kratos) nopovo(demos) poreacutem na pluralidade o poder de eleger um candidato pode residir emapenas uma fraccedilatildeo relativamente pequena do povo Em um cenaacuterio hipoteacutetico comapenas trecircs candidatos um deles apenas poderia necessitar de natildeo mais do que 34 dosvotos para ser eleito o que significa que no pior dos casos 66 da populaccedilatildeo rejeitao candidato eleito O cenaacuterio soacute piora com mais e mais candidatos concorrendo Paraquatro candidatos satildeo necessaacuterios 26 dos votos no pior dos casos para cinco satildeo 21 eassim por diante

                    19

                    213 Voto Uacutetil no FPTP

                    No FPTP tambeacutem existe a possibilidade de os eleitores evitarem votar em sua prefe-recircncia verdadeira No caso de sua preferecircncia natildeo aparentar ter boas chances de vitoacuteriamuitas vezes opta-se por uma segunda opccedilatildeo que esteja mais bem colocada nas eleiccedilotildeesO motivo disso eacute que nessas situaccedilotildees votar em sua preferecircncia pode parecer um des-perdiacutecio do seu voto e no pior dos cenaacuterios optar por natildeo transferir seu voto para umasegunda opccedilatildeo pode acabar resultando na eleiccedilatildeo de um candidato de seu desgosto As-sim votar de maneira verdadeira muitas vezes pode acabar prejudicando o eleitor que sevecirc forccedilado a abandonar seus interesses poliacuteticos mais imediatos e escolher o menor entredois(ou mais) males Os candidatos de partidos menores satildeo os que mais sofrem com essetipo de voto estrateacutegico por natildeo conseguirem agregar as maiores quantidades de votos

                    Entretanto ao mesmo tempo que partidos maiores roubam votos de partidos meno-res com os votos taacuteticos partidos menores tambeacutem tem a oportunidade de ganhar algunsvotos com o denominado spoiler effect Ao entrarem na eleiccedilatildeo candidatos de partidosmenores podem adquirir votos de candidatos mais populares que possuem inclinaccedilatildeo po-liacutetica semelhante Logo eacute possiacutevel que haja certo equiliacutebrio ao se contrapor as mudanccedilasde voto devido aos votos uacuteteis agraves mudanccedilas oriundas do spoiler effect

                    Poreacutem o spoiler effect natildeo necessariamente ocorre apenas entre partidos maiores emenores mas pode prejudicar candidatos de popularidades proacuteximas Por exemplo entretrecircs candidatos A B e C onde A representa determinada posiccedilatildeo no espectro poliacuteticoenquanto B e C possuem posiccedilotildees parecidas o que pode acontecer eacute B e C se prejudicaremmutuamente jaacute que ambos dividem os eleitores de um mesmo espectro poliacutetico Se esseespectro tem a maioria com 60 por exemplo com B e C compartilhando cada um 30dos votos o candidato A sairia vencedor com 40 mesmo que todos os eleitores de Bprefiram C e todos os eleitores de C prefiram B Esse exemplo demonstra claramente oproblema com os sistemas de pluralidade

                    22 TWO-ROUND SYSTEM

                    Uma das primeiras tentativas de lidar com a desvantagem dos sistemas por pluralidadeo Two-round System eacute usado desde o seacuteculo XIX no ocidente e atualmente ainda eacute utilizadoem corridas presidecircncias de paiacuteses como o Brasil Bulgaacuteria Chile Colocircmbia FinlacircndiaPolocircnia Portugal Ruacutessia e em inuacutemeras eleiccedilotildees locais nos Estados Unidos

                    O principal objetivo do TRS eacute garantir que o vencedor tenha conseguido uma maioriados votos Para isso as eleiccedilotildees satildeo estruturadas em duas rodadas de votaccedilatildeo Na primeirarodada os eleitores se dirigem agraves urnas e votam no candidato de sua preferecircncia Apoacutesa contagem se a quantidade de votos do candidato mais votado superar a proporccedilatildeo de50 natildeo haacute a necessidade de uma segunda rodada e este candidato eacute eleito No entantose este natildeo for o caso haveraacute uma segunda rodada com apenas os dois candidatos mais

                    20

                    votados Nesta rodada os eleitores retornam as urnas para escolher uma das duas opccedilotildeessendo eleito o candidato mais votado agora definitivamente com uma maioria dos votos

                    221 Exemplo

                    Utilizando a mesma distribuiccedilatildeo de votos descrita na tabela 1 Neste caso como ocandidato A natildeo possui uma maioria dos votos ele e o candidato B iratildeo concorrer em umsegundo turno Digamos que as distribuiccedilotildees dos votos dos eleitores dos candidatos C eD em relaccedilatildeo aos candidatos A e B satildeo as seguintes

                    Tabela 2 ndash 2deg turno do TRS

                    Candidatos Votos dos eleitoresde C

                    Votos dos eleitoresde D

                    Votos do 1degturno

                    A 7 5 36B 15 12 25

                    O candidato B agora eacute eleito com uma maioria dos votos 52 contra 48 do candidatoA

                    222 Vantagens e Desvantagens do TRS

                    Por ser parecido com o FPTP esse sistema tambeacutem eacute de faacutecil compreensatildeo do eleitorcomum poreacutem a maior vantagem do TRS eacute a garantia de que o candidato vencedor teraacute oapoio da maioria dos eleitores no segundo turno eliminando a pluralidade Argumenta-seque isso daacute maior legitimidade poliacutetica ao mandato do candidato eleito

                    O TRS tende a abrigar uma lista maior de candidatos sendo mais convidativo acandidatos de partidos menores mesmo que suas chances natildeo sejam maiores quandocomparadas agraves eleiccedilotildees sob o FPTP Mesmo assim essa listagem mais abrangente eacute umavantagem do sistema pois daacute aos eleitores uma variedade maior de opccedilotildees de voto

                    Em relaccedilatildeo agraves suas desvantagens o TRS possui duas principais A primeira satildeo oscustos elevados do sistema decorrentes da necessidade da organizaccedilatildeo de um segundoturno de votaccedilotildees A segunda eacute o aumento no iacutendice de ausecircncias dos eleitores agraves urnasEssa ampliaccedilatildeo no natildeo comparecimento dos eleitores se daacute tambeacutem devido ao segundoturno por pura fatiga eleitoral bem como consequecircncia da desistecircncia de eleitores queapoiam candidatos que jaacute foram eliminados

                    Outro ponto negativo do TRS eacute a sua natildeo-monotonicidade Isso significa que umcandidato pode ser prejudicado com um aumento em sua popularidade e suporte e domesmo modo um candidato pode se beneficiar com a perda de popularidade e suporteSe os candidatos A e B satildeo os esperados para ir ao segundo turno onde A eacute mais fortedo que B um aumento no suporte pelo candidato A pode resultar na sua derrota quandoesse aumento causa uma alteraccedilatildeo nos candidatos que satildeo selecionados para ir ao segundoturno Se esse aumento na popularidade de A resultar na eliminaccedilatildeo preacutevia de B um

                    21

                    terceiro candidato C pode ser vitorioso sobre A no segundo turno caso os eleitores de Bprefiram C ao candidato A Se natildeo houvesse esse crescimento de popularidade A teriaderrotado B no segundo turno Essa situaccedilatildeo seraacute vista em melhores detalhes na seccedilatildeo 43

                    223 Voto Uacutetil no TRS

                    Esse sistema minimiza os efeitos do voto uacutetil em relaccedilatildeo ao FPTP pois um eleitorqualquer pode tranquilamente votar em sua preferecircncia sem se preocupar em desperdiccedilaacute-lo mesmo que seu candidato natildeo tenha chances de vitoacuteria Se este natildeo for eleito aindapoderaacute escolher a sua preferecircncia dentre os dois candidatos que prosseguirem para osegundo turno

                    Apesar disso ainda existe um cenaacuterio em que o eleitor pode ser tentado a natildeo votar emsua preferecircncia Eacute possiacutevel que ele opte pela sua segunda opccedilatildeo se souber que sua primeiraopccedilatildeo possui miacutenimas chances de ir ao segundo turno ou ateacute mesmo por saber que issodiminuiraacute as chances de algum outro candidato ser eleito Mesmo assim eacute evidente queo TRS natildeo proporciona o mesmo apelo ao voto taacutetico que o FPTP

                    Outra caracteriacutestica do TRS eacute o incentivo a formaccedilatildeo de coalizotildees entre candidatosde partidos mais populares com candidatos de partidos menos populares As coalizotildeesfornecem benefiacutecios agrave ambas as partes onde os candidatos classificados para o segundoturno em geral se juntam a candidatos jaacute eliminados com a intenccedilatildeo de agregar maisvotos enquanto os candidatos jaacute eliminados apoiam um dos dois classificados na esperanccedilade inserir propostas proacuteprias ou modificaccedilotildees agrave chapa deles

                    23 INSTANT-RUNOFF VOTING

                    Instant Runoff Voting foi uma alternativa aos meacutetodos FPTP e TRS desenvolvidanos anos 70 por um professor do Instituto de Tecnologia de Massachusetts(MIT) O IRVelimina as principais desvantagens desses outros dois sistemas a pluralidade do FPTP e anecessidade de mais de uma rodada de votaccedilatildeo do TRS Este meacutetodo tambeacutem opera emmais de uma rodada poreacutem como o proacuteprio nome sugere essas rodadas satildeo instantacircneasnatildeo sendo necessaacuterio o retorno dos eleitores agraves urnas Atualmente ele eacute utilizado naIrlanda nas eleiccedilotildees presidenciais em Londres na eleiccedilatildeo de seu prefeito e em distritosindividuais na Austraacutelia para eleger membros de sua cacircmara baixa do parlamento OIRV tambeacutem eacute usado por vaacuterias organizaccedilotildees privadas nos Estados Unidos incluindoa American Political Science Association e a American Psychological Association paraeleger seus funcionaacuterios

                    Nesse sistema os eleitores natildeo satildeo solicitados a votar em um uacutenico candidato aoinveacutes disso eles listam todos os candidatos concorrentes na ordem de sua preferecircnciaA partir dessas listas as primeiras opccedilotildees de cada eleitor recebem o seu voto e apoacutes acontagem se um candidato obtiver 50 dos votos mais um este candidato eacute eleito Se

                    22

                    isso natildeo ocorrer o candidato menos votado eacute eliminado das eleiccedilotildees e seus votos satildeotransferidos para a segunda opccedilatildeo de cada um de seus eleitores Esse procedimento serepete eliminando o candidato menos votado a cada rodada ateacute que algum dos candidatospossuam a maioridade dos votos

                    231 Exemplo

                    Na tabela 3 pode-se verificar a distribuiccedilatildeo de votos por perfil de eleitor e na tabela4 vecirc-se o desenvolvimento do IRV para essas distribuiccedilotildees O candidato D eacute o menosvotado e por consequecircncia eacute o primeiro a ser eliminado A segunda opccedilatildeo de todos oseleitores que votaram no candidato D eacute o candidato C por isso este recebe todos os votosdistribuiacutedos na segunda rodada Com isso o candidato B eacute eliminado com 25 dos votos eos candidatos A e C concorrem na uacuteltima rodada Mesmo com o candidato C na lideranccedilana segunda rodada a maior parte dos eleitores do B tem como preferecircncia o candidatoA por isso A eacute eleito com 55 dos votos contra 45 do C

                    Tabela 3 ndash Exemplo IRV

                    Rankings Ndeg de eleitoresABCD 20ABDC 16BDAC 19BDCA 6CABD 7CDBA 15DCAB 5DCBA 12

                    Tabela 4 ndash Desenvolvimento do IRVTurnos D C B A

                    1 17 22 25 362 eliminado 39 25 363 eliminado 45 eliminado 55

                    232 Vantagens e Desvantagens do IRV

                    Assim como no TRS a pluralidade eacute irrelevante no IRV e um candidato soacute eacute eleitocom a maioridade dos votos dando maior legitimidade ao mandato deste No entantopode-se argumentar que o IRV faz isso com mais eficiecircncia pois natildeo requer a execuccedilatildeode mais de uma rodada de votaccedilotildees Isso diminui os custos das eleiccedilotildees como um todoao mesmo tempo que proporciona um nuacutemero menor de isenccedilotildees por parte dos eleitoresdevido ao desgaste de todo o processo eleitoral

                    23

                    Aleacutem disso candidatos de partidos menores tendem a receber mais votos do queno FPTP e portanto satildeo mais encorajados a se candidatar Com uma lista maior decandidatos eleitores desfrutam de uma variedade maior de opccedilotildees de voto Contudomesmo com mais candidatos menos populares o spoiler effect mencionado anteriormentetambeacutem natildeo possui espaccedilo nesse sistema de votaccedilatildeo Partidos menores natildeo tem comoroubar votos de partidos maiores visto que esses votos eventualmente seratildeo transferidosde volta a eles durante o desenvolvimento das rodadas do IRV

                    Em virtude de sua estrutura acredita-se que esse meacutetodo tende a encorajar os can-didatos tambeacutem a elaborar suas campanhas de forma mais abrangente ampliando suainfluecircncia para mais do que apenas um grupo especiacutefico de maneira que ele consiga agre-gar votos de segunda ou terceira opccedilatildeo aleacutem dos votos de seus eleitores principais

                    A principal desvantagem do IRV eacute o fato de ele ainda natildeo ser amplamente utilizado aoredor do mundo Essa falta de familiaridade do sistema pode causar confusatildeo ao eleitorcomum em suas primeiras ocorrecircncias No entanto nos paiacuteses em que este eacute utilizadonatildeo parece haver confusatildeo entre os eleitores Aleacutem disso na maioria dos casos haveraacute umcusto potencialmente alto da substituiccedilatildeo ou alteraccedilatildeo dos sistemas das urnas eletrocircnicaspara que seja possiacutevel haver a implementaccedilatildeo do meacutetodo

                    Aleacutem disso assim como o TRS este sistema tambeacutem possui natildeo-monotonicidade ouseja um candidato pode ser prejudicado ao ser ranqueado mais alto enquanto que outropode se beneficiar sendo ranqueado mais baixo pelos eleitores (ORNSTEIN 2018) issopode ocorrer quando esse ranqueamento causa alteraccedilotildees na ordem em que os candidatossatildeo eliminados Essa caracteriacutestica se manifesta em fenocircmenos complexos e especiacuteficos epor isso um exemplo de sua ocorrecircncia seraacute abordada em detalhes na seccedilatildeo 43

                    233 Voto Uacutetil no IRV

                    Como os sistemas de votaccedilatildeo anteriores o IRV natildeo eacute completamente imune ao vototaacutetico No entanto este meacutetodo se mostra bem resistente a eles quando comparado aoutros meacutetodos como o FPTP e o Borda Count (Bartholdi John J III and Orlin JamesB 1990) Distintivamente o IRV requer um maior esforccedilo do eleitor para elaborar umaestrateacutegia que melhor ajuste os resultados da eleiccedilatildeo de acordo com a sua preferecircnciaAleacutem disso eacute necessaacuterio que ele tenha informaccedilatildeo suficiente sobre os rankings de outroseleitores naturalmente obtida atraveacutes de pesquisas eleitorais

                    Existe tambeacutem a possibilidade de ocorrer uma exaustatildeo dos votos quando natildeo haacuteo completo preenchimento do ranking por parte dos eleitores Nessas ocasiotildees o votonatildeo pode continuar a ser transferido a outros candidatos e ele eacute descartado Isso afetaa legitimidade do mandato do candidato eleito pois o resultado final natildeo representaraacute100 da populaccedilatildeo votante Essas ocorrecircncias no entanto podem ser minimizadas comuma melhor educaccedilatildeo eleitoral ou como foi implementado na Austraacutelia requerer que osrankings incluam uma totalidade dos candidatos concorrentes

                    24

                    24 APPROVAL VOTING SYSTEM

                    No meacutetodo Approval Voting os eleitores natildeo satildeo limitados pelo nuacutemero de candidatosem que podem votar por isso approval cada eleitor pode votar em todos os candidatos osquais ele aprova Apoacutes as votaccedilotildees o candidato com a maior quantidade de votos eacute eleitoSegundo Hamlin (2015) a cidade de Fargo na Dakota do Norte se tornou a primeiracidade nos EUA a colocar em praacutetica este sistema em suas eleiccedilotildees gerais em novembrode 2018 AVS tambeacutem eacute utilizado para eleger o secretaacuterio-geral das Naccedilotildees Unidas e emdiversas outras organizaccedilotildees

                    241 Exemplo

                    Na tabela 5 abaixo pode-se encontrar 8 perfis de eleitores com seus candidatos apro-vados e quantidade de eleitores que se encaixam no perfil Na tabela 6 temos o resultadoda contabilizaccedilatildeo dos votos destes perfis O candidato mais popular eacute o B que se encontraaprovado em 5 perfis distintos totalizando 60 votos ou aproximadamente 32

                    Tabela 5 ndash Exemplo AVS

                    Aprovaccedilotildees Ndeg de eleitoresA 20AB 16B 19

                    BDC 6CAB 7CD 15DC 5DCB 12

                    Tabela 6 ndash Resultado AVSCandidatos Total de votos

                    A 43B 60C 45D 38

                    242 Vantagens e Desvantagens do AVS

                    Aleacutem de simples este meacutetodo permite um niacutevel maior de expressividade aos eleitoresOnde no FPTP e TRS eles satildeo limitados pelo seu uacutenico voto aqui os eleitores tecircm aliberdade de demonstrar exatamente quais candidatos consideram aptos ou aceitaacuteveis aocargo

                    25

                    Outro efeito dessa liberdade trazida pelo AVS eacute a dizimaccedilatildeo do spoiler effect Can-didatos de partidos menores natildeo tem como roubar votos de partidos maiores nessesistema ambos os candidatos contabilizariam o voto

                    243 Voto Uacutetil no AVS

                    O tipo de voto uacutetil no AVS eacute denominado bullet voting Segundo The Center forElection Science (2015) esta taacutetica envolve simplesmente ignorar a possibilidade de votarem mais de um candidato e votar apenas em sua primeira opccedilatildeo Um eleitor pode serlevado a adotar essa estrateacutegia quando percebe que sua preferecircncia pode ser prejudicadacom o voto em alguma segunda opccedilatildeo sua Em um cenaacuterio extremo onde 100 doseleitores adotam esta estrateacutegia as eleiccedilotildees satildeo convertidas a um simples First Past ThePost

                    25 THE BORDA COUNT

                    Este meacutetodo carrega o nome em homenagem a seu criador Jean-Charles de Bordaque o desenvolveu em 1770 (LIPPMAN 2012) A contagem de Borda utiliza a abordagemde ranqueamento dos candidatos poreacutem de maneira diferente ao IRV Este eacute um sistemaque atribui uma pontuaccedilatildeo aos candidatos com base nestes rankings O candidato na basedo ranking natildeo recebe pontos o candidato imediatamente acima deste recebe 1 pontoo proacuteximo recebe 2 pontos e assim por diante ateacute o topo do ranking As pontuaccedilotildees detodos os rankings satildeo contabilizadas e o candidato com maior pontuaccedilatildeo eacute eleito Deacordo com Lippman variaccedilotildees deste meacutetodo satildeo encontradas em uso na premiaccedilatildeo dediversos esportes como na seleccedilatildeo do MVP(Most Valuable Player) da MLB(principal ligade beisebol dos EUA) e no Trofeacuteu Heisman de futebol americano universitaacuterio

                    251 Exemplo

                    Neste exemplo seratildeo aproveitados os mesmos rankings apresentados na tabela 3 Porserem 4 candidatos o primeiro colocado de cada ranking receberaacute 3 pontos o segundo 2pontos o terceiro 1 e o quarto 0 Assim o nuacutemero maacuteximo de pontos que um candidatopode atingir eacute igual a 300(se ficar na primeira posiccedilatildeo em todos os rankings) e o nuacutemerototal de pontos no sistema eacute 600 O nuacutemero maacuteximo de pontos que um candidato podeatingir eacute calculado com

                    (cminus 1)times e

                    Sendo c igual ao nuacutemero de candidatos e e o nuacutemero de eleitores Por sua vez onuacutemero total de pontos no sistema eacute

                    26

                    (cminus 1)times c2

                    times e

                    A contagem final dos pontos eacute apresentada na tabela 7 abaixo

                    Tabela 7 ndash Resultado BCCandidatos Total de pontos

                    A 146B 181C 126D 147

                    O candidato eleito eacute o B com 181 pontos ou aproximadamente 60 da pontuaccedilatildeomaacutexima

                    252 Vantagens e Desvantagens do BC

                    Em comparaccedilatildeo com os meacutetodos abordados anteriormente que apenas consideramas primeiras opccedilotildees de cada eleitor este meacutetodo regularmente escolhe candidatos comaceitaccedilatildeo mais ampla ao inveacutes de uma preferecircncia direta dos eleitores (Electoral ReformSociety 2017b)

                    Ele tambeacutem encoraja uma abordagem estrateacutegica por parte dos partidos onde seriade seu interesse nomear mais de um candidato para concorrer pois quanto mais candi-datos estatildeo no paacutereo maior eacute a pontuaccedilatildeo dos primeiros colocados Logo a nomeaccedilatildeo decandidatos menos populares pode beneficiar os principais candidatos de um partido

                    253 Voto Uacutetil no BC

                    Existem duas estrateacutegias aplicaacuteveis a esse sistema A primeira denominada compromi-sing de maneira similar a outros meacutetodos de votaccedilatildeo se resume em ranquear em primeirolugar um dos candidatos que estejam liderando as eleiccedilotildees mesmo que este natildeo seja suapreferecircncia real A segunda estrateacutegia burying eacute o oposto esta se baseia em ranquearem uacuteltimo lugar um dos candidatos liacutederes mesmo que este natildeo seja o seu candidato demaior desgosto Ambas estrateacutegias podem ser aplicadas ao mesmo tempo por um eleitor

                    26 SCORE VOTING SYSTEM

                    Score Voting ou Range Voting como tambeacutem eacute conhecido eacute mais um meacutetodo quetenta trazer maior liberdade de expressatildeo aos eleitores Assim como o Borda Counteste sistema funciona baseado na pontuaccedilatildeo dos candidatos no entanto ao inveacutes dessapontuaccedilatildeo ser relativa agrave posiccedilatildeo do candidato no ranking de cada eleitor este por sua veztem completa liberdade de atribuir qualquer quantidade de pontos aos candidatos dentro

                    27

                    de determinada escala Um eleitor pode dar o mesmo nuacutemero de pontos para diferentescandidatos e apoacutes o somatoacuterio de todas as pontuaccedilotildees o candidato com a pontuaccedilatildeo maisalta eacute eleito Incorporado ao escopo poliacutetico o SVS eacute utilizado no Partido Pirata Alematildeobem como em diversas organizaccedilotildees tais como o Fedora Project e Mozilla e tambeacutem emvariados esportes oliacutempicos e reality shows como o American Idol aponta Hamlin (2015)

                    261 Exemplo

                    Neste exemplo temos apresentados na tabela 8 abaixo 4 perfis distintos de eleitorese suas respectivas atribuiccedilotildees de pontos aos 4 candidatos Cada eleitor pode atribuirqualquer pontuaccedilatildeo a um candidato dentro da escala de -10 a 10 O resultado da eleiccedilatildeoapoacutes a soma de todos os pontos por candidato se encontra na tabela 9 onde o candidatoA eacute eleito com um total de 605 pontos

                    Tabela 8 ndash Exemplo SVS

                    Perfil A B C D Ndeg de eleitores1 10 -1 5 2 362 6 9 -3 4 253 2 0 8 4 224 3 3 3 10 17

                    Tabela 9 ndash Resultado SVSCandidatos Total de pontos

                    A 605B 240C 332D 430

                    262 Vantagens e Desvantagens do SVS

                    A grande vantagem do SVS eacute como ele proporciona aos eleitores expressar de maneiramuito proacutexima potencialmente exata suas impressotildees poliacuteticas de cada candidato Eleeacute ainda mais expressivo que o AVS Dessa maneira o spoiler effect tambeacutem se torna nuloao passo que toda intenccedilatildeo de voto eacute precisamente representada neste sistema

                    Assim como outros meacutetodos eleitorais este sofre igualmente dos males produzidos pelovoto taacutetico Sua principal desvantagem eacute discutida na seccedilatildeo abaixo

                    263 Voto Uacutetil no SVS

                    Da mesma maneira que no Approval Voting atraveacutes do bullet voting o SVS tambeacutempode ser convertido em uma eleiccedilatildeo sob o meacutetodo FPTP em um cenaacuterio com um grande

                    28

                    volume de eleitores maliciosos O voto uacutetil sob este sistema se manifesta pontuando-seapenas um candidato com uma nota positiva e todos os outros com as notas mais baixasda escala Se todos os eleitores se aproveitarem dessa abordagem natildeo existiraacute distinccedilatildeoefetiva entre uma eleiccedilatildeo sob SVS e FPTP Essencialmente cada eleitor estaacute votando emapenas um candidato Essa eacute a principal desvantagem do SVS e ela consegue eliminarsua principal vantagem dar ao eleitor um poder maior de expressatildeo

                    27 BLOC VOTE

                    O Bloc Vote eacute um meacutetodo utilizado para a eleiccedilatildeo de candidatos a cargos no governocom mais de uma vacacircncia Pode ser considerado um meio-termo entre o FPTP e oAVS pois os eleitores podem votar em mais de um candidato poreacutem satildeo limitados pelonuacutemero de vagas Em uma eleiccedilatildeo com duas vagas por exemplo cada eleitor selecionaraacutedois candidatos ou menos Sensatamente o candidato mais votado eacute eleito Ele possuialgumas utilizaccedilotildees em eleiccedilotildees locais em algumas partes da Inglaterra (Electoral ReformSociety 2017a)

                    271 Exemplo

                    Neste exemplo dois candidatos seratildeo eleitos logo cada eleitor votaraacute em no maacuteximodois candidatos A distribuiccedilatildeo de votos pode ser conferida na tabela 10 e o resultado dacontagem de votos na tabela 11 abaixo Os candidatos eleitos satildeo o C totalizando 78do maacuteximo de votos possiacuteveis para um candidato e o A com 43

                    Tabela 10 ndash Exemplo BV

                    Aprovaccedilotildees Ndeg de eleitoresAC 20AB 16BC 19BD 6CA 7CD 15DC 17

                    Tabela 11 ndash Resultado BVCandidatos Total de votos

                    A 43B 41C 78D 38

                    29

                    272 Voto Uacutetil no BV

                    Neste sistema eacute possiacutevel que um eleitor evite votar em sua primeira opccedilatildeo quandoeste natildeo tem chances de vitoacuteria e se fazendo isto ele diminuiraacute as chances de algum outrocandidato de seu desgosto ganhar Poreacutem o sistema previne um outro tipo de voto uacutetilEm eleiccedilotildees com mais de uma vaga onde os eleitores soacute podem votar em um candidatose um eleitor sabe que sua primeira opccedilatildeo tambeacutem eacute a primeira opccedilatildeo da maior parteda populaccedilatildeo e portanto muito provavelmente seraacute um dos candidatos eleitos eacute possiacutevelque ele arrisque votar em uma segunda opccedilatildeo sua na esperanccedila de a longo prazo elegersuas duas principais opccedilotildees de voto Com os eleitores podendo votar no nuacutemero exato devagas disponiacuteveis esse tipo de pensamento taacutetico perde o sentido

                    30

                    3 O SIMULADOR

                    Para este trabalho foi implementado um simulador eleitoral na forma de uma aplicaccedilatildeoweb para que a interaccedilatildeo do usuaacuterio fosse facilitada Veremos a seguir como se daacute suautilizaccedilatildeo de forma geral

                    Figura 2 ndash Captura de tela 1

                    Figura 3 ndash Captura de tela 2

                    A primeira opccedilatildeo encontrada pelo usuaacuterio eacute a escolha de quais sistemas de votaccedilatildeo se-ratildeo simulados (Figura 2) Todos eles podem ser selecionados para rodar simultaneamentePoreacutem natildeo eacute permitido rodar uma simulaccedilatildeo do Bloc Vote para uma eleiccedilatildeo onde apenasum candidato eacute eleito aleacutem disso natildeo existe implementaccedilatildeo dos meacutetodos TRS e IRV para

                    31

                    eleiccedilotildees com mais de um candidato eleito jaacute que eles se comportariam exatamente comono FPTP

                    A maioria das linguagens de programaccedilatildeo senatildeo todas possuem um gerador de nuacuteme-ros pseudoaleatoacuterios que fornece a possibilidade de definir uma seed para o gerador Estaseed funciona como um ponto de partida para a geraccedilatildeo dos nuacutemero e portanto todasimulaccedilatildeo que rodar com a mesma seed sempre teraacute os mesmos resultados Se nenhumvalor for fornecido pelo usuaacuterio o tempo atual do sistema eacute utilizado As opccedilotildees subse-quentes satildeo a escolha do nuacutemero de eleitores gerados e o nuacutemero de vagas (Figura 3) Senenhum valor for fornecido o nuacutemero de eleitores padratildeo utilizado eacute 1000 e o nuacutemero devagas igual a 1

                    Figura 4 ndash Captura de tela 3

                    Este simulador possui dois modos para a criaccedilatildeo dos rankings dos eleitores No modoManipulate (Figura 4) primeiramente se define o nuacutemero de candidatos atraveacutes do campode entrada ao lado do tiacutetulo Candidates ou alternativamente pode-se adicionar candida-tos um a um atraveacutes do sinal de mais na parte inferior da paacutegina Para cada candidatoeacute possiacutevel definir a porcentagem de seus eleitores que optaraacute pelo voto taacutetico e pelovoto de minoria Tambeacutem eacute possiacutevel alterar o nome dos candidatos se for do interessedo usuaacuterio

                    32

                    Figura 5 ndash Captura de tela 4

                    Figura 6 ndash Captura de tela 5

                    33

                    Figura 7 ndash Captura de tela 6

                    Apoacutes a criaccedilatildeo dos candidatos o usuaacuterio pode criar perfis de eleitores que definiratildeo demaneira exata como partes da populaccedilatildeo iraacute votar (Figura 5) Em cada perfil se defineo valor em porcentos da populaccedilatildeo votante que o adotaraacute e a nota de cada candidatoTambeacutem eacute possiacutevel nomear cada perfil livremente

                    No modo Generate (Figura 6) eacute onde o gerador de nuacutemeros pseudoaleatoacuterios eacute usadoNesse modo ao inveacutes do usuaacuterio criar perfis de eleitores ele define qual seraacute a distribuiccedilatildeoadotada para a geraccedilatildeo de notas de cada candidato Essas distribuiccedilotildees seratildeo mais bemdetalhadas no Capiacutetulo 5 Da mesma maneira que no modo Manipulate nesse modotambeacutem eacute possiacutevel definir os valores para os dois tipos de voto uacutetil os votos taacuteticos eos votos de minoria No primeiro estatildeo incluiacutedas as estrateacutegias de mudanccedila de votoespeciacuteficas de cada sistema como o bullet voting no AVS e SVS ou quando a preferecircnciade um eleitor claramente natildeo possui chances de vitoacuteria e ele muda seu voto para um doscandidatos que esteja na lideranccedila o que ocorre no FPTP e TRS O voto de minoriase apresenta apenas no FPTP em eleiccedilotildees onde mais de um candidato eacute eleito Se apreferecircncia de um eleitor claramente lidera a eleiccedilatildeo por ser tambeacutem a preferecircncia damaior parte da populaccedilatildeo esse eleitor pode mudar o seu voto para uma segunda opccedilatildeona esperanccedila de eleger dois de seus candidatos favoritos

                    Por fim em ambos os modos o usuaacuterio tem a opccedilatildeo de definir coalizotildees entre oscandidatos se o sistema TRS estiver habilitado pois as coalizotildees apenas se manifestamnesse sistema Essas coalizotildees alteraratildeo as notas dos candidatos dependendo dos outroscandidatos pertencentes a elas (Figura 7)

                    A aplicaccedilatildeo pode ser encontrada na paacutegina httpelectionsimpythonanywherecom

                    34

                    4 CENAacuteRIOS PERTINENTES

                    Para todos os cenaacuterios deste capiacutetulo seraacute usada a seed do simulador igual a 100 e apopulaccedilatildeo de eleitores igual a 1000 para que exista consistecircncia na anaacutelise e tambeacutem paraque possa haver replicaccedilatildeo dos resultados se necessaacuterio

                    41 CENAacuteRIO 1 VOTO TAacuteTICO

                    Neste exemplo teremos quatro candidatos Ana Beto Carla e Diego Ana e Betoseratildeo gerados a partir da distribuiccedilatildeo Neutral (Figura 47) Carla da distribuiccedilatildeo Disliked(Figura 51) e Diego da Hated (Figura 55) Para a simulaccedilatildeo com a seed 100 o melhorcandidato a ser eleito ou seja aquele que maximiza a meacutedia das notas dos eleitores eacute oBeto com uma meacutedia de 0073 Para cada sistema seratildeo comparados os resultados semvoto taacutetico aos com 20 de voto taacutetico a favor da Ana Abaixo se encontram osresultados para o sistema FPTP

                    Figura 8 ndash FPTP - Cenaacuterio 1 sem voto taacutetico

                    Figura 9 ndash TRS segundo turno - Cenaacuterio 1 sem voto taacutetico

                    35

                    Figura 10 ndash IRV primeiro turno - Cenaacuterio 1

                    Figura 11 ndash IRV segundo turno - Cenaacuterio 1

                    Figura 12 ndash IRV terceiro turno - Cenaacuterio 1

                    36

                    Figura 13 ndash AVS - Cenaacuterio 1 sem voto taacutetico

                    Figura 14 ndash BC - Cenaacuterio 1 sem voto taacutetico

                    Figura 15 ndash SVS - Cenaacuterio 1 sem voto taacutetico

                    37

                    Nesse cenaacuterio sem voto taacutetico o uacutenico sistema que natildeo elege o Beto eacute o AVS Todosos outros elegem o melhor candidato Ou seja apesar de Beto ter uma melhor meacutediadas notas dos eleitores existem mais eleitores que ranqueiam Ana com uma nota acimade 0 No entanto apenas 20 dos eleitores de Diego e Carla que preferem a Ana aoinveacutes do Beto satildeo o suficiente para fazer Beto natildeo ser eleito se eles decidirem abandonarsua primeira opccedilatildeo e votar na Ana Considerando a vantagem que os votos taacuteticosproporcionam agrave Ana esta eacute eleita em todos os sistemas menos o TRS e o IRV

                    Figura 16 ndash FPTP - Cenaacuterio 1 - 20 de voto taacutetico na Ana

                    Figura 17 ndash TRS segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                    38

                    Figura 18 ndash IRV primeiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                    Figura 19 ndash IRV segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                    Figura 20 ndash IRV terceiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                    39

                    Figura 21 ndash AVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                    Figura 22 ndash BC - Cenaacuterio 1 20 de voto taacutetico na Ana

                    Figura 23 ndash SVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                    40

                    Eacute claro que se os eleitores que preferem o Beto tambeacutem votassem de maneira estra-teacutegica a situaccedilatildeo se equilibraria e haveria o mesmo niacutevel de concorrecircncia entre os doiscandidatos que ocorre quando natildeo haacute voto taacutetico Poreacutem no Borda Count esse equiliacute-brio pode natildeo acontecer e as estrateacutegias de compromising e burying podem acabar saindopela culatra se uma porcentagem elevada dos eleitores as adotarem Abaixo encontram-seos resultados para esse sistema quando 100 dos eleitores de Carla e Diego se comportammaliciosamente

                    Figura 24 ndash BC - Cenaacuterio 1 100 de voto taacutetico na Ana e Beto

                    Por causa do uso demasiado da estrateacutegia burying Ana e Beto perdem muitos pontose isso abre espaccedilo para uma vitoacuteria da Carla No entanto para porcentagens menores que100 o Beto ainda eacute o vencedor

                    Essas duas estrateacutegias tambeacutem foram implementadas nesse simulador para o sistemaIRV e eacute possiacutevel ver como ele eacute resistente a elas Para que seja possiacutevel mudar os resultadosde uma eleiccedilatildeo sob o IRV eacute necessaacuterio mudar a ordem de eliminaccedilatildeo dos candidatos paraque o seu candidato preferido acabe enfrentando um candidato mais fraco nas rodadasfinais Isso natildeo ocorre com compromising e burying No proacuteximo cenaacuterio seraacute analisadacomo eacute possiacutevel modificar os resultados de uma eleiccedilatildeo sob o IRV

                    Esses resultados podem ser replicados acessando os linksSem votos taacuteticos lthttpelectionsimpythonanywherecomdirect_res1111110

                    --[0021][22Ana2222Beto222022Carla2222Diego22]------100gt

                    Com 20 de voto taacutetico lthttpelectionsimpythonanywherecomdirect_res1111110--[0021][22Ana222022Beto2222Carla2222Diego22]1-[02000]---100gt

                    Com 100 de voto taacuteticona Ana e Beto lthttpelectionsimpythonanywherecomdirect_res0000100--[0021][22Ana222022Beto222022Carla2222Diego22]1-[101000]---100gt

                    41

                    42 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV

                    Neste cenaacuterio teremos Ana Carla e Beto concorrendo e trecircs perfis distintos que apoiamcada candidato As distribuiccedilotildees de notas dos perfis se encontram na tabela abaixo

                    Tabela 12 ndash Distribuiccedilatildeo de notas - Cenaacuterio 2

                    Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                    deeleitores

                    1 10 5 0 422 0 10 5 303 5 0 10 28

                    Com essas distribuiccedilotildees Carla eacute eliminada na primeira rodada e seus 28 de votossatildeo transferidos para a segunda opccedilatildeo de seus eleitores Ana que eacute eleita com 70 dosvotos e uma meacutedia de 56

                    Figura 25 ndash IRV primeiro turno - Cenaacuterio 2

                    Figura 26 ndash IRV segundo turno - Cenaacuterio 2

                    42

                    Cientes desse provaacutevel futuro cenaacuterio onde Ana eacute eleita uma pequena parte dos elei-tores de Beto estrategicamente o abandona e decide apoiar Carla na esperanccedila de leva-laao segundo turno contra Ana As novas distribuiccedilotildees de notas se encontram na tabelaabaixo com essa porccedilatildeo de eleitores representada pelo perfil 4

                    Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2

                    Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                    deeleitores

                    1 10 5 0 422 0 10 5 283 5 0 10 284 0 8 10 2

                    Essa mudanccedila estrateacutegica de voto altera a ordem de eliminaccedilotildees do sistema com Betosendo o primeiro a ser eliminado Com isso seus votos satildeo naturalmente transferidos paraCarla que derrota Ana no segundo turno com 58 dos votos

                    Figura 27 ndash IRV primeiro turno com voto taacutetico - Cenaacuterio 2

                    Figura 28 ndash IRV segundo turno com voto taacutetico - Cenaacuterio 2

                    43

                    Percebendo que a eleiccedilatildeo de Beto natildeo era provaacutevel seus eleitores conseguiram aomenos impedir a eleiccedilatildeo do pior candidato para eles Mas para isso foi necessaacuterio queeles tivessem a informaccedilatildeo de como os outros eleitores votariam Uma aproximaccedilatildeo dessasinformaccedilotildees poderia ser obtida em um cenaacuterio real com poucos candidatos atraveacutes depesquisas eleitorais poreacutem se o nuacutemero de candidatos eacute significativo uma noccedilatildeo completadas distribuiccedilotildees dos rankings dos eleitores se torna muito menos viaacutevel e dificulta aformulaccedilatildeo de estrateacutegias para alterar a ordem em que os candidatos satildeo eliminados

                    Esses resultados podem ser replicados acessando os linksSem voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana22

                    22Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                    Com voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana

                    2222Beto2222Carla22]-----42Voter20Profile2001020520028Voter20Profile2010201020528Voter20Profile202520020102Voter20Profile20302082010100gt

                    43 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE

                    O interessante dos sistemas IRV e TRS eacute que os resultados do cenaacuterio anterior po-deriam ter sido obtidos ao inveacutes do voto taacutetico pela sua natildeo-monotonicidade Seriapossiacutevel que a Carla derrotasse a Ana no segundo turno atraveacutes do proacuteprio aumento depopularidade da Ana Assumindo que essa popularizaccedilatildeo ocorresse entre os candidatosdo perfil 2 onde 3 passasse a apoiar a Ana ao inveacutes do Beto as novas distribuiccedilotildeesseguiriam a tabela abaixo

                    Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                    Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                    deeleitores

                    1 10 5 0 452 0 10 5 273 5 0 10 28

                    Dessa maneira Beto agora com uma porcentagem dos eleitores menor do que a deCarla seraacute eliminado na primeira rodada e como seus eleitores tecircm a Carla como segundaopccedilatildeo ela receberaacute todos os seus votos e seraacute eleita na segunda rodada As rodadas doIRV podem ser vistas nas figuras 29 e 30

                    44

                    Figura 29 ndash IRV primeiro turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                    Figura 30 ndash IRV segundo turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                    Tabela 15 ndash Resultados do Cenaacuterio 3Candidato

                    eleitoMeacutedia das

                    notasAntes da

                    popularizaccedilatildeode Ana

                    Ana 56

                    Apoacutespopularizaccedilatildeo

                    de AnaCarla 415

                    Os efeitos dessa caracteriacutestica se refletem na satisfaccedilatildeo meacutedia da populaccedilatildeo A Ana eacuteclaramente a melhor candidata e mesmo com o seu ganho de popularidade (ou devido aele) a Carla eacute eleita

                    Esses resultados podem ser replicados acessando os linksAntes da popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecom

                    direct_res0010000---[22Ana2222Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                    45

                    Apoacutes popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana2222Beto2222Carla22]-----45Voter20Profile2001020520027Voter20Profile2010201020528Voter20Profile20252002010100gt

                    44 CENAacuteRIO 4 COALIZOtildeES

                    O TRS por ser organizado em dois turnos separados normalmente a semanas dedistacircncia um do outro acaba abrindo brecha agrave mudanccedila de opiniatildeo por parte dos eleitorese o desenvolvimento de novas estrateacutegias por parte dos candidatos tais como a coalizatildeocom candidatos jaacute eliminados Com isso em mente nesse cenaacuterio teremos novamenteos quatro candidatos Ana Beto Carla e Diego Os trecircs primeiros seratildeo gerados dadistribuiccedilatildeo Neutral e Diego da distribuiccedilatildeo Disliked

                    Figura 31 ndash TRS turno 1 - Cenaacuterio 4

                    No TRS normal Ana Beto e Carla possuem com essas distribuiccedilotildees quantidades devotos muito proacuteximas com Beto e Carla indo para o segundo turno Carla estaacute 10 votosatraacutes de Beto e decide aproveitar o espaccedilo de tempo entre os dois turnos para tentaragregar mais votos Com isso Carla se aproxima de Diego e juntos formam uma coalizatildeoNo entanto com sua baixa popularidade Diego acaba ferindo a reputaccedilatildeo de Carla etorna o segundo turno muito mais faacutecil para Beto (Figura 33) Se Carla tivesse buscado osuporte de Ana por outro lado ela se veria vitoriosa no segundo turno e com uma amplavantagem sobre o Beto (Figura 34) Ou ateacute mesmo sem buscar uma coalizatildeo mesmosendo uma corrida apertada Carla teria naturalmente sido eleita (Figura 32)

                    Esses resultados podem ser replicados acessando os linksSem coalizotildees lthttpelectionsimpythonanywherecomdirect_res0100000

                    --[0002][22Ana222022Beto2222Carla2222Diego22]------100gt

                    46

                    Figura 32 ndash TRS turno 2 - Cenaacuterio 4

                    Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4

                    Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4

                    47

                    Coalizatildeo Carla e Diego lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2203Carla20Diego-100gt

                    Coalizatildeo Carla e Ana lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2200Carla20Ana-100gt

                    45 CENAacuteRIO 5 DILEMA DO PRISIONEIRO

                    Neste cenaacuterio temos uma eleiccedilatildeo de uma vaga com trecircs candidatos concorrentes e trecircsperfis distintos de eleitores que seguiratildeo as seguintes distribuiccedilotildees

                    Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5

                    Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                    deeleitores

                    1 10 -10 5 362 -10 10 5 343 -10 -10 5 30

                    Esse contexto nos remete ao notaacutevel dilema do prisioneiro Nele dois prisioneiroscuacutemplices satildeo interrogados individualmente sem poder se comunicar um com o outro ecada um enfrenta o dilema de delatar ou natildeo o seu parceiro Se os dois prisioneirosdecidem se manter calados sobre o crime ambos satildeo sentenciados a um ano de prisatildeo Seapenas um deles dedurar o outro o traidor sai livre enquanto seu parceiro eacute condenadoa trecircs anos Se ambos dedurarem um ao outro eles satildeo condenados juntos a dois anosde prisatildeo Esse dilema eacute uma ideia claacutessica presente no estudo da teoria dos jogos sendooriginalmente elaborada por Merrill Flood e Melvin Dresher em 1950 e mais tarde sendonomeada de dilema dos prisioneiros por Albert W Tucker (POUNDSTONE 1992)

                    O que esse dilema nos mostra eacute a tentaccedilatildeo que o indiviacuteduo deteacutem se sua racionalizaccedilatildeoestiver voltada para seus proacuteprios interesses e somente eles em oposiccedilatildeo a pensar no bemdo grupo como um todo Neste cenaacuterio encontramos dois grupos de eleitores expressiva-mente opostos os perfis 1 e 2 Se qualquer uma das preferecircncias desses perfis fosse eleitaisso significaria uma alta rejeiccedilatildeo de maior parte da populaccedilatildeo No entanto eles possuema segunda opccedilatildeo em comum a Carla que por sua vez eacute a preferecircncia do terceiro perfilPortanto a eleiccedilatildeo da Carla seria logicamente o resultado oacutetimo

                    Mesmo assim a Ana eacute eleita nos dois sistemas acima o que natildeo parece justo poispela tabela 16 eacute evidente que apenas 36 da populaccedilatildeo a aprova enquanto que os outros64 a reprovam ao maacuteximo O sistema IRV se comporta de maneira idecircntica ao TRS

                    48

                    Figura 35 ndash FPTP - Cenaacuterio 5

                    Figura 36 ndash TRS segundo turno - Cenaacuterio 5

                    nesta situaccedilatildeo Com esse resultado a meacutedia das notas eacute -28 No entanto os trecircs sistemasseguintes nos apresentam resultados diferentes

                    Tabela 17 ndash Resultados do Cenaacuterio 5

                    Sistema Candidatoeleito

                    Meacutedia dasnotas

                    FPTP Ana -28TRS Ana -28IRV Ana -28AVS Carla 50BC Carla 50SVS Carla 50

                    49

                    Figura 37 ndash AVS - Cenaacuterio 5

                    Figura 38 ndash BC - Cenaacuterio 5

                    Tanto o AVS quanto o Borda Count e o SVS satildeo sistemas que consideram todasas opiniotildees de cada eleitor ao mesmo tempo e por isso satildeo capazes de eleger o melhorcandidato nesta situaccedilatildeo diferentemente do TRS que natildeo absorve completamente todosentimento do eleitor por todos os candidatos e o IRV que apesar de ser bem expressivoquebra esse processo em inuacutemeras rodadas o que permite a perda de informaccedilatildeo ao longodelas

                    Esses resultados podem ser replicados acessando o linklthttpelectionsimpythonanywherecomdirect_res1111110---[22Ana

                    222022Beto222022Carla22]-----36Voter20Profile2001020-1020534Voter20Profile201-10201020530Voter20Profile202-1020-10205100gt

                    50

                    Figura 39 ndash SVS - Cenaacuterio 5

                    46 CENAacuteRIO 6 VOTO DE MINORIA

                    Neste cenaacuterio temos uma eleiccedilatildeo com quatro candidatos e duas vagas A Ana seraacutea preferecircncia de uma extensa parte da populaccedilatildeo (distribuiccedilatildeo Loved Figura 53) Betoe Carla seratildeo candidatos razoavelmente populares (distribuiccedilatildeo Neutral Figura 47) eDiego seraacute a preferecircncia de apenas um pequeno grupo especiacutefico e rejeitado pela maioria(distribuiccedilatildeo Disliked Figura 51) Eacute intuitivo esperar que os dois candidatos eleitos seratildeoa Ana e ou o Beto ou a Carla e isso eacute exatamente o que ocorre na figura 40 no sistemaFPTP sem voto de minoria

                    Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria

                    Eacute evidente a discrepacircncia da quantidade de votos da Ana para os outros candidatose apesar de Beto e Carla serem mais populares que Diego os trecircs natildeo se encontrammuito afastados Poreacutem se a pequena fraccedilatildeo de candidatos que possuem a Ana como

                    51

                    Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego

                    preferecircncia e Diego como segunda opccedilatildeo optarem pelo voto de minoria a situaccedilatildeo mudacompletamente (Figura 41) Assim apesar de extensamente rejeitado Diego conquistaa segunda vaga e a meacutedia das notas despenca de 2929 para 0505 No entanto aindaexiste um cenaacuterio pior Se os outros grupos de eleitores pensarem da mesma forma eevitarem votar na Ana achando que sua eleiccedilatildeo jaacute estaacute assegurada apenas 80 de votode minoria para esses grupos jaacute eacute o suficiente para eliminaacute-la das eleiccedilotildees (Figura 42)Com a Ana eliminada a meacutedia das notas cai ainda mais para 0058

                    Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego

                    O sistema Bloc Vote eacute uma das soluccedilotildees para o voto de minoria Permitindo queos eleitores votem no mesmo nuacutemero de candidatos que de vagas a serem preenchidasnatildeo existe o iacutempeto a esse tipo de voto estrateacutegico O resultado desse sistema portantoretorna a meacutedia das notas a casa dos 29 (Figura 43) Os sistemas AVS Borda Count eSVS tambeacutem impedem a presenccedila do voto de minoria e atingem resultados semelhantes

                    52

                    Figura 43 ndash BV - Cenaacuterio 6

                    Tabela 18 ndash Resultados do Cenaacuterio 6

                    Sistema Candidatoseleitos

                    Meacutedia dasnotas

                    FPTP sem voto de minoriaAna eBeto 2929

                    FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

                    FPTP com 80 de voto de minoriaBeto eCarla 0058

                    Bloc VoteAna eCarla 2913

                    Esses resultados podem ser replicados acessando os links

                    Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

                    100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

                    80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

                    53

                    5 COMO FUNCIONA O SIMULADOR

                    O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

                    51 CLASSE ELECTIONS

                    Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

                    bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

                    Figura 44 ndash estrutura candidates

                    bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

                    bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

                    Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

                    Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

                    54

                    Figura 45 ndash estrutura voters

                    Figura 46 ndash estrutura votes

                    daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

                    Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

                    55

                    Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

                    Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

                    na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

                    56

                    Figura 49 ndash PDF - Distribuiccedilatildeo Liked

                    Figura 50 ndash CDF - Distribuiccedilatildeo Liked

                    (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

                    Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

                    57

                    Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

                    Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

                    candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

                    Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

                    58

                    Figura 53 ndash PDF - Distribuiccedilatildeo Loved

                    Figura 54 ndash CDF - Distribuiccedilatildeo Loved

                    funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

                    59

                    Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                    Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                    Meacutedia das Notas sumei

                    sumvj nij

                    etimes v

                    Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                    Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                    60

                    Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                    Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                    52 CLASSE FIRSTPASTTHEPOST

                    Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                    Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                    61

                    Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                    Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                    mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                    62

                    53 CLASSE TWOROUNDSYSTEM

                    A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                    54 CLASSE INSTANTRUNOFFVOTING

                    A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                    Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                    63

                    cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                    55 CLASSE APPROVALVOTING

                    Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                    56 CLASSE BORDACOUNT

                    Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                    57 CLASSE SCOREVOTING

                    De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                    64

                    58 CLASSE BLOCVOTE

                    O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                    59 TECNOLOGIAS UTILIZADAS

                    A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                    Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                    O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                    Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                    65

                    6 CONCLUSAtildeO

                    Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                    Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                    Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                    Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                    Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                    66

                    REFEREcircNCIAS

                    AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                    Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                    Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                    Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                    HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                    LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                    ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                    Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                    POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                    The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                    67

                    APEcircNDICES

                    APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                    Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                    if(not len(selfvoter_profiles))

                    for voter in range(selfN_VOTERS)

                    candidates_rank = dict()

                    for candidate in reversed(range(selfN_CANDIDATES))

                    if(selfBIAS_VECTOR[candidate]==4)

                    candidates_rank[candidate] = self_sortear(selfloved)

                    elif(selfBIAS_VECTOR[candidate]==3)

                    candidates_rank[candidate] = self_sortear(selfliked)

                    elif(selfBIAS_VECTOR[candidate]==2)

                    candidates_rank[candidate] = self_sortear(selfdisliked)

                    elif(selfBIAS_VECTOR[candidate]==1)

                    candidates_rank[candidate] = self_sortear(selfhated)

                    elif(selfBIAS_VECTOR[candidate]==-1)

                    candidates_rank[candidate] = self_sortear(selfpolarizer

                    )

                    elif(selfBIAS_VECTOR[candidate]==-2)

                    candidates_rank[candidate] = self_sortear(self

                    more_polarizer)

                    else

                    candidates_rank[candidate] = self_sortear(selfneutral)

                    selfvotersappend(candidates_rank)

                    else

                    ranges = []

                    ranks = []

                    for prof in selfvoter_profiles

                    rangesappend(int(prof[pop_percentage]))

                    rank =

                    for index score in enumerate(prof[scores])

                    rank[index] = score

                    ranksappend(rank)

                    for index _range in enumerate(ranges)

                    for _ in range(int(selfN_VOTERS(_range100)))

                    selfvotersappend(ranks[index])

                    68

                    APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                    Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                    for i in range(selfN_CANDIDATES)

                    selfcandidates[i] = 0

                    selfvotes[i] = set()

                    APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                    Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                    for candidate in range(selfN_CANDIDATES)

                    rating_sum = 0

                    for voter in selfvoters

                    rating_sum += voter[candidate]

                    selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                    APEcircNDICE D ndash MEacuteTODO GET_MEAN

                    Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                    if len(winners) gt 1 or selfN_CANDIDATES gt 10

                    return selfcalculate_mean(winners)

                    else

                    chose_best = True if winners[0] == selfbest_candidate else

                    False

                    return selfstats[rsquomeansrsquo][winners[0]] chose_best

                    69

                    APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                    Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                    rating_sum = 0

                    for voter in selfvoters

                    for candidate in winners

                    rating_sum += voter[candidate]

                    return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                    APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                    Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                    for i in range(1 selfN_VACANCIES + 2)

                    selfleading_candidatesappend(selfsorted_candidates[-i][self

                    CANDIDATE_INDEX])

                    APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                    Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                    for leader in selfelecrounds[-1]

                    selfleading_candidatesappend(leader[0])

                    70

                    APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                    Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                    self_account_for_coalitions()

                    for voter in selfvoters

                    selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                    (1)))

                    temp = []

                    for voter in selfsorted_voters

                    new_dict = defaultdict(list)

                    for k in voter

                    new_dict[k[1]]append(k[0])

                    tempappend(new_dict)

                    selfsorted_voters = []

                    for voter_index current_voter in enumerate(temp)

                    new_voter = []

                    for rating candidate_indexes in current_voteritems()

                    if len(current_voter[rating]) gt 1

                    shuffle(current_voter[rating])

                    for e in candidate_indexes

                    new_voterappend((e rating))

                    else

                    new_voterappend((candidate_indexes[0] rating))

                    selfsorted_votersappend(new_voter)

                    selfcandidates[new_voter[-1][0]] += 1

                    selfvotes[new_voter[-1][0]]add(voter_index)

                    71

                    APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                    Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                    for candidate in selfvotes_copy

                    if candidate not in selfelecleading_candidates

                    for voter_index in selfvotes_copy[candidate]

                    for index _candidate in enumerate(reversed(selfelec

                    sorted_voters[voter_index]))

                    if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                    leading_candidates

                    if randomrandom() lt selfelec

                    tactical_vote_percentages[_candidate[selfelec

                    CANDIDATE_INDEX]]

                    selfrankings_changed[voter_index] = copy

                    deepcopy(selfelecsorted_voters[voter_index])

                    selfrankings_changed[voter_index][-(index + 1)]

                    selfrankings_changed[voter_index][-1] = self

                    rankings_changed[voter_index][-1] self

                    rankings_changed[voter_index][-(index + 1)]

                    selfcandidates[candidate] -= 1

                    selfcandidates[_candidate[selfelec

                    CANDIDATE_INDEX]] += 1

                    selfvotes[candidate]remove(voter_index)

                    selfvotes[_candidate[selfelecCANDIDATE_INDEX

                    ]]add(voter_index)

                    break

                    break

                    72

                    APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                    Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                    half_vacancies = mathfloor(selfelecN_VACANCIES2)

                    for candidate in selfelecleading_candidates

                    if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                    continue

                    for voter_index in selfvotes_copy[candidate]

                    if voter_index in selfrankings_changed

                    ranking = selfrankings_changed[voter_index]

                    else

                    ranking = copydeepcopy(selfelecsorted_voters[voter_index

                    ])

                    for index _candidate in enumerate(reversed(ranking))

                    if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                    leading_candidates or (_candidate[selfelec

                    CANDIDATE_INDEX] in selfelecleading_candidates and

                    selfelecleading_candidatesindex(_candidate[selfelec

                    CANDIDATE_INDEX]) gt= half_vacancies)

                    if _candidate[selfelecCANDIDATE_RANK] gt= 0

                    if randomrandom() lt selfelec

                    minority_vote_percentages[_candidate[selfelec

                    CANDIDATE_INDEX]]

                    selfcandidates[candidate] -= 1

                    selfcandidates[_candidate[selfelec

                    CANDIDATE_INDEX]] += 1

                    break

                    break

                    break

                    73

                    APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                    Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                    self_account_for_coalitions()

                    for candidate in selfvotes

                    if candidate = selfwinner and candidate = selfsecond_place

                    for voter_index in selfvotes[candidate]

                    if voter_index in selfrankings_changed

                    ranking = selfrankings_changed[voter_index]

                    else

                    ranking = copydeepcopy(selfelecsorted_voters[

                    voter_index])

                    for index2 candidate in enumerate(reversed(ranking))

                    if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                    selfcandidates[selfwinner] += 1

                    selfvotes[selfwinner]add(voter_index)

                    break

                    elif candidate[selfelecCANDIDATE_INDEX] == self

                    second_place

                    selfcandidates[selfsecond_place] += 1

                    selfvotes[selfsecond_place]add(voter_index)

                    break

                    selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                    winners = []

                    vacancies = selfelecN_VACANCIES

                    for candidate in reversed(selfsorted_candidates)

                    if vacancies == 0

                    break

                    winnersappend(candidate[0])

                    vacancies -= 1

                    mean chose_best = selfelecget_mean(winners = winners)

                    74

                    APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                    Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                    for voter_index voter in enumerate(selfelecsorted_voters)

                    voter_dict = dict()

                    og_voter_dict = dict()

                    for tup in voter

                    voter_dict[tup[0]] = tup[1]

                    og_voter_dict[tup[0]] = tup[1]

                    for coalition in selfeleccoalitions

                    for candidate in coalition

                    add_to_score = 0

                    for candidate2 in coalition

                    if candidate == candidate2

                    continue

                    half = og_voter_dict[candidate2[rsquovaluersquo]]2

                    if half lt 0

                    add_to_score += mathceil(half)

                    else

                    add_to_score += mathfloor(half)

                    if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                    voter_dict[candidate[rsquovaluersquo]] = 10

                    elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                    voter_dict[candidate[rsquovaluersquo]] = -10

                    else

                    voter_dict[candidate[rsquovaluersquo]] += add_to_score

                    selfrankings_changed[voter_index] = []

                    for candidate in voter_dict

                    selfrankings_changed[voter_index]append((candidate voter_dict[

                    candidate]))

                    selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                    voter_index] key=lambda x x[1])

                    75

                    APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                    Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                    selfelecroundsappend(selfsorted_candidates[_round])

                    if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                    N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                    N_VACANCIES - 1)

                    return 2

                    elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                    N_VOTERS gt 05)

                    return 1

                    else

                    selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                    CANDIDATE_INDEX])

                    for voter_index in selfvotes[selfsorted_candidates[_round][self

                    elecCANDIDATE_INDEX]]

                    if voter_index in selfrankings_changed

                    for candidate in reversed(selfrankings_changed[voter_index

                    ])

                    if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                    excluded

                    selfcandidates[candidate[selfelecCANDIDATE_INDEX

                    ]] += 1

                    selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                    add(voter_index)

                    break

                    else

                    continue

                    else

                    for candidate in reversed(selfelecsorted_voters[

                    voter_index])

                    if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                    excluded

                    selfcandidates[candidate[selfelecCANDIDATE_INDEX

                    ]] += 1

                    selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                    add(voter_index)

                    break

                    else

                    continue

                    selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                    return 0

                    76

                    APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                    Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                    for index in range(selfelecN_CANDIDATES)

                    selfcandidates[index] = 0

                    for voter in selfelecsorted_voters

                    for candidate in reversed(voter)

                    if candidate[selfelecCANDIDATE_SCORE] gt 0

                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                    else

                    break

                    APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                    Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                    for index in range(selfelecN_CANDIDATES)

                    selfcandidates[index] = 0

                    for voter in selfelecsorted_voters

                    if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                    elecCANDIDATE_INDEX]]

                    selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                    else

                    for candidate in reversed(voter)

                    if candidate[selfelecCANDIDATE_SCORE] gt 0

                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                    else

                    break

                    77

                    APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                    Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                    pos = set()

                    for index perc in enumerate(selfelectactical_vote_percentages)

                    if perc gt 0

                    posadd(index)

                    for candidate in selfeleccandidates

                    if candidate not in selfleading_candidates

                    for voter_index in selfvotes[candidate]

                    raised = None

                    for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                    ])

                    if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                    leading_candidates

                    if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                    if randomrandom() lt selfelectactical_vote_percentages[

                    candidate_tuple[selfelecCANDIDATE_INDEX]]

                    ranking = [None]selfelecN_CANDIDATES

                    ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                    selfelecvoters[voter_index][candidate_tuple[selfelec

                    CANDIDATE_INDEX]])

                    raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                    break

                    break

                    break

                    if raised = None

                    for _candidate in selfleading_candidates

                    if _candidate = ranking[-1][0]

                    ranking[0] = (_candidate selfelecvoters[voter_index][

                    _candidate])

                    buried = _candidate

                    break

                    i = 1

                    for candidate_tuple in selfelecsorted_voters[voter_index]

                    if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                    buried]

                    continue

                    else

                    ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                    selfelecvoters[voter_index][candidate_tuple[selfelec

                    CANDIDATE_INDEX]])

                    i += 1

                    selfrankings_changed[voter_index] = ranking

                    78

                    APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                    Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                    for voter_index in selfvotes[candidate]

                    if randomrandom() lt selfelectactical_vote_percentages[candidate

                    ]

                    for _candidate in selfleading_candidates

                    if _candidate = candidate

                    ranking = [None]selfelecN_CANDIDATES

                    ranking[0] = (_candidate selfelecvoters[voter_index][

                    _candidate])

                    buried = _candidate

                    break

                    i = 1

                    for candidate_tuple in selfelecsorted_voters[voter_index]

                    if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                    continue

                    else

                    ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                    selfelecvoters[voter_index][candidate_tuple[selfelec

                    CANDIDATE_INDEX]])

                    i += 1

                    selfrankings_changed[voter_index] = ranking

                    79

                    APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                    Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                    for index in range(selfelecN_CANDIDATES)

                    selfcandidates[index] = 0

                    for voter_index voter in enumerate(selfelecsorted_voters)

                    score = 0

                    if voter_index in selfrankings_changed

                    for candidate in selfrankings_changed[voter_index]

                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                    score += 1

                    else

                    for candidate in voter

                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                    score += 1

                    APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                    Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                    for voter_index voter in enumerate(selfelecsorted_voters)

                    if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                    elecCANDIDATE_INDEX]]

                    selfrankings_changed[voter_index] = copydeepcopy(selfelec

                    sorted_voters[voter_index])

                    for candidate_index candidate in enumerate(reversed(voter))

                    if candidate_index == 0

                    selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                    voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                    else

                    selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                    voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                    80

                    APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                    Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                    for index in range(selfelecN_CANDIDATES)

                    selfcandidates[index] = 0

                    for voter_index voter in enumerate(selfelecsorted_voters)

                    if voter_index in selfrankings_changed

                    for candidate in selfrankings_changed[voter_index]

                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                    selfelecCANDIDATE_RANK]

                    else

                    for candidate in voter

                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                    selfelecCANDIDATE_RANK]

                    APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                    Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                    for index in range(selfelecN_CANDIDATES)

                    selfcandidates[index] = 0

                    for voter in selfelecsorted_voters

                    votes = selfelecN_VACANCIES

                    for candidate in reversed(voter)

                    if votes == 0

                    break

                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                    votes -= 1

                    • Folha de aprovaccedilatildeo
                    • Agradecimentos
                    • Epiacutegrafe
                    • Resumo
                    • Abstract
                    • Lista de ilustraccedilotildees
                    • Lista de Coacutedigos
                    • Lista de tabelas
                    • Lista de abreviaturas e siglas
                    • Sumaacuterio
                    • INTRODUCcedilAtildeO
                      • MOTIVACcedilAtildeO E OBJETIVO
                      • MEacuteTODO
                      • ESTRUTURA
                        • SISTEMAS ELEITORAIS
                          • FISRT PAST THE POST
                            • Exemplo
                            • Vantagens e Desvantagens do FPTP
                            • Voto Uacutetil no FPTP
                              • TWO-ROUND SYSTEM
                                • Exemplo
                                • Vantagens e Desvantagens do TRS
                                • Voto Uacutetil no TRS
                                  • INSTANT-RUNOFF VOTING
                                    • Exemplo
                                    • Vantagens e Desvantagens do IRV
                                    • Voto Uacutetil no IRV
                                      • APPROVAL VOTING SYSTEM
                                        • Exemplo
                                        • Vantagens e Desvantagens do AVS
                                        • Voto Uacutetil no AVS
                                          • THE BORDA COUNT
                                            • Exemplo
                                            • Vantagens e Desvantagens do BC
                                            • Voto Uacutetil no BC
                                              • SCORE VOTING SYSTEM
                                                • Exemplo
                                                • Vantagens e Desvantagens do SVS
                                                • Voto Uacutetil no SVS
                                                  • BLOC VOTE
                                                    • Exemplo
                                                    • Voto Uacutetil no BV
                                                        • O SIMULADOR
                                                        • CENAacuteRIOS PERTINENTES
                                                          • CENAacuteRIO 1 VOTO TAacuteTICO
                                                          • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                          • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                          • CENAacuteRIO 4 COALIZOtildeES
                                                          • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                          • CENAacuteRIO 6 VOTO DE MINORIA
                                                            • COMO FUNCIONA O SIMULADOR
                                                              • CLASSE Elections
                                                              • CLASSE FirstPastThePost
                                                              • CLASSE TwoRoundSystem
                                                              • CLASSE InstantRunoffVoting
                                                              • CLASSE ApprovalVoting
                                                              • CLASSE BordaCount
                                                              • CLASSE ScoreVoting
                                                              • CLASSE BlocVote
                                                              • TECNOLOGIAS UTILIZADAS
                                                                • CONCLUSAtildeO
                                                                • Referecircncias
                                                                • Meacutetodo create_voters
                                                                • Meacutetodo create_candidates
                                                                • Meacutetodo calculate_means
                                                                • Meacutetodo get_mean
                                                                • Meacutetodo calculate_mean
                                                                • Meacutetodo set_leading_candidates
                                                                • Meacutetodo irv_set_leading_candidates
                                                                • Meacutetodo sort_ranks
                                                                • Meacutetodo fptp_count_tactical_votes
                                                                • Meacutetodo fptp_count_minority_votes
                                                                • Meacutetodo trs_second_round
                                                                • Meacutetodo trs_account_for_coalitions
                                                                • Meacutetodo irv_count_votes
                                                                • Meacutetodo avs_count_votes
                                                                • Meacutetodo avs_count_votes_with_tactical
                                                                • Meacutetodo irv_apply_tactical_votes
                                                                • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                • Meacutetodo bc_sum_candidates_scores
                                                                • Meacutetodo svs_apply_tactical_votes
                                                                • Meacutetodo svs_sum_candidates_scores
                                                                • Meacutetodo bv_count_votes

                      LISTA DE ABREVIATURAS E SIGLAS

                      FPTP First Past The Post

                      TRS Two-Round System

                      IRV Instant Runoff Voting

                      AVS Approval Voting System

                      BC Borda Count

                      SVS Score Voting System

                      BV Bloc Vote

                      SUMAacuteRIO

                      1 INTRODUCcedilAtildeO 1511 MOTIVACcedilAtildeO E OBJETIVO 1512 MEacuteTODO 1513 ESTRUTURA 15

                      2 SISTEMAS ELEITORAIS 1721 FISRT PAST THE POST 17211 Exemplo 18212 Vantagens e Desvantagens do FPTP 18213 Voto Uacutetil no FPTP 1922 TWO-ROUND SYSTEM 19221 Exemplo 20222 Vantagens e Desvantagens do TRS 20223 Voto Uacutetil no TRS 2123 INSTANT-RUNOFF VOTING 21231 Exemplo 22232 Vantagens e Desvantagens do IRV 22233 Voto Uacutetil no IRV 2324 APPROVAL VOTING SYSTEM 24241 Exemplo 24242 Vantagens e Desvantagens do AVS 24243 Voto Uacutetil no AVS 2525 THE BORDA COUNT 25251 Exemplo 25252 Vantagens e Desvantagens do BC 26253 Voto Uacutetil no BC 2626 SCORE VOTING SYSTEM 26261 Exemplo 27262 Vantagens e Desvantagens do SVS 27263 Voto Uacutetil no SVS 2727 BLOC VOTE 28271 Exemplo 28272 Voto Uacutetil no BV 29

                      3 O SIMULADOR 30

                      4 CENAacuteRIOS PERTINENTES 3441 CENAacuteRIO 1 VOTO TAacuteTICO 3442 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV 4143 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE 4344 CENAacuteRIO 4 COALIZOtildeES 4545 CENAacuteRIO 5 DILEMA DO PRISIONEIRO 4746 CENAacuteRIO 6 VOTO DE MINORIA 50

                      5 COMO FUNCIONA O SIMULADOR 5351 CLASSE Elections 5352 CLASSE FirstPastThePost 6053 CLASSE TwoRoundSystem 6254 CLASSE InstantRunoffVoting 6255 CLASSE ApprovalVoting 6356 CLASSE BordaCount 6357 CLASSE ScoreVoting 6358 CLASSE BlocVote 6459 TECNOLOGIAS UTILIZADAS 64

                      6 CONCLUSAtildeO 65

                      REFEREcircNCIAS 66

                      APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS 67

                      APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES 68

                      APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS 68

                      APEcircNDICE D ndash MEacuteTODO GET_MEAN 68

                      APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN 69

                      APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES 69

                      APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES 69

                      APEcircNDICE H ndash MEacuteTODO SORT_RANKS 70

                      APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES 71

                      APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES 72

                      APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND 73

                      APEcircNDICE L ndash MEacuteTODOTRS_ACCOUNT_FOR_COALITIONS 74

                      APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES 75

                      APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES 76

                      APEcircNDICE O ndash MEacuteTODOAVS_COUNT_VOTES_WITH_TACTICAL 76

                      APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES 77

                      APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES (CON-TINUACcedilAtildeO) 78

                      APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES 79

                      APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES 79

                      APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES 80

                      APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES 80

                      15

                      1 INTRODUCcedilAtildeO

                      Em toda eleiccedilatildeo existe pelo menos um grupo de indiviacuteduos que sai completamentedesfavorecido e insatisfeito com o resultado O contentamento completo de uma populaccedilatildeoeacute certamente improvaacutevel e muitas vezes impossiacutevel considerando a gama de candidatosque se dispotildee a concorrer Em todo caso o miacutenimo que pode ser feito eacute escolher demaneira eficiente o melhor candidato ao cargo dentre as opccedilotildees disponiacuteveis Diante dissoeacute necessaacuterio avaliar como essa escolha eacute feita e quais meacutetodos satildeo capazes de tornaacute-larealidade

                      11 MOTIVACcedilAtildeO E OBJETIVO

                      Em conformidade com o extenso nuacutemero de sistemas eleitorais pelo mundo este tra-balho tem como objetivo testar uma porccedilatildeo desses sistemas sob a simulaccedilatildeo de diferentescenaacuterios especiacuteficos a fim de determinar quais deles podem ser considerados como os maisjustos perante a taxa de satisfaccedilatildeo meacutedia da populaccedilatildeo

                      12 MEacuteTODO

                      Para que essa anaacutelise seja possiacutevel foi desenvolvido um programa que permite a criaccedilatildeoe configuraccedilatildeo de diferentes cenaacuterios onde os sistemas eleitorais seratildeo simulados Nele eacutepossiacutevel definir o nuacutemero total de eleitores e candidatos como esses eleitores iratildeo votar eo niacutevel de popularidade de cada candidato Aleacutem disso eacute possiacutevel formar coalizotildees entreos candidatos e escolher a porcentagem dos eleitores que optaratildeo pelo voto uacutetil Dessamaneira seraacute possiacutevel elaborar cenaacuterios que buscam expor os pontos fortes e fracos decada sistema

                      13 ESTRUTURA

                      Este trabalho eacute relatado ao longo de seis capiacutetulos No Capiacutetulo 2 seratildeo apresentados ossistemas eleitorais implementados no simulador suas vantagens e desvantagens conhecidase outras caracteriacutesticas especiacuteficas de cada um A intenccedilatildeo do capiacutetulo eacute tornar o textomais autocontido trazendo conceitos jaacute estudados que ajudaratildeo na melhor compreensatildeodos capiacutetulos seguintes por isso grande parte de sua composiccedilatildeo eacute oriunda de diferentesfontes consultadas

                      O Capiacutetulo 3 eacute uma apresentaccedilatildeo das funcionalidades que o simulador possui Seratildeoexplicados todos os campos de entrada e os dois modos distintos nos quais o programaopera

                      16

                      No Capiacutetulo 4 os sistemas seratildeo colocados em teste Todos seratildeo simulados em cenaacuteriosespeciacuteficos a fim de fazer sobressair aqueles com as maiores taxas de satisfaccedilatildeo meacutedia

                      A estrutura e implementaccedilatildeo do simulador seratildeo abordadas em detalhes no Capiacutetulo5 assim como uma breve descriccedilatildeo da stack utilizada Todos os meacutetodos relevantes aofuncionamento das simulaccedilotildees seratildeo explicados passo a passo

                      No Capiacutetulo 6 seratildeo apresentadas as conclusotildees referentes agrave anaacutelise dos resultadosobtidos no Capiacutetulo 4 e as consideraccedilotildees finais do projeto como um todo

                      17

                      2 SISTEMAS ELEITORAIS

                      Atualmente mais e mais paiacuteses estatildeo adotando sistemas democraacuteticos de governoCerca de 6 em 10 governos no mundo satildeo democracias (Pew Research Center 2017) o quepode ser observado na Figura 1 abaixo Em um sistema democraacutetico a populaccedilatildeo escolheseus liacutederes atraveacutes de seu sistema eleitoral Existem diversos sistemas eleitorais em usono mundo muitos dos quais satildeo usados em conjunto para eleger um uacutenico candidato Emvaacuterios paiacuteses mais de um sistema eleitoral pode ser utilizado tambeacutem em diferentes niacuteveisde governo tanto presidencial quanto estadual ou municipal Natildeo apenas imersos nomeio poliacutetico eles tambeacutem podem ser usados em escopos menores como em esportes oucompeticcedilotildees artiacutesticas poreacutem sempre com a finalidade de alocar um ou mais indiviacuteduosa determinado cargo ou tiacutetulo

                      Figura 1 ndash de paiacuteses de cada tipo de regime 1946-2016

                      Fonte Center of Systemic Peacersquos Polity IV Project

                      Os proacuteximos trecircs toacutepicos discutidos neste capiacutetulo referentes aos meacutetodos First Pastthe Post Two-Round System e Instant Runoff Voting possuem seus conceitos e infor-maccedilotildees relevantes com exceccedilatildeo dos exemplos traduzidos livremente do livro Behind theBallot Box A Citizenrsquos Guide to Voting Systems (AMY 2000)

                      21 FISRT PAST THE POST

                      O meacutetodo First Past the Post tambeacutem conhecido como Plurality Voting ou WinnerTakes All eacute o meacutetodo mais simples e direto e provavelmente o primeiro meacutetodo que sepensa quando se fala de eleiccedilotildees Os eleitores escolhem apenas um candidato e apoacutes a

                      18

                      contagem dos votos o candidato com o maior nuacutemero de votos eacute eleito O vencedor natildeonecessita da aprovaccedilatildeo de mais de 50 dos eleitores ele apenas precisa de uma pluralidadedos votos ou seja apenas possuir mais votos que os outros candidatos

                      Esse sistema eacute utilizado em escala nos Estados Unidos para a maior parte das eleiccedilotildeesvoltadas a eleger apenas um candidato como prefeitos e governadores aleacutem de ser usadana disputa presidencial Dentre outros paiacuteses que empregam o sistema em suas corridaspresidenciais estatildeo listados o Meacutexico as Filipinas a Coreia do Sul e a Venezuela

                      211 Exemplo

                      Tabela 1 ndash Exemplo FPTP

                      Candidatos VotosA 36B 25C 22D 17

                      Neste exemplo o candidato A possui uma pluralidade dos votos com 36 e ele eacute ocandidato eleito mesmo natildeo tendo uma maioria

                      212 Vantagens e Desvantagens do FPTP

                      A vantagem do FPTP eacute a sua simplicidade Natildeo eacute difiacutecil para um eleitor comumcompreender o seu funcionamento eles apenas precisam se decidir por um candidato Eletambeacutem eacute muito simples e direto na sua contagem e seleccedilatildeo do vencedor

                      Esse meacutetodo tambeacutem tende a criar listas de candidatos concorrentes mais curtasCandidatos independentes ou de partidos menores frequentemente acabam se sentindodesencorajados a concorrer devido agraves suas baixas chances de vitoacuteria Isso normalmentefornece aos eleitores uma faacutecil decisatildeo entre um ou dois candidatos dos maiores partidosao mesmo tempo poreacutem limitando suas opccedilotildees

                      No entanto sua essecircncia eacute sua principal desvantagem a pluralidade O fato do can-didato eleito natildeo necessitar de uma maioridade dos votos da populaccedilatildeo parece violaros princiacutepios baacutesicos da democracia Democracia eacute em sua origem o poder(kratos) nopovo(demos) poreacutem na pluralidade o poder de eleger um candidato pode residir emapenas uma fraccedilatildeo relativamente pequena do povo Em um cenaacuterio hipoteacutetico comapenas trecircs candidatos um deles apenas poderia necessitar de natildeo mais do que 34 dosvotos para ser eleito o que significa que no pior dos casos 66 da populaccedilatildeo rejeitao candidato eleito O cenaacuterio soacute piora com mais e mais candidatos concorrendo Paraquatro candidatos satildeo necessaacuterios 26 dos votos no pior dos casos para cinco satildeo 21 eassim por diante

                      19

                      213 Voto Uacutetil no FPTP

                      No FPTP tambeacutem existe a possibilidade de os eleitores evitarem votar em sua prefe-recircncia verdadeira No caso de sua preferecircncia natildeo aparentar ter boas chances de vitoacuteriamuitas vezes opta-se por uma segunda opccedilatildeo que esteja mais bem colocada nas eleiccedilotildeesO motivo disso eacute que nessas situaccedilotildees votar em sua preferecircncia pode parecer um des-perdiacutecio do seu voto e no pior dos cenaacuterios optar por natildeo transferir seu voto para umasegunda opccedilatildeo pode acabar resultando na eleiccedilatildeo de um candidato de seu desgosto As-sim votar de maneira verdadeira muitas vezes pode acabar prejudicando o eleitor que sevecirc forccedilado a abandonar seus interesses poliacuteticos mais imediatos e escolher o menor entredois(ou mais) males Os candidatos de partidos menores satildeo os que mais sofrem com essetipo de voto estrateacutegico por natildeo conseguirem agregar as maiores quantidades de votos

                      Entretanto ao mesmo tempo que partidos maiores roubam votos de partidos meno-res com os votos taacuteticos partidos menores tambeacutem tem a oportunidade de ganhar algunsvotos com o denominado spoiler effect Ao entrarem na eleiccedilatildeo candidatos de partidosmenores podem adquirir votos de candidatos mais populares que possuem inclinaccedilatildeo po-liacutetica semelhante Logo eacute possiacutevel que haja certo equiliacutebrio ao se contrapor as mudanccedilasde voto devido aos votos uacuteteis agraves mudanccedilas oriundas do spoiler effect

                      Poreacutem o spoiler effect natildeo necessariamente ocorre apenas entre partidos maiores emenores mas pode prejudicar candidatos de popularidades proacuteximas Por exemplo entretrecircs candidatos A B e C onde A representa determinada posiccedilatildeo no espectro poliacuteticoenquanto B e C possuem posiccedilotildees parecidas o que pode acontecer eacute B e C se prejudicaremmutuamente jaacute que ambos dividem os eleitores de um mesmo espectro poliacutetico Se esseespectro tem a maioria com 60 por exemplo com B e C compartilhando cada um 30dos votos o candidato A sairia vencedor com 40 mesmo que todos os eleitores de Bprefiram C e todos os eleitores de C prefiram B Esse exemplo demonstra claramente oproblema com os sistemas de pluralidade

                      22 TWO-ROUND SYSTEM

                      Uma das primeiras tentativas de lidar com a desvantagem dos sistemas por pluralidadeo Two-round System eacute usado desde o seacuteculo XIX no ocidente e atualmente ainda eacute utilizadoem corridas presidecircncias de paiacuteses como o Brasil Bulgaacuteria Chile Colocircmbia FinlacircndiaPolocircnia Portugal Ruacutessia e em inuacutemeras eleiccedilotildees locais nos Estados Unidos

                      O principal objetivo do TRS eacute garantir que o vencedor tenha conseguido uma maioriados votos Para isso as eleiccedilotildees satildeo estruturadas em duas rodadas de votaccedilatildeo Na primeirarodada os eleitores se dirigem agraves urnas e votam no candidato de sua preferecircncia Apoacutesa contagem se a quantidade de votos do candidato mais votado superar a proporccedilatildeo de50 natildeo haacute a necessidade de uma segunda rodada e este candidato eacute eleito No entantose este natildeo for o caso haveraacute uma segunda rodada com apenas os dois candidatos mais

                      20

                      votados Nesta rodada os eleitores retornam as urnas para escolher uma das duas opccedilotildeessendo eleito o candidato mais votado agora definitivamente com uma maioria dos votos

                      221 Exemplo

                      Utilizando a mesma distribuiccedilatildeo de votos descrita na tabela 1 Neste caso como ocandidato A natildeo possui uma maioria dos votos ele e o candidato B iratildeo concorrer em umsegundo turno Digamos que as distribuiccedilotildees dos votos dos eleitores dos candidatos C eD em relaccedilatildeo aos candidatos A e B satildeo as seguintes

                      Tabela 2 ndash 2deg turno do TRS

                      Candidatos Votos dos eleitoresde C

                      Votos dos eleitoresde D

                      Votos do 1degturno

                      A 7 5 36B 15 12 25

                      O candidato B agora eacute eleito com uma maioria dos votos 52 contra 48 do candidatoA

                      222 Vantagens e Desvantagens do TRS

                      Por ser parecido com o FPTP esse sistema tambeacutem eacute de faacutecil compreensatildeo do eleitorcomum poreacutem a maior vantagem do TRS eacute a garantia de que o candidato vencedor teraacute oapoio da maioria dos eleitores no segundo turno eliminando a pluralidade Argumenta-seque isso daacute maior legitimidade poliacutetica ao mandato do candidato eleito

                      O TRS tende a abrigar uma lista maior de candidatos sendo mais convidativo acandidatos de partidos menores mesmo que suas chances natildeo sejam maiores quandocomparadas agraves eleiccedilotildees sob o FPTP Mesmo assim essa listagem mais abrangente eacute umavantagem do sistema pois daacute aos eleitores uma variedade maior de opccedilotildees de voto

                      Em relaccedilatildeo agraves suas desvantagens o TRS possui duas principais A primeira satildeo oscustos elevados do sistema decorrentes da necessidade da organizaccedilatildeo de um segundoturno de votaccedilotildees A segunda eacute o aumento no iacutendice de ausecircncias dos eleitores agraves urnasEssa ampliaccedilatildeo no natildeo comparecimento dos eleitores se daacute tambeacutem devido ao segundoturno por pura fatiga eleitoral bem como consequecircncia da desistecircncia de eleitores queapoiam candidatos que jaacute foram eliminados

                      Outro ponto negativo do TRS eacute a sua natildeo-monotonicidade Isso significa que umcandidato pode ser prejudicado com um aumento em sua popularidade e suporte e domesmo modo um candidato pode se beneficiar com a perda de popularidade e suporteSe os candidatos A e B satildeo os esperados para ir ao segundo turno onde A eacute mais fortedo que B um aumento no suporte pelo candidato A pode resultar na sua derrota quandoesse aumento causa uma alteraccedilatildeo nos candidatos que satildeo selecionados para ir ao segundoturno Se esse aumento na popularidade de A resultar na eliminaccedilatildeo preacutevia de B um

                      21

                      terceiro candidato C pode ser vitorioso sobre A no segundo turno caso os eleitores de Bprefiram C ao candidato A Se natildeo houvesse esse crescimento de popularidade A teriaderrotado B no segundo turno Essa situaccedilatildeo seraacute vista em melhores detalhes na seccedilatildeo 43

                      223 Voto Uacutetil no TRS

                      Esse sistema minimiza os efeitos do voto uacutetil em relaccedilatildeo ao FPTP pois um eleitorqualquer pode tranquilamente votar em sua preferecircncia sem se preocupar em desperdiccedilaacute-lo mesmo que seu candidato natildeo tenha chances de vitoacuteria Se este natildeo for eleito aindapoderaacute escolher a sua preferecircncia dentre os dois candidatos que prosseguirem para osegundo turno

                      Apesar disso ainda existe um cenaacuterio em que o eleitor pode ser tentado a natildeo votar emsua preferecircncia Eacute possiacutevel que ele opte pela sua segunda opccedilatildeo se souber que sua primeiraopccedilatildeo possui miacutenimas chances de ir ao segundo turno ou ateacute mesmo por saber que issodiminuiraacute as chances de algum outro candidato ser eleito Mesmo assim eacute evidente queo TRS natildeo proporciona o mesmo apelo ao voto taacutetico que o FPTP

                      Outra caracteriacutestica do TRS eacute o incentivo a formaccedilatildeo de coalizotildees entre candidatosde partidos mais populares com candidatos de partidos menos populares As coalizotildeesfornecem benefiacutecios agrave ambas as partes onde os candidatos classificados para o segundoturno em geral se juntam a candidatos jaacute eliminados com a intenccedilatildeo de agregar maisvotos enquanto os candidatos jaacute eliminados apoiam um dos dois classificados na esperanccedilade inserir propostas proacuteprias ou modificaccedilotildees agrave chapa deles

                      23 INSTANT-RUNOFF VOTING

                      Instant Runoff Voting foi uma alternativa aos meacutetodos FPTP e TRS desenvolvidanos anos 70 por um professor do Instituto de Tecnologia de Massachusetts(MIT) O IRVelimina as principais desvantagens desses outros dois sistemas a pluralidade do FPTP e anecessidade de mais de uma rodada de votaccedilatildeo do TRS Este meacutetodo tambeacutem opera emmais de uma rodada poreacutem como o proacuteprio nome sugere essas rodadas satildeo instantacircneasnatildeo sendo necessaacuterio o retorno dos eleitores agraves urnas Atualmente ele eacute utilizado naIrlanda nas eleiccedilotildees presidenciais em Londres na eleiccedilatildeo de seu prefeito e em distritosindividuais na Austraacutelia para eleger membros de sua cacircmara baixa do parlamento OIRV tambeacutem eacute usado por vaacuterias organizaccedilotildees privadas nos Estados Unidos incluindoa American Political Science Association e a American Psychological Association paraeleger seus funcionaacuterios

                      Nesse sistema os eleitores natildeo satildeo solicitados a votar em um uacutenico candidato aoinveacutes disso eles listam todos os candidatos concorrentes na ordem de sua preferecircnciaA partir dessas listas as primeiras opccedilotildees de cada eleitor recebem o seu voto e apoacutes acontagem se um candidato obtiver 50 dos votos mais um este candidato eacute eleito Se

                      22

                      isso natildeo ocorrer o candidato menos votado eacute eliminado das eleiccedilotildees e seus votos satildeotransferidos para a segunda opccedilatildeo de cada um de seus eleitores Esse procedimento serepete eliminando o candidato menos votado a cada rodada ateacute que algum dos candidatospossuam a maioridade dos votos

                      231 Exemplo

                      Na tabela 3 pode-se verificar a distribuiccedilatildeo de votos por perfil de eleitor e na tabela4 vecirc-se o desenvolvimento do IRV para essas distribuiccedilotildees O candidato D eacute o menosvotado e por consequecircncia eacute o primeiro a ser eliminado A segunda opccedilatildeo de todos oseleitores que votaram no candidato D eacute o candidato C por isso este recebe todos os votosdistribuiacutedos na segunda rodada Com isso o candidato B eacute eliminado com 25 dos votos eos candidatos A e C concorrem na uacuteltima rodada Mesmo com o candidato C na lideranccedilana segunda rodada a maior parte dos eleitores do B tem como preferecircncia o candidatoA por isso A eacute eleito com 55 dos votos contra 45 do C

                      Tabela 3 ndash Exemplo IRV

                      Rankings Ndeg de eleitoresABCD 20ABDC 16BDAC 19BDCA 6CABD 7CDBA 15DCAB 5DCBA 12

                      Tabela 4 ndash Desenvolvimento do IRVTurnos D C B A

                      1 17 22 25 362 eliminado 39 25 363 eliminado 45 eliminado 55

                      232 Vantagens e Desvantagens do IRV

                      Assim como no TRS a pluralidade eacute irrelevante no IRV e um candidato soacute eacute eleitocom a maioridade dos votos dando maior legitimidade ao mandato deste No entantopode-se argumentar que o IRV faz isso com mais eficiecircncia pois natildeo requer a execuccedilatildeode mais de uma rodada de votaccedilotildees Isso diminui os custos das eleiccedilotildees como um todoao mesmo tempo que proporciona um nuacutemero menor de isenccedilotildees por parte dos eleitoresdevido ao desgaste de todo o processo eleitoral

                      23

                      Aleacutem disso candidatos de partidos menores tendem a receber mais votos do queno FPTP e portanto satildeo mais encorajados a se candidatar Com uma lista maior decandidatos eleitores desfrutam de uma variedade maior de opccedilotildees de voto Contudomesmo com mais candidatos menos populares o spoiler effect mencionado anteriormentetambeacutem natildeo possui espaccedilo nesse sistema de votaccedilatildeo Partidos menores natildeo tem comoroubar votos de partidos maiores visto que esses votos eventualmente seratildeo transferidosde volta a eles durante o desenvolvimento das rodadas do IRV

                      Em virtude de sua estrutura acredita-se que esse meacutetodo tende a encorajar os can-didatos tambeacutem a elaborar suas campanhas de forma mais abrangente ampliando suainfluecircncia para mais do que apenas um grupo especiacutefico de maneira que ele consiga agre-gar votos de segunda ou terceira opccedilatildeo aleacutem dos votos de seus eleitores principais

                      A principal desvantagem do IRV eacute o fato de ele ainda natildeo ser amplamente utilizado aoredor do mundo Essa falta de familiaridade do sistema pode causar confusatildeo ao eleitorcomum em suas primeiras ocorrecircncias No entanto nos paiacuteses em que este eacute utilizadonatildeo parece haver confusatildeo entre os eleitores Aleacutem disso na maioria dos casos haveraacute umcusto potencialmente alto da substituiccedilatildeo ou alteraccedilatildeo dos sistemas das urnas eletrocircnicaspara que seja possiacutevel haver a implementaccedilatildeo do meacutetodo

                      Aleacutem disso assim como o TRS este sistema tambeacutem possui natildeo-monotonicidade ouseja um candidato pode ser prejudicado ao ser ranqueado mais alto enquanto que outropode se beneficiar sendo ranqueado mais baixo pelos eleitores (ORNSTEIN 2018) issopode ocorrer quando esse ranqueamento causa alteraccedilotildees na ordem em que os candidatossatildeo eliminados Essa caracteriacutestica se manifesta em fenocircmenos complexos e especiacuteficos epor isso um exemplo de sua ocorrecircncia seraacute abordada em detalhes na seccedilatildeo 43

                      233 Voto Uacutetil no IRV

                      Como os sistemas de votaccedilatildeo anteriores o IRV natildeo eacute completamente imune ao vototaacutetico No entanto este meacutetodo se mostra bem resistente a eles quando comparado aoutros meacutetodos como o FPTP e o Borda Count (Bartholdi John J III and Orlin JamesB 1990) Distintivamente o IRV requer um maior esforccedilo do eleitor para elaborar umaestrateacutegia que melhor ajuste os resultados da eleiccedilatildeo de acordo com a sua preferecircnciaAleacutem disso eacute necessaacuterio que ele tenha informaccedilatildeo suficiente sobre os rankings de outroseleitores naturalmente obtida atraveacutes de pesquisas eleitorais

                      Existe tambeacutem a possibilidade de ocorrer uma exaustatildeo dos votos quando natildeo haacuteo completo preenchimento do ranking por parte dos eleitores Nessas ocasiotildees o votonatildeo pode continuar a ser transferido a outros candidatos e ele eacute descartado Isso afetaa legitimidade do mandato do candidato eleito pois o resultado final natildeo representaraacute100 da populaccedilatildeo votante Essas ocorrecircncias no entanto podem ser minimizadas comuma melhor educaccedilatildeo eleitoral ou como foi implementado na Austraacutelia requerer que osrankings incluam uma totalidade dos candidatos concorrentes

                      24

                      24 APPROVAL VOTING SYSTEM

                      No meacutetodo Approval Voting os eleitores natildeo satildeo limitados pelo nuacutemero de candidatosem que podem votar por isso approval cada eleitor pode votar em todos os candidatos osquais ele aprova Apoacutes as votaccedilotildees o candidato com a maior quantidade de votos eacute eleitoSegundo Hamlin (2015) a cidade de Fargo na Dakota do Norte se tornou a primeiracidade nos EUA a colocar em praacutetica este sistema em suas eleiccedilotildees gerais em novembrode 2018 AVS tambeacutem eacute utilizado para eleger o secretaacuterio-geral das Naccedilotildees Unidas e emdiversas outras organizaccedilotildees

                      241 Exemplo

                      Na tabela 5 abaixo pode-se encontrar 8 perfis de eleitores com seus candidatos apro-vados e quantidade de eleitores que se encaixam no perfil Na tabela 6 temos o resultadoda contabilizaccedilatildeo dos votos destes perfis O candidato mais popular eacute o B que se encontraaprovado em 5 perfis distintos totalizando 60 votos ou aproximadamente 32

                      Tabela 5 ndash Exemplo AVS

                      Aprovaccedilotildees Ndeg de eleitoresA 20AB 16B 19

                      BDC 6CAB 7CD 15DC 5DCB 12

                      Tabela 6 ndash Resultado AVSCandidatos Total de votos

                      A 43B 60C 45D 38

                      242 Vantagens e Desvantagens do AVS

                      Aleacutem de simples este meacutetodo permite um niacutevel maior de expressividade aos eleitoresOnde no FPTP e TRS eles satildeo limitados pelo seu uacutenico voto aqui os eleitores tecircm aliberdade de demonstrar exatamente quais candidatos consideram aptos ou aceitaacuteveis aocargo

                      25

                      Outro efeito dessa liberdade trazida pelo AVS eacute a dizimaccedilatildeo do spoiler effect Can-didatos de partidos menores natildeo tem como roubar votos de partidos maiores nessesistema ambos os candidatos contabilizariam o voto

                      243 Voto Uacutetil no AVS

                      O tipo de voto uacutetil no AVS eacute denominado bullet voting Segundo The Center forElection Science (2015) esta taacutetica envolve simplesmente ignorar a possibilidade de votarem mais de um candidato e votar apenas em sua primeira opccedilatildeo Um eleitor pode serlevado a adotar essa estrateacutegia quando percebe que sua preferecircncia pode ser prejudicadacom o voto em alguma segunda opccedilatildeo sua Em um cenaacuterio extremo onde 100 doseleitores adotam esta estrateacutegia as eleiccedilotildees satildeo convertidas a um simples First Past ThePost

                      25 THE BORDA COUNT

                      Este meacutetodo carrega o nome em homenagem a seu criador Jean-Charles de Bordaque o desenvolveu em 1770 (LIPPMAN 2012) A contagem de Borda utiliza a abordagemde ranqueamento dos candidatos poreacutem de maneira diferente ao IRV Este eacute um sistemaque atribui uma pontuaccedilatildeo aos candidatos com base nestes rankings O candidato na basedo ranking natildeo recebe pontos o candidato imediatamente acima deste recebe 1 pontoo proacuteximo recebe 2 pontos e assim por diante ateacute o topo do ranking As pontuaccedilotildees detodos os rankings satildeo contabilizadas e o candidato com maior pontuaccedilatildeo eacute eleito Deacordo com Lippman variaccedilotildees deste meacutetodo satildeo encontradas em uso na premiaccedilatildeo dediversos esportes como na seleccedilatildeo do MVP(Most Valuable Player) da MLB(principal ligade beisebol dos EUA) e no Trofeacuteu Heisman de futebol americano universitaacuterio

                      251 Exemplo

                      Neste exemplo seratildeo aproveitados os mesmos rankings apresentados na tabela 3 Porserem 4 candidatos o primeiro colocado de cada ranking receberaacute 3 pontos o segundo 2pontos o terceiro 1 e o quarto 0 Assim o nuacutemero maacuteximo de pontos que um candidatopode atingir eacute igual a 300(se ficar na primeira posiccedilatildeo em todos os rankings) e o nuacutemerototal de pontos no sistema eacute 600 O nuacutemero maacuteximo de pontos que um candidato podeatingir eacute calculado com

                      (cminus 1)times e

                      Sendo c igual ao nuacutemero de candidatos e e o nuacutemero de eleitores Por sua vez onuacutemero total de pontos no sistema eacute

                      26

                      (cminus 1)times c2

                      times e

                      A contagem final dos pontos eacute apresentada na tabela 7 abaixo

                      Tabela 7 ndash Resultado BCCandidatos Total de pontos

                      A 146B 181C 126D 147

                      O candidato eleito eacute o B com 181 pontos ou aproximadamente 60 da pontuaccedilatildeomaacutexima

                      252 Vantagens e Desvantagens do BC

                      Em comparaccedilatildeo com os meacutetodos abordados anteriormente que apenas consideramas primeiras opccedilotildees de cada eleitor este meacutetodo regularmente escolhe candidatos comaceitaccedilatildeo mais ampla ao inveacutes de uma preferecircncia direta dos eleitores (Electoral ReformSociety 2017b)

                      Ele tambeacutem encoraja uma abordagem estrateacutegica por parte dos partidos onde seriade seu interesse nomear mais de um candidato para concorrer pois quanto mais candi-datos estatildeo no paacutereo maior eacute a pontuaccedilatildeo dos primeiros colocados Logo a nomeaccedilatildeo decandidatos menos populares pode beneficiar os principais candidatos de um partido

                      253 Voto Uacutetil no BC

                      Existem duas estrateacutegias aplicaacuteveis a esse sistema A primeira denominada compromi-sing de maneira similar a outros meacutetodos de votaccedilatildeo se resume em ranquear em primeirolugar um dos candidatos que estejam liderando as eleiccedilotildees mesmo que este natildeo seja suapreferecircncia real A segunda estrateacutegia burying eacute o oposto esta se baseia em ranquearem uacuteltimo lugar um dos candidatos liacutederes mesmo que este natildeo seja o seu candidato demaior desgosto Ambas estrateacutegias podem ser aplicadas ao mesmo tempo por um eleitor

                      26 SCORE VOTING SYSTEM

                      Score Voting ou Range Voting como tambeacutem eacute conhecido eacute mais um meacutetodo quetenta trazer maior liberdade de expressatildeo aos eleitores Assim como o Borda Counteste sistema funciona baseado na pontuaccedilatildeo dos candidatos no entanto ao inveacutes dessapontuaccedilatildeo ser relativa agrave posiccedilatildeo do candidato no ranking de cada eleitor este por sua veztem completa liberdade de atribuir qualquer quantidade de pontos aos candidatos dentro

                      27

                      de determinada escala Um eleitor pode dar o mesmo nuacutemero de pontos para diferentescandidatos e apoacutes o somatoacuterio de todas as pontuaccedilotildees o candidato com a pontuaccedilatildeo maisalta eacute eleito Incorporado ao escopo poliacutetico o SVS eacute utilizado no Partido Pirata Alematildeobem como em diversas organizaccedilotildees tais como o Fedora Project e Mozilla e tambeacutem emvariados esportes oliacutempicos e reality shows como o American Idol aponta Hamlin (2015)

                      261 Exemplo

                      Neste exemplo temos apresentados na tabela 8 abaixo 4 perfis distintos de eleitorese suas respectivas atribuiccedilotildees de pontos aos 4 candidatos Cada eleitor pode atribuirqualquer pontuaccedilatildeo a um candidato dentro da escala de -10 a 10 O resultado da eleiccedilatildeoapoacutes a soma de todos os pontos por candidato se encontra na tabela 9 onde o candidatoA eacute eleito com um total de 605 pontos

                      Tabela 8 ndash Exemplo SVS

                      Perfil A B C D Ndeg de eleitores1 10 -1 5 2 362 6 9 -3 4 253 2 0 8 4 224 3 3 3 10 17

                      Tabela 9 ndash Resultado SVSCandidatos Total de pontos

                      A 605B 240C 332D 430

                      262 Vantagens e Desvantagens do SVS

                      A grande vantagem do SVS eacute como ele proporciona aos eleitores expressar de maneiramuito proacutexima potencialmente exata suas impressotildees poliacuteticas de cada candidato Eleeacute ainda mais expressivo que o AVS Dessa maneira o spoiler effect tambeacutem se torna nuloao passo que toda intenccedilatildeo de voto eacute precisamente representada neste sistema

                      Assim como outros meacutetodos eleitorais este sofre igualmente dos males produzidos pelovoto taacutetico Sua principal desvantagem eacute discutida na seccedilatildeo abaixo

                      263 Voto Uacutetil no SVS

                      Da mesma maneira que no Approval Voting atraveacutes do bullet voting o SVS tambeacutempode ser convertido em uma eleiccedilatildeo sob o meacutetodo FPTP em um cenaacuterio com um grande

                      28

                      volume de eleitores maliciosos O voto uacutetil sob este sistema se manifesta pontuando-seapenas um candidato com uma nota positiva e todos os outros com as notas mais baixasda escala Se todos os eleitores se aproveitarem dessa abordagem natildeo existiraacute distinccedilatildeoefetiva entre uma eleiccedilatildeo sob SVS e FPTP Essencialmente cada eleitor estaacute votando emapenas um candidato Essa eacute a principal desvantagem do SVS e ela consegue eliminarsua principal vantagem dar ao eleitor um poder maior de expressatildeo

                      27 BLOC VOTE

                      O Bloc Vote eacute um meacutetodo utilizado para a eleiccedilatildeo de candidatos a cargos no governocom mais de uma vacacircncia Pode ser considerado um meio-termo entre o FPTP e oAVS pois os eleitores podem votar em mais de um candidato poreacutem satildeo limitados pelonuacutemero de vagas Em uma eleiccedilatildeo com duas vagas por exemplo cada eleitor selecionaraacutedois candidatos ou menos Sensatamente o candidato mais votado eacute eleito Ele possuialgumas utilizaccedilotildees em eleiccedilotildees locais em algumas partes da Inglaterra (Electoral ReformSociety 2017a)

                      271 Exemplo

                      Neste exemplo dois candidatos seratildeo eleitos logo cada eleitor votaraacute em no maacuteximodois candidatos A distribuiccedilatildeo de votos pode ser conferida na tabela 10 e o resultado dacontagem de votos na tabela 11 abaixo Os candidatos eleitos satildeo o C totalizando 78do maacuteximo de votos possiacuteveis para um candidato e o A com 43

                      Tabela 10 ndash Exemplo BV

                      Aprovaccedilotildees Ndeg de eleitoresAC 20AB 16BC 19BD 6CA 7CD 15DC 17

                      Tabela 11 ndash Resultado BVCandidatos Total de votos

                      A 43B 41C 78D 38

                      29

                      272 Voto Uacutetil no BV

                      Neste sistema eacute possiacutevel que um eleitor evite votar em sua primeira opccedilatildeo quandoeste natildeo tem chances de vitoacuteria e se fazendo isto ele diminuiraacute as chances de algum outrocandidato de seu desgosto ganhar Poreacutem o sistema previne um outro tipo de voto uacutetilEm eleiccedilotildees com mais de uma vaga onde os eleitores soacute podem votar em um candidatose um eleitor sabe que sua primeira opccedilatildeo tambeacutem eacute a primeira opccedilatildeo da maior parteda populaccedilatildeo e portanto muito provavelmente seraacute um dos candidatos eleitos eacute possiacutevelque ele arrisque votar em uma segunda opccedilatildeo sua na esperanccedila de a longo prazo elegersuas duas principais opccedilotildees de voto Com os eleitores podendo votar no nuacutemero exato devagas disponiacuteveis esse tipo de pensamento taacutetico perde o sentido

                      30

                      3 O SIMULADOR

                      Para este trabalho foi implementado um simulador eleitoral na forma de uma aplicaccedilatildeoweb para que a interaccedilatildeo do usuaacuterio fosse facilitada Veremos a seguir como se daacute suautilizaccedilatildeo de forma geral

                      Figura 2 ndash Captura de tela 1

                      Figura 3 ndash Captura de tela 2

                      A primeira opccedilatildeo encontrada pelo usuaacuterio eacute a escolha de quais sistemas de votaccedilatildeo se-ratildeo simulados (Figura 2) Todos eles podem ser selecionados para rodar simultaneamentePoreacutem natildeo eacute permitido rodar uma simulaccedilatildeo do Bloc Vote para uma eleiccedilatildeo onde apenasum candidato eacute eleito aleacutem disso natildeo existe implementaccedilatildeo dos meacutetodos TRS e IRV para

                      31

                      eleiccedilotildees com mais de um candidato eleito jaacute que eles se comportariam exatamente comono FPTP

                      A maioria das linguagens de programaccedilatildeo senatildeo todas possuem um gerador de nuacuteme-ros pseudoaleatoacuterios que fornece a possibilidade de definir uma seed para o gerador Estaseed funciona como um ponto de partida para a geraccedilatildeo dos nuacutemero e portanto todasimulaccedilatildeo que rodar com a mesma seed sempre teraacute os mesmos resultados Se nenhumvalor for fornecido pelo usuaacuterio o tempo atual do sistema eacute utilizado As opccedilotildees subse-quentes satildeo a escolha do nuacutemero de eleitores gerados e o nuacutemero de vagas (Figura 3) Senenhum valor for fornecido o nuacutemero de eleitores padratildeo utilizado eacute 1000 e o nuacutemero devagas igual a 1

                      Figura 4 ndash Captura de tela 3

                      Este simulador possui dois modos para a criaccedilatildeo dos rankings dos eleitores No modoManipulate (Figura 4) primeiramente se define o nuacutemero de candidatos atraveacutes do campode entrada ao lado do tiacutetulo Candidates ou alternativamente pode-se adicionar candida-tos um a um atraveacutes do sinal de mais na parte inferior da paacutegina Para cada candidatoeacute possiacutevel definir a porcentagem de seus eleitores que optaraacute pelo voto taacutetico e pelovoto de minoria Tambeacutem eacute possiacutevel alterar o nome dos candidatos se for do interessedo usuaacuterio

                      32

                      Figura 5 ndash Captura de tela 4

                      Figura 6 ndash Captura de tela 5

                      33

                      Figura 7 ndash Captura de tela 6

                      Apoacutes a criaccedilatildeo dos candidatos o usuaacuterio pode criar perfis de eleitores que definiratildeo demaneira exata como partes da populaccedilatildeo iraacute votar (Figura 5) Em cada perfil se defineo valor em porcentos da populaccedilatildeo votante que o adotaraacute e a nota de cada candidatoTambeacutem eacute possiacutevel nomear cada perfil livremente

                      No modo Generate (Figura 6) eacute onde o gerador de nuacutemeros pseudoaleatoacuterios eacute usadoNesse modo ao inveacutes do usuaacuterio criar perfis de eleitores ele define qual seraacute a distribuiccedilatildeoadotada para a geraccedilatildeo de notas de cada candidato Essas distribuiccedilotildees seratildeo mais bemdetalhadas no Capiacutetulo 5 Da mesma maneira que no modo Manipulate nesse modotambeacutem eacute possiacutevel definir os valores para os dois tipos de voto uacutetil os votos taacuteticos eos votos de minoria No primeiro estatildeo incluiacutedas as estrateacutegias de mudanccedila de votoespeciacuteficas de cada sistema como o bullet voting no AVS e SVS ou quando a preferecircnciade um eleitor claramente natildeo possui chances de vitoacuteria e ele muda seu voto para um doscandidatos que esteja na lideranccedila o que ocorre no FPTP e TRS O voto de minoriase apresenta apenas no FPTP em eleiccedilotildees onde mais de um candidato eacute eleito Se apreferecircncia de um eleitor claramente lidera a eleiccedilatildeo por ser tambeacutem a preferecircncia damaior parte da populaccedilatildeo esse eleitor pode mudar o seu voto para uma segunda opccedilatildeona esperanccedila de eleger dois de seus candidatos favoritos

                      Por fim em ambos os modos o usuaacuterio tem a opccedilatildeo de definir coalizotildees entre oscandidatos se o sistema TRS estiver habilitado pois as coalizotildees apenas se manifestamnesse sistema Essas coalizotildees alteraratildeo as notas dos candidatos dependendo dos outroscandidatos pertencentes a elas (Figura 7)

                      A aplicaccedilatildeo pode ser encontrada na paacutegina httpelectionsimpythonanywherecom

                      34

                      4 CENAacuteRIOS PERTINENTES

                      Para todos os cenaacuterios deste capiacutetulo seraacute usada a seed do simulador igual a 100 e apopulaccedilatildeo de eleitores igual a 1000 para que exista consistecircncia na anaacutelise e tambeacutem paraque possa haver replicaccedilatildeo dos resultados se necessaacuterio

                      41 CENAacuteRIO 1 VOTO TAacuteTICO

                      Neste exemplo teremos quatro candidatos Ana Beto Carla e Diego Ana e Betoseratildeo gerados a partir da distribuiccedilatildeo Neutral (Figura 47) Carla da distribuiccedilatildeo Disliked(Figura 51) e Diego da Hated (Figura 55) Para a simulaccedilatildeo com a seed 100 o melhorcandidato a ser eleito ou seja aquele que maximiza a meacutedia das notas dos eleitores eacute oBeto com uma meacutedia de 0073 Para cada sistema seratildeo comparados os resultados semvoto taacutetico aos com 20 de voto taacutetico a favor da Ana Abaixo se encontram osresultados para o sistema FPTP

                      Figura 8 ndash FPTP - Cenaacuterio 1 sem voto taacutetico

                      Figura 9 ndash TRS segundo turno - Cenaacuterio 1 sem voto taacutetico

                      35

                      Figura 10 ndash IRV primeiro turno - Cenaacuterio 1

                      Figura 11 ndash IRV segundo turno - Cenaacuterio 1

                      Figura 12 ndash IRV terceiro turno - Cenaacuterio 1

                      36

                      Figura 13 ndash AVS - Cenaacuterio 1 sem voto taacutetico

                      Figura 14 ndash BC - Cenaacuterio 1 sem voto taacutetico

                      Figura 15 ndash SVS - Cenaacuterio 1 sem voto taacutetico

                      37

                      Nesse cenaacuterio sem voto taacutetico o uacutenico sistema que natildeo elege o Beto eacute o AVS Todosos outros elegem o melhor candidato Ou seja apesar de Beto ter uma melhor meacutediadas notas dos eleitores existem mais eleitores que ranqueiam Ana com uma nota acimade 0 No entanto apenas 20 dos eleitores de Diego e Carla que preferem a Ana aoinveacutes do Beto satildeo o suficiente para fazer Beto natildeo ser eleito se eles decidirem abandonarsua primeira opccedilatildeo e votar na Ana Considerando a vantagem que os votos taacuteticosproporcionam agrave Ana esta eacute eleita em todos os sistemas menos o TRS e o IRV

                      Figura 16 ndash FPTP - Cenaacuterio 1 - 20 de voto taacutetico na Ana

                      Figura 17 ndash TRS segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                      38

                      Figura 18 ndash IRV primeiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                      Figura 19 ndash IRV segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                      Figura 20 ndash IRV terceiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                      39

                      Figura 21 ndash AVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                      Figura 22 ndash BC - Cenaacuterio 1 20 de voto taacutetico na Ana

                      Figura 23 ndash SVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                      40

                      Eacute claro que se os eleitores que preferem o Beto tambeacutem votassem de maneira estra-teacutegica a situaccedilatildeo se equilibraria e haveria o mesmo niacutevel de concorrecircncia entre os doiscandidatos que ocorre quando natildeo haacute voto taacutetico Poreacutem no Borda Count esse equiliacute-brio pode natildeo acontecer e as estrateacutegias de compromising e burying podem acabar saindopela culatra se uma porcentagem elevada dos eleitores as adotarem Abaixo encontram-seos resultados para esse sistema quando 100 dos eleitores de Carla e Diego se comportammaliciosamente

                      Figura 24 ndash BC - Cenaacuterio 1 100 de voto taacutetico na Ana e Beto

                      Por causa do uso demasiado da estrateacutegia burying Ana e Beto perdem muitos pontose isso abre espaccedilo para uma vitoacuteria da Carla No entanto para porcentagens menores que100 o Beto ainda eacute o vencedor

                      Essas duas estrateacutegias tambeacutem foram implementadas nesse simulador para o sistemaIRV e eacute possiacutevel ver como ele eacute resistente a elas Para que seja possiacutevel mudar os resultadosde uma eleiccedilatildeo sob o IRV eacute necessaacuterio mudar a ordem de eliminaccedilatildeo dos candidatos paraque o seu candidato preferido acabe enfrentando um candidato mais fraco nas rodadasfinais Isso natildeo ocorre com compromising e burying No proacuteximo cenaacuterio seraacute analisadacomo eacute possiacutevel modificar os resultados de uma eleiccedilatildeo sob o IRV

                      Esses resultados podem ser replicados acessando os linksSem votos taacuteticos lthttpelectionsimpythonanywherecomdirect_res1111110

                      --[0021][22Ana2222Beto222022Carla2222Diego22]------100gt

                      Com 20 de voto taacutetico lthttpelectionsimpythonanywherecomdirect_res1111110--[0021][22Ana222022Beto2222Carla2222Diego22]1-[02000]---100gt

                      Com 100 de voto taacuteticona Ana e Beto lthttpelectionsimpythonanywherecomdirect_res0000100--[0021][22Ana222022Beto222022Carla2222Diego22]1-[101000]---100gt

                      41

                      42 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV

                      Neste cenaacuterio teremos Ana Carla e Beto concorrendo e trecircs perfis distintos que apoiamcada candidato As distribuiccedilotildees de notas dos perfis se encontram na tabela abaixo

                      Tabela 12 ndash Distribuiccedilatildeo de notas - Cenaacuterio 2

                      Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                      deeleitores

                      1 10 5 0 422 0 10 5 303 5 0 10 28

                      Com essas distribuiccedilotildees Carla eacute eliminada na primeira rodada e seus 28 de votossatildeo transferidos para a segunda opccedilatildeo de seus eleitores Ana que eacute eleita com 70 dosvotos e uma meacutedia de 56

                      Figura 25 ndash IRV primeiro turno - Cenaacuterio 2

                      Figura 26 ndash IRV segundo turno - Cenaacuterio 2

                      42

                      Cientes desse provaacutevel futuro cenaacuterio onde Ana eacute eleita uma pequena parte dos elei-tores de Beto estrategicamente o abandona e decide apoiar Carla na esperanccedila de leva-laao segundo turno contra Ana As novas distribuiccedilotildees de notas se encontram na tabelaabaixo com essa porccedilatildeo de eleitores representada pelo perfil 4

                      Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2

                      Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                      deeleitores

                      1 10 5 0 422 0 10 5 283 5 0 10 284 0 8 10 2

                      Essa mudanccedila estrateacutegica de voto altera a ordem de eliminaccedilotildees do sistema com Betosendo o primeiro a ser eliminado Com isso seus votos satildeo naturalmente transferidos paraCarla que derrota Ana no segundo turno com 58 dos votos

                      Figura 27 ndash IRV primeiro turno com voto taacutetico - Cenaacuterio 2

                      Figura 28 ndash IRV segundo turno com voto taacutetico - Cenaacuterio 2

                      43

                      Percebendo que a eleiccedilatildeo de Beto natildeo era provaacutevel seus eleitores conseguiram aomenos impedir a eleiccedilatildeo do pior candidato para eles Mas para isso foi necessaacuterio queeles tivessem a informaccedilatildeo de como os outros eleitores votariam Uma aproximaccedilatildeo dessasinformaccedilotildees poderia ser obtida em um cenaacuterio real com poucos candidatos atraveacutes depesquisas eleitorais poreacutem se o nuacutemero de candidatos eacute significativo uma noccedilatildeo completadas distribuiccedilotildees dos rankings dos eleitores se torna muito menos viaacutevel e dificulta aformulaccedilatildeo de estrateacutegias para alterar a ordem em que os candidatos satildeo eliminados

                      Esses resultados podem ser replicados acessando os linksSem voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana22

                      22Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                      Com voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana

                      2222Beto2222Carla22]-----42Voter20Profile2001020520028Voter20Profile2010201020528Voter20Profile202520020102Voter20Profile20302082010100gt

                      43 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE

                      O interessante dos sistemas IRV e TRS eacute que os resultados do cenaacuterio anterior po-deriam ter sido obtidos ao inveacutes do voto taacutetico pela sua natildeo-monotonicidade Seriapossiacutevel que a Carla derrotasse a Ana no segundo turno atraveacutes do proacuteprio aumento depopularidade da Ana Assumindo que essa popularizaccedilatildeo ocorresse entre os candidatosdo perfil 2 onde 3 passasse a apoiar a Ana ao inveacutes do Beto as novas distribuiccedilotildeesseguiriam a tabela abaixo

                      Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                      Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                      deeleitores

                      1 10 5 0 452 0 10 5 273 5 0 10 28

                      Dessa maneira Beto agora com uma porcentagem dos eleitores menor do que a deCarla seraacute eliminado na primeira rodada e como seus eleitores tecircm a Carla como segundaopccedilatildeo ela receberaacute todos os seus votos e seraacute eleita na segunda rodada As rodadas doIRV podem ser vistas nas figuras 29 e 30

                      44

                      Figura 29 ndash IRV primeiro turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                      Figura 30 ndash IRV segundo turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                      Tabela 15 ndash Resultados do Cenaacuterio 3Candidato

                      eleitoMeacutedia das

                      notasAntes da

                      popularizaccedilatildeode Ana

                      Ana 56

                      Apoacutespopularizaccedilatildeo

                      de AnaCarla 415

                      Os efeitos dessa caracteriacutestica se refletem na satisfaccedilatildeo meacutedia da populaccedilatildeo A Ana eacuteclaramente a melhor candidata e mesmo com o seu ganho de popularidade (ou devido aele) a Carla eacute eleita

                      Esses resultados podem ser replicados acessando os linksAntes da popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecom

                      direct_res0010000---[22Ana2222Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                      45

                      Apoacutes popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana2222Beto2222Carla22]-----45Voter20Profile2001020520027Voter20Profile2010201020528Voter20Profile20252002010100gt

                      44 CENAacuteRIO 4 COALIZOtildeES

                      O TRS por ser organizado em dois turnos separados normalmente a semanas dedistacircncia um do outro acaba abrindo brecha agrave mudanccedila de opiniatildeo por parte dos eleitorese o desenvolvimento de novas estrateacutegias por parte dos candidatos tais como a coalizatildeocom candidatos jaacute eliminados Com isso em mente nesse cenaacuterio teremos novamenteos quatro candidatos Ana Beto Carla e Diego Os trecircs primeiros seratildeo gerados dadistribuiccedilatildeo Neutral e Diego da distribuiccedilatildeo Disliked

                      Figura 31 ndash TRS turno 1 - Cenaacuterio 4

                      No TRS normal Ana Beto e Carla possuem com essas distribuiccedilotildees quantidades devotos muito proacuteximas com Beto e Carla indo para o segundo turno Carla estaacute 10 votosatraacutes de Beto e decide aproveitar o espaccedilo de tempo entre os dois turnos para tentaragregar mais votos Com isso Carla se aproxima de Diego e juntos formam uma coalizatildeoNo entanto com sua baixa popularidade Diego acaba ferindo a reputaccedilatildeo de Carla etorna o segundo turno muito mais faacutecil para Beto (Figura 33) Se Carla tivesse buscado osuporte de Ana por outro lado ela se veria vitoriosa no segundo turno e com uma amplavantagem sobre o Beto (Figura 34) Ou ateacute mesmo sem buscar uma coalizatildeo mesmosendo uma corrida apertada Carla teria naturalmente sido eleita (Figura 32)

                      Esses resultados podem ser replicados acessando os linksSem coalizotildees lthttpelectionsimpythonanywherecomdirect_res0100000

                      --[0002][22Ana222022Beto2222Carla2222Diego22]------100gt

                      46

                      Figura 32 ndash TRS turno 2 - Cenaacuterio 4

                      Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4

                      Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4

                      47

                      Coalizatildeo Carla e Diego lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2203Carla20Diego-100gt

                      Coalizatildeo Carla e Ana lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2200Carla20Ana-100gt

                      45 CENAacuteRIO 5 DILEMA DO PRISIONEIRO

                      Neste cenaacuterio temos uma eleiccedilatildeo de uma vaga com trecircs candidatos concorrentes e trecircsperfis distintos de eleitores que seguiratildeo as seguintes distribuiccedilotildees

                      Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5

                      Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                      deeleitores

                      1 10 -10 5 362 -10 10 5 343 -10 -10 5 30

                      Esse contexto nos remete ao notaacutevel dilema do prisioneiro Nele dois prisioneiroscuacutemplices satildeo interrogados individualmente sem poder se comunicar um com o outro ecada um enfrenta o dilema de delatar ou natildeo o seu parceiro Se os dois prisioneirosdecidem se manter calados sobre o crime ambos satildeo sentenciados a um ano de prisatildeo Seapenas um deles dedurar o outro o traidor sai livre enquanto seu parceiro eacute condenadoa trecircs anos Se ambos dedurarem um ao outro eles satildeo condenados juntos a dois anosde prisatildeo Esse dilema eacute uma ideia claacutessica presente no estudo da teoria dos jogos sendooriginalmente elaborada por Merrill Flood e Melvin Dresher em 1950 e mais tarde sendonomeada de dilema dos prisioneiros por Albert W Tucker (POUNDSTONE 1992)

                      O que esse dilema nos mostra eacute a tentaccedilatildeo que o indiviacuteduo deteacutem se sua racionalizaccedilatildeoestiver voltada para seus proacuteprios interesses e somente eles em oposiccedilatildeo a pensar no bemdo grupo como um todo Neste cenaacuterio encontramos dois grupos de eleitores expressiva-mente opostos os perfis 1 e 2 Se qualquer uma das preferecircncias desses perfis fosse eleitaisso significaria uma alta rejeiccedilatildeo de maior parte da populaccedilatildeo No entanto eles possuema segunda opccedilatildeo em comum a Carla que por sua vez eacute a preferecircncia do terceiro perfilPortanto a eleiccedilatildeo da Carla seria logicamente o resultado oacutetimo

                      Mesmo assim a Ana eacute eleita nos dois sistemas acima o que natildeo parece justo poispela tabela 16 eacute evidente que apenas 36 da populaccedilatildeo a aprova enquanto que os outros64 a reprovam ao maacuteximo O sistema IRV se comporta de maneira idecircntica ao TRS

                      48

                      Figura 35 ndash FPTP - Cenaacuterio 5

                      Figura 36 ndash TRS segundo turno - Cenaacuterio 5

                      nesta situaccedilatildeo Com esse resultado a meacutedia das notas eacute -28 No entanto os trecircs sistemasseguintes nos apresentam resultados diferentes

                      Tabela 17 ndash Resultados do Cenaacuterio 5

                      Sistema Candidatoeleito

                      Meacutedia dasnotas

                      FPTP Ana -28TRS Ana -28IRV Ana -28AVS Carla 50BC Carla 50SVS Carla 50

                      49

                      Figura 37 ndash AVS - Cenaacuterio 5

                      Figura 38 ndash BC - Cenaacuterio 5

                      Tanto o AVS quanto o Borda Count e o SVS satildeo sistemas que consideram todasas opiniotildees de cada eleitor ao mesmo tempo e por isso satildeo capazes de eleger o melhorcandidato nesta situaccedilatildeo diferentemente do TRS que natildeo absorve completamente todosentimento do eleitor por todos os candidatos e o IRV que apesar de ser bem expressivoquebra esse processo em inuacutemeras rodadas o que permite a perda de informaccedilatildeo ao longodelas

                      Esses resultados podem ser replicados acessando o linklthttpelectionsimpythonanywherecomdirect_res1111110---[22Ana

                      222022Beto222022Carla22]-----36Voter20Profile2001020-1020534Voter20Profile201-10201020530Voter20Profile202-1020-10205100gt

                      50

                      Figura 39 ndash SVS - Cenaacuterio 5

                      46 CENAacuteRIO 6 VOTO DE MINORIA

                      Neste cenaacuterio temos uma eleiccedilatildeo com quatro candidatos e duas vagas A Ana seraacutea preferecircncia de uma extensa parte da populaccedilatildeo (distribuiccedilatildeo Loved Figura 53) Betoe Carla seratildeo candidatos razoavelmente populares (distribuiccedilatildeo Neutral Figura 47) eDiego seraacute a preferecircncia de apenas um pequeno grupo especiacutefico e rejeitado pela maioria(distribuiccedilatildeo Disliked Figura 51) Eacute intuitivo esperar que os dois candidatos eleitos seratildeoa Ana e ou o Beto ou a Carla e isso eacute exatamente o que ocorre na figura 40 no sistemaFPTP sem voto de minoria

                      Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria

                      Eacute evidente a discrepacircncia da quantidade de votos da Ana para os outros candidatose apesar de Beto e Carla serem mais populares que Diego os trecircs natildeo se encontrammuito afastados Poreacutem se a pequena fraccedilatildeo de candidatos que possuem a Ana como

                      51

                      Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego

                      preferecircncia e Diego como segunda opccedilatildeo optarem pelo voto de minoria a situaccedilatildeo mudacompletamente (Figura 41) Assim apesar de extensamente rejeitado Diego conquistaa segunda vaga e a meacutedia das notas despenca de 2929 para 0505 No entanto aindaexiste um cenaacuterio pior Se os outros grupos de eleitores pensarem da mesma forma eevitarem votar na Ana achando que sua eleiccedilatildeo jaacute estaacute assegurada apenas 80 de votode minoria para esses grupos jaacute eacute o suficiente para eliminaacute-la das eleiccedilotildees (Figura 42)Com a Ana eliminada a meacutedia das notas cai ainda mais para 0058

                      Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego

                      O sistema Bloc Vote eacute uma das soluccedilotildees para o voto de minoria Permitindo queos eleitores votem no mesmo nuacutemero de candidatos que de vagas a serem preenchidasnatildeo existe o iacutempeto a esse tipo de voto estrateacutegico O resultado desse sistema portantoretorna a meacutedia das notas a casa dos 29 (Figura 43) Os sistemas AVS Borda Count eSVS tambeacutem impedem a presenccedila do voto de minoria e atingem resultados semelhantes

                      52

                      Figura 43 ndash BV - Cenaacuterio 6

                      Tabela 18 ndash Resultados do Cenaacuterio 6

                      Sistema Candidatoseleitos

                      Meacutedia dasnotas

                      FPTP sem voto de minoriaAna eBeto 2929

                      FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

                      FPTP com 80 de voto de minoriaBeto eCarla 0058

                      Bloc VoteAna eCarla 2913

                      Esses resultados podem ser replicados acessando os links

                      Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

                      100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

                      80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

                      53

                      5 COMO FUNCIONA O SIMULADOR

                      O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

                      51 CLASSE ELECTIONS

                      Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

                      bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

                      Figura 44 ndash estrutura candidates

                      bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

                      bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

                      Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

                      Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

                      54

                      Figura 45 ndash estrutura voters

                      Figura 46 ndash estrutura votes

                      daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

                      Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

                      55

                      Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

                      Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

                      na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

                      56

                      Figura 49 ndash PDF - Distribuiccedilatildeo Liked

                      Figura 50 ndash CDF - Distribuiccedilatildeo Liked

                      (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

                      Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

                      57

                      Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

                      Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

                      candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

                      Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

                      58

                      Figura 53 ndash PDF - Distribuiccedilatildeo Loved

                      Figura 54 ndash CDF - Distribuiccedilatildeo Loved

                      funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

                      59

                      Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                      Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                      Meacutedia das Notas sumei

                      sumvj nij

                      etimes v

                      Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                      Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                      60

                      Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                      Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                      52 CLASSE FIRSTPASTTHEPOST

                      Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                      Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                      61

                      Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                      Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                      mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                      62

                      53 CLASSE TWOROUNDSYSTEM

                      A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                      54 CLASSE INSTANTRUNOFFVOTING

                      A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                      Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                      63

                      cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                      55 CLASSE APPROVALVOTING

                      Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                      56 CLASSE BORDACOUNT

                      Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                      57 CLASSE SCOREVOTING

                      De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                      64

                      58 CLASSE BLOCVOTE

                      O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                      59 TECNOLOGIAS UTILIZADAS

                      A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                      Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                      O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                      Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                      65

                      6 CONCLUSAtildeO

                      Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                      Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                      Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                      Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                      Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                      66

                      REFEREcircNCIAS

                      AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                      Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                      Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                      Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                      HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                      LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                      ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                      Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                      POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                      The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                      67

                      APEcircNDICES

                      APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                      Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                      if(not len(selfvoter_profiles))

                      for voter in range(selfN_VOTERS)

                      candidates_rank = dict()

                      for candidate in reversed(range(selfN_CANDIDATES))

                      if(selfBIAS_VECTOR[candidate]==4)

                      candidates_rank[candidate] = self_sortear(selfloved)

                      elif(selfBIAS_VECTOR[candidate]==3)

                      candidates_rank[candidate] = self_sortear(selfliked)

                      elif(selfBIAS_VECTOR[candidate]==2)

                      candidates_rank[candidate] = self_sortear(selfdisliked)

                      elif(selfBIAS_VECTOR[candidate]==1)

                      candidates_rank[candidate] = self_sortear(selfhated)

                      elif(selfBIAS_VECTOR[candidate]==-1)

                      candidates_rank[candidate] = self_sortear(selfpolarizer

                      )

                      elif(selfBIAS_VECTOR[candidate]==-2)

                      candidates_rank[candidate] = self_sortear(self

                      more_polarizer)

                      else

                      candidates_rank[candidate] = self_sortear(selfneutral)

                      selfvotersappend(candidates_rank)

                      else

                      ranges = []

                      ranks = []

                      for prof in selfvoter_profiles

                      rangesappend(int(prof[pop_percentage]))

                      rank =

                      for index score in enumerate(prof[scores])

                      rank[index] = score

                      ranksappend(rank)

                      for index _range in enumerate(ranges)

                      for _ in range(int(selfN_VOTERS(_range100)))

                      selfvotersappend(ranks[index])

                      68

                      APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                      Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                      for i in range(selfN_CANDIDATES)

                      selfcandidates[i] = 0

                      selfvotes[i] = set()

                      APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                      Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                      for candidate in range(selfN_CANDIDATES)

                      rating_sum = 0

                      for voter in selfvoters

                      rating_sum += voter[candidate]

                      selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                      APEcircNDICE D ndash MEacuteTODO GET_MEAN

                      Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                      if len(winners) gt 1 or selfN_CANDIDATES gt 10

                      return selfcalculate_mean(winners)

                      else

                      chose_best = True if winners[0] == selfbest_candidate else

                      False

                      return selfstats[rsquomeansrsquo][winners[0]] chose_best

                      69

                      APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                      Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                      rating_sum = 0

                      for voter in selfvoters

                      for candidate in winners

                      rating_sum += voter[candidate]

                      return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                      APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                      Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                      for i in range(1 selfN_VACANCIES + 2)

                      selfleading_candidatesappend(selfsorted_candidates[-i][self

                      CANDIDATE_INDEX])

                      APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                      Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                      for leader in selfelecrounds[-1]

                      selfleading_candidatesappend(leader[0])

                      70

                      APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                      Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                      self_account_for_coalitions()

                      for voter in selfvoters

                      selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                      (1)))

                      temp = []

                      for voter in selfsorted_voters

                      new_dict = defaultdict(list)

                      for k in voter

                      new_dict[k[1]]append(k[0])

                      tempappend(new_dict)

                      selfsorted_voters = []

                      for voter_index current_voter in enumerate(temp)

                      new_voter = []

                      for rating candidate_indexes in current_voteritems()

                      if len(current_voter[rating]) gt 1

                      shuffle(current_voter[rating])

                      for e in candidate_indexes

                      new_voterappend((e rating))

                      else

                      new_voterappend((candidate_indexes[0] rating))

                      selfsorted_votersappend(new_voter)

                      selfcandidates[new_voter[-1][0]] += 1

                      selfvotes[new_voter[-1][0]]add(voter_index)

                      71

                      APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                      Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                      for candidate in selfvotes_copy

                      if candidate not in selfelecleading_candidates

                      for voter_index in selfvotes_copy[candidate]

                      for index _candidate in enumerate(reversed(selfelec

                      sorted_voters[voter_index]))

                      if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                      leading_candidates

                      if randomrandom() lt selfelec

                      tactical_vote_percentages[_candidate[selfelec

                      CANDIDATE_INDEX]]

                      selfrankings_changed[voter_index] = copy

                      deepcopy(selfelecsorted_voters[voter_index])

                      selfrankings_changed[voter_index][-(index + 1)]

                      selfrankings_changed[voter_index][-1] = self

                      rankings_changed[voter_index][-1] self

                      rankings_changed[voter_index][-(index + 1)]

                      selfcandidates[candidate] -= 1

                      selfcandidates[_candidate[selfelec

                      CANDIDATE_INDEX]] += 1

                      selfvotes[candidate]remove(voter_index)

                      selfvotes[_candidate[selfelecCANDIDATE_INDEX

                      ]]add(voter_index)

                      break

                      break

                      72

                      APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                      Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                      half_vacancies = mathfloor(selfelecN_VACANCIES2)

                      for candidate in selfelecleading_candidates

                      if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                      continue

                      for voter_index in selfvotes_copy[candidate]

                      if voter_index in selfrankings_changed

                      ranking = selfrankings_changed[voter_index]

                      else

                      ranking = copydeepcopy(selfelecsorted_voters[voter_index

                      ])

                      for index _candidate in enumerate(reversed(ranking))

                      if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                      leading_candidates or (_candidate[selfelec

                      CANDIDATE_INDEX] in selfelecleading_candidates and

                      selfelecleading_candidatesindex(_candidate[selfelec

                      CANDIDATE_INDEX]) gt= half_vacancies)

                      if _candidate[selfelecCANDIDATE_RANK] gt= 0

                      if randomrandom() lt selfelec

                      minority_vote_percentages[_candidate[selfelec

                      CANDIDATE_INDEX]]

                      selfcandidates[candidate] -= 1

                      selfcandidates[_candidate[selfelec

                      CANDIDATE_INDEX]] += 1

                      break

                      break

                      break

                      73

                      APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                      Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                      self_account_for_coalitions()

                      for candidate in selfvotes

                      if candidate = selfwinner and candidate = selfsecond_place

                      for voter_index in selfvotes[candidate]

                      if voter_index in selfrankings_changed

                      ranking = selfrankings_changed[voter_index]

                      else

                      ranking = copydeepcopy(selfelecsorted_voters[

                      voter_index])

                      for index2 candidate in enumerate(reversed(ranking))

                      if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                      selfcandidates[selfwinner] += 1

                      selfvotes[selfwinner]add(voter_index)

                      break

                      elif candidate[selfelecCANDIDATE_INDEX] == self

                      second_place

                      selfcandidates[selfsecond_place] += 1

                      selfvotes[selfsecond_place]add(voter_index)

                      break

                      selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                      winners = []

                      vacancies = selfelecN_VACANCIES

                      for candidate in reversed(selfsorted_candidates)

                      if vacancies == 0

                      break

                      winnersappend(candidate[0])

                      vacancies -= 1

                      mean chose_best = selfelecget_mean(winners = winners)

                      74

                      APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                      Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                      for voter_index voter in enumerate(selfelecsorted_voters)

                      voter_dict = dict()

                      og_voter_dict = dict()

                      for tup in voter

                      voter_dict[tup[0]] = tup[1]

                      og_voter_dict[tup[0]] = tup[1]

                      for coalition in selfeleccoalitions

                      for candidate in coalition

                      add_to_score = 0

                      for candidate2 in coalition

                      if candidate == candidate2

                      continue

                      half = og_voter_dict[candidate2[rsquovaluersquo]]2

                      if half lt 0

                      add_to_score += mathceil(half)

                      else

                      add_to_score += mathfloor(half)

                      if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                      voter_dict[candidate[rsquovaluersquo]] = 10

                      elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                      voter_dict[candidate[rsquovaluersquo]] = -10

                      else

                      voter_dict[candidate[rsquovaluersquo]] += add_to_score

                      selfrankings_changed[voter_index] = []

                      for candidate in voter_dict

                      selfrankings_changed[voter_index]append((candidate voter_dict[

                      candidate]))

                      selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                      voter_index] key=lambda x x[1])

                      75

                      APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                      Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                      selfelecroundsappend(selfsorted_candidates[_round])

                      if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                      N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                      N_VACANCIES - 1)

                      return 2

                      elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                      N_VOTERS gt 05)

                      return 1

                      else

                      selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                      CANDIDATE_INDEX])

                      for voter_index in selfvotes[selfsorted_candidates[_round][self

                      elecCANDIDATE_INDEX]]

                      if voter_index in selfrankings_changed

                      for candidate in reversed(selfrankings_changed[voter_index

                      ])

                      if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                      excluded

                      selfcandidates[candidate[selfelecCANDIDATE_INDEX

                      ]] += 1

                      selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                      add(voter_index)

                      break

                      else

                      continue

                      else

                      for candidate in reversed(selfelecsorted_voters[

                      voter_index])

                      if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                      excluded

                      selfcandidates[candidate[selfelecCANDIDATE_INDEX

                      ]] += 1

                      selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                      add(voter_index)

                      break

                      else

                      continue

                      selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                      return 0

                      76

                      APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                      Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                      for index in range(selfelecN_CANDIDATES)

                      selfcandidates[index] = 0

                      for voter in selfelecsorted_voters

                      for candidate in reversed(voter)

                      if candidate[selfelecCANDIDATE_SCORE] gt 0

                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                      else

                      break

                      APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                      Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                      for index in range(selfelecN_CANDIDATES)

                      selfcandidates[index] = 0

                      for voter in selfelecsorted_voters

                      if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                      elecCANDIDATE_INDEX]]

                      selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                      else

                      for candidate in reversed(voter)

                      if candidate[selfelecCANDIDATE_SCORE] gt 0

                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                      else

                      break

                      77

                      APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                      Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                      pos = set()

                      for index perc in enumerate(selfelectactical_vote_percentages)

                      if perc gt 0

                      posadd(index)

                      for candidate in selfeleccandidates

                      if candidate not in selfleading_candidates

                      for voter_index in selfvotes[candidate]

                      raised = None

                      for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                      ])

                      if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                      leading_candidates

                      if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                      if randomrandom() lt selfelectactical_vote_percentages[

                      candidate_tuple[selfelecCANDIDATE_INDEX]]

                      ranking = [None]selfelecN_CANDIDATES

                      ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                      selfelecvoters[voter_index][candidate_tuple[selfelec

                      CANDIDATE_INDEX]])

                      raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                      break

                      break

                      break

                      if raised = None

                      for _candidate in selfleading_candidates

                      if _candidate = ranking[-1][0]

                      ranking[0] = (_candidate selfelecvoters[voter_index][

                      _candidate])

                      buried = _candidate

                      break

                      i = 1

                      for candidate_tuple in selfelecsorted_voters[voter_index]

                      if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                      buried]

                      continue

                      else

                      ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                      selfelecvoters[voter_index][candidate_tuple[selfelec

                      CANDIDATE_INDEX]])

                      i += 1

                      selfrankings_changed[voter_index] = ranking

                      78

                      APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                      Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                      for voter_index in selfvotes[candidate]

                      if randomrandom() lt selfelectactical_vote_percentages[candidate

                      ]

                      for _candidate in selfleading_candidates

                      if _candidate = candidate

                      ranking = [None]selfelecN_CANDIDATES

                      ranking[0] = (_candidate selfelecvoters[voter_index][

                      _candidate])

                      buried = _candidate

                      break

                      i = 1

                      for candidate_tuple in selfelecsorted_voters[voter_index]

                      if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                      continue

                      else

                      ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                      selfelecvoters[voter_index][candidate_tuple[selfelec

                      CANDIDATE_INDEX]])

                      i += 1

                      selfrankings_changed[voter_index] = ranking

                      79

                      APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                      Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                      for index in range(selfelecN_CANDIDATES)

                      selfcandidates[index] = 0

                      for voter_index voter in enumerate(selfelecsorted_voters)

                      score = 0

                      if voter_index in selfrankings_changed

                      for candidate in selfrankings_changed[voter_index]

                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                      score += 1

                      else

                      for candidate in voter

                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                      score += 1

                      APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                      Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                      for voter_index voter in enumerate(selfelecsorted_voters)

                      if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                      elecCANDIDATE_INDEX]]

                      selfrankings_changed[voter_index] = copydeepcopy(selfelec

                      sorted_voters[voter_index])

                      for candidate_index candidate in enumerate(reversed(voter))

                      if candidate_index == 0

                      selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                      voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                      else

                      selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                      voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                      80

                      APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                      Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                      for index in range(selfelecN_CANDIDATES)

                      selfcandidates[index] = 0

                      for voter_index voter in enumerate(selfelecsorted_voters)

                      if voter_index in selfrankings_changed

                      for candidate in selfrankings_changed[voter_index]

                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                      selfelecCANDIDATE_RANK]

                      else

                      for candidate in voter

                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                      selfelecCANDIDATE_RANK]

                      APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                      Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                      for index in range(selfelecN_CANDIDATES)

                      selfcandidates[index] = 0

                      for voter in selfelecsorted_voters

                      votes = selfelecN_VACANCIES

                      for candidate in reversed(voter)

                      if votes == 0

                      break

                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                      votes -= 1

                      • Folha de aprovaccedilatildeo
                      • Agradecimentos
                      • Epiacutegrafe
                      • Resumo
                      • Abstract
                      • Lista de ilustraccedilotildees
                      • Lista de Coacutedigos
                      • Lista de tabelas
                      • Lista de abreviaturas e siglas
                      • Sumaacuterio
                      • INTRODUCcedilAtildeO
                        • MOTIVACcedilAtildeO E OBJETIVO
                        • MEacuteTODO
                        • ESTRUTURA
                          • SISTEMAS ELEITORAIS
                            • FISRT PAST THE POST
                              • Exemplo
                              • Vantagens e Desvantagens do FPTP
                              • Voto Uacutetil no FPTP
                                • TWO-ROUND SYSTEM
                                  • Exemplo
                                  • Vantagens e Desvantagens do TRS
                                  • Voto Uacutetil no TRS
                                    • INSTANT-RUNOFF VOTING
                                      • Exemplo
                                      • Vantagens e Desvantagens do IRV
                                      • Voto Uacutetil no IRV
                                        • APPROVAL VOTING SYSTEM
                                          • Exemplo
                                          • Vantagens e Desvantagens do AVS
                                          • Voto Uacutetil no AVS
                                            • THE BORDA COUNT
                                              • Exemplo
                                              • Vantagens e Desvantagens do BC
                                              • Voto Uacutetil no BC
                                                • SCORE VOTING SYSTEM
                                                  • Exemplo
                                                  • Vantagens e Desvantagens do SVS
                                                  • Voto Uacutetil no SVS
                                                    • BLOC VOTE
                                                      • Exemplo
                                                      • Voto Uacutetil no BV
                                                          • O SIMULADOR
                                                          • CENAacuteRIOS PERTINENTES
                                                            • CENAacuteRIO 1 VOTO TAacuteTICO
                                                            • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                            • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                            • CENAacuteRIO 4 COALIZOtildeES
                                                            • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                            • CENAacuteRIO 6 VOTO DE MINORIA
                                                              • COMO FUNCIONA O SIMULADOR
                                                                • CLASSE Elections
                                                                • CLASSE FirstPastThePost
                                                                • CLASSE TwoRoundSystem
                                                                • CLASSE InstantRunoffVoting
                                                                • CLASSE ApprovalVoting
                                                                • CLASSE BordaCount
                                                                • CLASSE ScoreVoting
                                                                • CLASSE BlocVote
                                                                • TECNOLOGIAS UTILIZADAS
                                                                  • CONCLUSAtildeO
                                                                  • Referecircncias
                                                                  • Meacutetodo create_voters
                                                                  • Meacutetodo create_candidates
                                                                  • Meacutetodo calculate_means
                                                                  • Meacutetodo get_mean
                                                                  • Meacutetodo calculate_mean
                                                                  • Meacutetodo set_leading_candidates
                                                                  • Meacutetodo irv_set_leading_candidates
                                                                  • Meacutetodo sort_ranks
                                                                  • Meacutetodo fptp_count_tactical_votes
                                                                  • Meacutetodo fptp_count_minority_votes
                                                                  • Meacutetodo trs_second_round
                                                                  • Meacutetodo trs_account_for_coalitions
                                                                  • Meacutetodo irv_count_votes
                                                                  • Meacutetodo avs_count_votes
                                                                  • Meacutetodo avs_count_votes_with_tactical
                                                                  • Meacutetodo irv_apply_tactical_votes
                                                                  • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                  • Meacutetodo bc_sum_candidates_scores
                                                                  • Meacutetodo svs_apply_tactical_votes
                                                                  • Meacutetodo svs_sum_candidates_scores
                                                                  • Meacutetodo bv_count_votes

                        SUMAacuteRIO

                        1 INTRODUCcedilAtildeO 1511 MOTIVACcedilAtildeO E OBJETIVO 1512 MEacuteTODO 1513 ESTRUTURA 15

                        2 SISTEMAS ELEITORAIS 1721 FISRT PAST THE POST 17211 Exemplo 18212 Vantagens e Desvantagens do FPTP 18213 Voto Uacutetil no FPTP 1922 TWO-ROUND SYSTEM 19221 Exemplo 20222 Vantagens e Desvantagens do TRS 20223 Voto Uacutetil no TRS 2123 INSTANT-RUNOFF VOTING 21231 Exemplo 22232 Vantagens e Desvantagens do IRV 22233 Voto Uacutetil no IRV 2324 APPROVAL VOTING SYSTEM 24241 Exemplo 24242 Vantagens e Desvantagens do AVS 24243 Voto Uacutetil no AVS 2525 THE BORDA COUNT 25251 Exemplo 25252 Vantagens e Desvantagens do BC 26253 Voto Uacutetil no BC 2626 SCORE VOTING SYSTEM 26261 Exemplo 27262 Vantagens e Desvantagens do SVS 27263 Voto Uacutetil no SVS 2727 BLOC VOTE 28271 Exemplo 28272 Voto Uacutetil no BV 29

                        3 O SIMULADOR 30

                        4 CENAacuteRIOS PERTINENTES 3441 CENAacuteRIO 1 VOTO TAacuteTICO 3442 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV 4143 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE 4344 CENAacuteRIO 4 COALIZOtildeES 4545 CENAacuteRIO 5 DILEMA DO PRISIONEIRO 4746 CENAacuteRIO 6 VOTO DE MINORIA 50

                        5 COMO FUNCIONA O SIMULADOR 5351 CLASSE Elections 5352 CLASSE FirstPastThePost 6053 CLASSE TwoRoundSystem 6254 CLASSE InstantRunoffVoting 6255 CLASSE ApprovalVoting 6356 CLASSE BordaCount 6357 CLASSE ScoreVoting 6358 CLASSE BlocVote 6459 TECNOLOGIAS UTILIZADAS 64

                        6 CONCLUSAtildeO 65

                        REFEREcircNCIAS 66

                        APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS 67

                        APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES 68

                        APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS 68

                        APEcircNDICE D ndash MEacuteTODO GET_MEAN 68

                        APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN 69

                        APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES 69

                        APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES 69

                        APEcircNDICE H ndash MEacuteTODO SORT_RANKS 70

                        APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES 71

                        APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES 72

                        APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND 73

                        APEcircNDICE L ndash MEacuteTODOTRS_ACCOUNT_FOR_COALITIONS 74

                        APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES 75

                        APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES 76

                        APEcircNDICE O ndash MEacuteTODOAVS_COUNT_VOTES_WITH_TACTICAL 76

                        APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES 77

                        APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES (CON-TINUACcedilAtildeO) 78

                        APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES 79

                        APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES 79

                        APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES 80

                        APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES 80

                        15

                        1 INTRODUCcedilAtildeO

                        Em toda eleiccedilatildeo existe pelo menos um grupo de indiviacuteduos que sai completamentedesfavorecido e insatisfeito com o resultado O contentamento completo de uma populaccedilatildeoeacute certamente improvaacutevel e muitas vezes impossiacutevel considerando a gama de candidatosque se dispotildee a concorrer Em todo caso o miacutenimo que pode ser feito eacute escolher demaneira eficiente o melhor candidato ao cargo dentre as opccedilotildees disponiacuteveis Diante dissoeacute necessaacuterio avaliar como essa escolha eacute feita e quais meacutetodos satildeo capazes de tornaacute-larealidade

                        11 MOTIVACcedilAtildeO E OBJETIVO

                        Em conformidade com o extenso nuacutemero de sistemas eleitorais pelo mundo este tra-balho tem como objetivo testar uma porccedilatildeo desses sistemas sob a simulaccedilatildeo de diferentescenaacuterios especiacuteficos a fim de determinar quais deles podem ser considerados como os maisjustos perante a taxa de satisfaccedilatildeo meacutedia da populaccedilatildeo

                        12 MEacuteTODO

                        Para que essa anaacutelise seja possiacutevel foi desenvolvido um programa que permite a criaccedilatildeoe configuraccedilatildeo de diferentes cenaacuterios onde os sistemas eleitorais seratildeo simulados Nele eacutepossiacutevel definir o nuacutemero total de eleitores e candidatos como esses eleitores iratildeo votar eo niacutevel de popularidade de cada candidato Aleacutem disso eacute possiacutevel formar coalizotildees entreos candidatos e escolher a porcentagem dos eleitores que optaratildeo pelo voto uacutetil Dessamaneira seraacute possiacutevel elaborar cenaacuterios que buscam expor os pontos fortes e fracos decada sistema

                        13 ESTRUTURA

                        Este trabalho eacute relatado ao longo de seis capiacutetulos No Capiacutetulo 2 seratildeo apresentados ossistemas eleitorais implementados no simulador suas vantagens e desvantagens conhecidase outras caracteriacutesticas especiacuteficas de cada um A intenccedilatildeo do capiacutetulo eacute tornar o textomais autocontido trazendo conceitos jaacute estudados que ajudaratildeo na melhor compreensatildeodos capiacutetulos seguintes por isso grande parte de sua composiccedilatildeo eacute oriunda de diferentesfontes consultadas

                        O Capiacutetulo 3 eacute uma apresentaccedilatildeo das funcionalidades que o simulador possui Seratildeoexplicados todos os campos de entrada e os dois modos distintos nos quais o programaopera

                        16

                        No Capiacutetulo 4 os sistemas seratildeo colocados em teste Todos seratildeo simulados em cenaacuteriosespeciacuteficos a fim de fazer sobressair aqueles com as maiores taxas de satisfaccedilatildeo meacutedia

                        A estrutura e implementaccedilatildeo do simulador seratildeo abordadas em detalhes no Capiacutetulo5 assim como uma breve descriccedilatildeo da stack utilizada Todos os meacutetodos relevantes aofuncionamento das simulaccedilotildees seratildeo explicados passo a passo

                        No Capiacutetulo 6 seratildeo apresentadas as conclusotildees referentes agrave anaacutelise dos resultadosobtidos no Capiacutetulo 4 e as consideraccedilotildees finais do projeto como um todo

                        17

                        2 SISTEMAS ELEITORAIS

                        Atualmente mais e mais paiacuteses estatildeo adotando sistemas democraacuteticos de governoCerca de 6 em 10 governos no mundo satildeo democracias (Pew Research Center 2017) o quepode ser observado na Figura 1 abaixo Em um sistema democraacutetico a populaccedilatildeo escolheseus liacutederes atraveacutes de seu sistema eleitoral Existem diversos sistemas eleitorais em usono mundo muitos dos quais satildeo usados em conjunto para eleger um uacutenico candidato Emvaacuterios paiacuteses mais de um sistema eleitoral pode ser utilizado tambeacutem em diferentes niacuteveisde governo tanto presidencial quanto estadual ou municipal Natildeo apenas imersos nomeio poliacutetico eles tambeacutem podem ser usados em escopos menores como em esportes oucompeticcedilotildees artiacutesticas poreacutem sempre com a finalidade de alocar um ou mais indiviacuteduosa determinado cargo ou tiacutetulo

                        Figura 1 ndash de paiacuteses de cada tipo de regime 1946-2016

                        Fonte Center of Systemic Peacersquos Polity IV Project

                        Os proacuteximos trecircs toacutepicos discutidos neste capiacutetulo referentes aos meacutetodos First Pastthe Post Two-Round System e Instant Runoff Voting possuem seus conceitos e infor-maccedilotildees relevantes com exceccedilatildeo dos exemplos traduzidos livremente do livro Behind theBallot Box A Citizenrsquos Guide to Voting Systems (AMY 2000)

                        21 FISRT PAST THE POST

                        O meacutetodo First Past the Post tambeacutem conhecido como Plurality Voting ou WinnerTakes All eacute o meacutetodo mais simples e direto e provavelmente o primeiro meacutetodo que sepensa quando se fala de eleiccedilotildees Os eleitores escolhem apenas um candidato e apoacutes a

                        18

                        contagem dos votos o candidato com o maior nuacutemero de votos eacute eleito O vencedor natildeonecessita da aprovaccedilatildeo de mais de 50 dos eleitores ele apenas precisa de uma pluralidadedos votos ou seja apenas possuir mais votos que os outros candidatos

                        Esse sistema eacute utilizado em escala nos Estados Unidos para a maior parte das eleiccedilotildeesvoltadas a eleger apenas um candidato como prefeitos e governadores aleacutem de ser usadana disputa presidencial Dentre outros paiacuteses que empregam o sistema em suas corridaspresidenciais estatildeo listados o Meacutexico as Filipinas a Coreia do Sul e a Venezuela

                        211 Exemplo

                        Tabela 1 ndash Exemplo FPTP

                        Candidatos VotosA 36B 25C 22D 17

                        Neste exemplo o candidato A possui uma pluralidade dos votos com 36 e ele eacute ocandidato eleito mesmo natildeo tendo uma maioria

                        212 Vantagens e Desvantagens do FPTP

                        A vantagem do FPTP eacute a sua simplicidade Natildeo eacute difiacutecil para um eleitor comumcompreender o seu funcionamento eles apenas precisam se decidir por um candidato Eletambeacutem eacute muito simples e direto na sua contagem e seleccedilatildeo do vencedor

                        Esse meacutetodo tambeacutem tende a criar listas de candidatos concorrentes mais curtasCandidatos independentes ou de partidos menores frequentemente acabam se sentindodesencorajados a concorrer devido agraves suas baixas chances de vitoacuteria Isso normalmentefornece aos eleitores uma faacutecil decisatildeo entre um ou dois candidatos dos maiores partidosao mesmo tempo poreacutem limitando suas opccedilotildees

                        No entanto sua essecircncia eacute sua principal desvantagem a pluralidade O fato do can-didato eleito natildeo necessitar de uma maioridade dos votos da populaccedilatildeo parece violaros princiacutepios baacutesicos da democracia Democracia eacute em sua origem o poder(kratos) nopovo(demos) poreacutem na pluralidade o poder de eleger um candidato pode residir emapenas uma fraccedilatildeo relativamente pequena do povo Em um cenaacuterio hipoteacutetico comapenas trecircs candidatos um deles apenas poderia necessitar de natildeo mais do que 34 dosvotos para ser eleito o que significa que no pior dos casos 66 da populaccedilatildeo rejeitao candidato eleito O cenaacuterio soacute piora com mais e mais candidatos concorrendo Paraquatro candidatos satildeo necessaacuterios 26 dos votos no pior dos casos para cinco satildeo 21 eassim por diante

                        19

                        213 Voto Uacutetil no FPTP

                        No FPTP tambeacutem existe a possibilidade de os eleitores evitarem votar em sua prefe-recircncia verdadeira No caso de sua preferecircncia natildeo aparentar ter boas chances de vitoacuteriamuitas vezes opta-se por uma segunda opccedilatildeo que esteja mais bem colocada nas eleiccedilotildeesO motivo disso eacute que nessas situaccedilotildees votar em sua preferecircncia pode parecer um des-perdiacutecio do seu voto e no pior dos cenaacuterios optar por natildeo transferir seu voto para umasegunda opccedilatildeo pode acabar resultando na eleiccedilatildeo de um candidato de seu desgosto As-sim votar de maneira verdadeira muitas vezes pode acabar prejudicando o eleitor que sevecirc forccedilado a abandonar seus interesses poliacuteticos mais imediatos e escolher o menor entredois(ou mais) males Os candidatos de partidos menores satildeo os que mais sofrem com essetipo de voto estrateacutegico por natildeo conseguirem agregar as maiores quantidades de votos

                        Entretanto ao mesmo tempo que partidos maiores roubam votos de partidos meno-res com os votos taacuteticos partidos menores tambeacutem tem a oportunidade de ganhar algunsvotos com o denominado spoiler effect Ao entrarem na eleiccedilatildeo candidatos de partidosmenores podem adquirir votos de candidatos mais populares que possuem inclinaccedilatildeo po-liacutetica semelhante Logo eacute possiacutevel que haja certo equiliacutebrio ao se contrapor as mudanccedilasde voto devido aos votos uacuteteis agraves mudanccedilas oriundas do spoiler effect

                        Poreacutem o spoiler effect natildeo necessariamente ocorre apenas entre partidos maiores emenores mas pode prejudicar candidatos de popularidades proacuteximas Por exemplo entretrecircs candidatos A B e C onde A representa determinada posiccedilatildeo no espectro poliacuteticoenquanto B e C possuem posiccedilotildees parecidas o que pode acontecer eacute B e C se prejudicaremmutuamente jaacute que ambos dividem os eleitores de um mesmo espectro poliacutetico Se esseespectro tem a maioria com 60 por exemplo com B e C compartilhando cada um 30dos votos o candidato A sairia vencedor com 40 mesmo que todos os eleitores de Bprefiram C e todos os eleitores de C prefiram B Esse exemplo demonstra claramente oproblema com os sistemas de pluralidade

                        22 TWO-ROUND SYSTEM

                        Uma das primeiras tentativas de lidar com a desvantagem dos sistemas por pluralidadeo Two-round System eacute usado desde o seacuteculo XIX no ocidente e atualmente ainda eacute utilizadoem corridas presidecircncias de paiacuteses como o Brasil Bulgaacuteria Chile Colocircmbia FinlacircndiaPolocircnia Portugal Ruacutessia e em inuacutemeras eleiccedilotildees locais nos Estados Unidos

                        O principal objetivo do TRS eacute garantir que o vencedor tenha conseguido uma maioriados votos Para isso as eleiccedilotildees satildeo estruturadas em duas rodadas de votaccedilatildeo Na primeirarodada os eleitores se dirigem agraves urnas e votam no candidato de sua preferecircncia Apoacutesa contagem se a quantidade de votos do candidato mais votado superar a proporccedilatildeo de50 natildeo haacute a necessidade de uma segunda rodada e este candidato eacute eleito No entantose este natildeo for o caso haveraacute uma segunda rodada com apenas os dois candidatos mais

                        20

                        votados Nesta rodada os eleitores retornam as urnas para escolher uma das duas opccedilotildeessendo eleito o candidato mais votado agora definitivamente com uma maioria dos votos

                        221 Exemplo

                        Utilizando a mesma distribuiccedilatildeo de votos descrita na tabela 1 Neste caso como ocandidato A natildeo possui uma maioria dos votos ele e o candidato B iratildeo concorrer em umsegundo turno Digamos que as distribuiccedilotildees dos votos dos eleitores dos candidatos C eD em relaccedilatildeo aos candidatos A e B satildeo as seguintes

                        Tabela 2 ndash 2deg turno do TRS

                        Candidatos Votos dos eleitoresde C

                        Votos dos eleitoresde D

                        Votos do 1degturno

                        A 7 5 36B 15 12 25

                        O candidato B agora eacute eleito com uma maioria dos votos 52 contra 48 do candidatoA

                        222 Vantagens e Desvantagens do TRS

                        Por ser parecido com o FPTP esse sistema tambeacutem eacute de faacutecil compreensatildeo do eleitorcomum poreacutem a maior vantagem do TRS eacute a garantia de que o candidato vencedor teraacute oapoio da maioria dos eleitores no segundo turno eliminando a pluralidade Argumenta-seque isso daacute maior legitimidade poliacutetica ao mandato do candidato eleito

                        O TRS tende a abrigar uma lista maior de candidatos sendo mais convidativo acandidatos de partidos menores mesmo que suas chances natildeo sejam maiores quandocomparadas agraves eleiccedilotildees sob o FPTP Mesmo assim essa listagem mais abrangente eacute umavantagem do sistema pois daacute aos eleitores uma variedade maior de opccedilotildees de voto

                        Em relaccedilatildeo agraves suas desvantagens o TRS possui duas principais A primeira satildeo oscustos elevados do sistema decorrentes da necessidade da organizaccedilatildeo de um segundoturno de votaccedilotildees A segunda eacute o aumento no iacutendice de ausecircncias dos eleitores agraves urnasEssa ampliaccedilatildeo no natildeo comparecimento dos eleitores se daacute tambeacutem devido ao segundoturno por pura fatiga eleitoral bem como consequecircncia da desistecircncia de eleitores queapoiam candidatos que jaacute foram eliminados

                        Outro ponto negativo do TRS eacute a sua natildeo-monotonicidade Isso significa que umcandidato pode ser prejudicado com um aumento em sua popularidade e suporte e domesmo modo um candidato pode se beneficiar com a perda de popularidade e suporteSe os candidatos A e B satildeo os esperados para ir ao segundo turno onde A eacute mais fortedo que B um aumento no suporte pelo candidato A pode resultar na sua derrota quandoesse aumento causa uma alteraccedilatildeo nos candidatos que satildeo selecionados para ir ao segundoturno Se esse aumento na popularidade de A resultar na eliminaccedilatildeo preacutevia de B um

                        21

                        terceiro candidato C pode ser vitorioso sobre A no segundo turno caso os eleitores de Bprefiram C ao candidato A Se natildeo houvesse esse crescimento de popularidade A teriaderrotado B no segundo turno Essa situaccedilatildeo seraacute vista em melhores detalhes na seccedilatildeo 43

                        223 Voto Uacutetil no TRS

                        Esse sistema minimiza os efeitos do voto uacutetil em relaccedilatildeo ao FPTP pois um eleitorqualquer pode tranquilamente votar em sua preferecircncia sem se preocupar em desperdiccedilaacute-lo mesmo que seu candidato natildeo tenha chances de vitoacuteria Se este natildeo for eleito aindapoderaacute escolher a sua preferecircncia dentre os dois candidatos que prosseguirem para osegundo turno

                        Apesar disso ainda existe um cenaacuterio em que o eleitor pode ser tentado a natildeo votar emsua preferecircncia Eacute possiacutevel que ele opte pela sua segunda opccedilatildeo se souber que sua primeiraopccedilatildeo possui miacutenimas chances de ir ao segundo turno ou ateacute mesmo por saber que issodiminuiraacute as chances de algum outro candidato ser eleito Mesmo assim eacute evidente queo TRS natildeo proporciona o mesmo apelo ao voto taacutetico que o FPTP

                        Outra caracteriacutestica do TRS eacute o incentivo a formaccedilatildeo de coalizotildees entre candidatosde partidos mais populares com candidatos de partidos menos populares As coalizotildeesfornecem benefiacutecios agrave ambas as partes onde os candidatos classificados para o segundoturno em geral se juntam a candidatos jaacute eliminados com a intenccedilatildeo de agregar maisvotos enquanto os candidatos jaacute eliminados apoiam um dos dois classificados na esperanccedilade inserir propostas proacuteprias ou modificaccedilotildees agrave chapa deles

                        23 INSTANT-RUNOFF VOTING

                        Instant Runoff Voting foi uma alternativa aos meacutetodos FPTP e TRS desenvolvidanos anos 70 por um professor do Instituto de Tecnologia de Massachusetts(MIT) O IRVelimina as principais desvantagens desses outros dois sistemas a pluralidade do FPTP e anecessidade de mais de uma rodada de votaccedilatildeo do TRS Este meacutetodo tambeacutem opera emmais de uma rodada poreacutem como o proacuteprio nome sugere essas rodadas satildeo instantacircneasnatildeo sendo necessaacuterio o retorno dos eleitores agraves urnas Atualmente ele eacute utilizado naIrlanda nas eleiccedilotildees presidenciais em Londres na eleiccedilatildeo de seu prefeito e em distritosindividuais na Austraacutelia para eleger membros de sua cacircmara baixa do parlamento OIRV tambeacutem eacute usado por vaacuterias organizaccedilotildees privadas nos Estados Unidos incluindoa American Political Science Association e a American Psychological Association paraeleger seus funcionaacuterios

                        Nesse sistema os eleitores natildeo satildeo solicitados a votar em um uacutenico candidato aoinveacutes disso eles listam todos os candidatos concorrentes na ordem de sua preferecircnciaA partir dessas listas as primeiras opccedilotildees de cada eleitor recebem o seu voto e apoacutes acontagem se um candidato obtiver 50 dos votos mais um este candidato eacute eleito Se

                        22

                        isso natildeo ocorrer o candidato menos votado eacute eliminado das eleiccedilotildees e seus votos satildeotransferidos para a segunda opccedilatildeo de cada um de seus eleitores Esse procedimento serepete eliminando o candidato menos votado a cada rodada ateacute que algum dos candidatospossuam a maioridade dos votos

                        231 Exemplo

                        Na tabela 3 pode-se verificar a distribuiccedilatildeo de votos por perfil de eleitor e na tabela4 vecirc-se o desenvolvimento do IRV para essas distribuiccedilotildees O candidato D eacute o menosvotado e por consequecircncia eacute o primeiro a ser eliminado A segunda opccedilatildeo de todos oseleitores que votaram no candidato D eacute o candidato C por isso este recebe todos os votosdistribuiacutedos na segunda rodada Com isso o candidato B eacute eliminado com 25 dos votos eos candidatos A e C concorrem na uacuteltima rodada Mesmo com o candidato C na lideranccedilana segunda rodada a maior parte dos eleitores do B tem como preferecircncia o candidatoA por isso A eacute eleito com 55 dos votos contra 45 do C

                        Tabela 3 ndash Exemplo IRV

                        Rankings Ndeg de eleitoresABCD 20ABDC 16BDAC 19BDCA 6CABD 7CDBA 15DCAB 5DCBA 12

                        Tabela 4 ndash Desenvolvimento do IRVTurnos D C B A

                        1 17 22 25 362 eliminado 39 25 363 eliminado 45 eliminado 55

                        232 Vantagens e Desvantagens do IRV

                        Assim como no TRS a pluralidade eacute irrelevante no IRV e um candidato soacute eacute eleitocom a maioridade dos votos dando maior legitimidade ao mandato deste No entantopode-se argumentar que o IRV faz isso com mais eficiecircncia pois natildeo requer a execuccedilatildeode mais de uma rodada de votaccedilotildees Isso diminui os custos das eleiccedilotildees como um todoao mesmo tempo que proporciona um nuacutemero menor de isenccedilotildees por parte dos eleitoresdevido ao desgaste de todo o processo eleitoral

                        23

                        Aleacutem disso candidatos de partidos menores tendem a receber mais votos do queno FPTP e portanto satildeo mais encorajados a se candidatar Com uma lista maior decandidatos eleitores desfrutam de uma variedade maior de opccedilotildees de voto Contudomesmo com mais candidatos menos populares o spoiler effect mencionado anteriormentetambeacutem natildeo possui espaccedilo nesse sistema de votaccedilatildeo Partidos menores natildeo tem comoroubar votos de partidos maiores visto que esses votos eventualmente seratildeo transferidosde volta a eles durante o desenvolvimento das rodadas do IRV

                        Em virtude de sua estrutura acredita-se que esse meacutetodo tende a encorajar os can-didatos tambeacutem a elaborar suas campanhas de forma mais abrangente ampliando suainfluecircncia para mais do que apenas um grupo especiacutefico de maneira que ele consiga agre-gar votos de segunda ou terceira opccedilatildeo aleacutem dos votos de seus eleitores principais

                        A principal desvantagem do IRV eacute o fato de ele ainda natildeo ser amplamente utilizado aoredor do mundo Essa falta de familiaridade do sistema pode causar confusatildeo ao eleitorcomum em suas primeiras ocorrecircncias No entanto nos paiacuteses em que este eacute utilizadonatildeo parece haver confusatildeo entre os eleitores Aleacutem disso na maioria dos casos haveraacute umcusto potencialmente alto da substituiccedilatildeo ou alteraccedilatildeo dos sistemas das urnas eletrocircnicaspara que seja possiacutevel haver a implementaccedilatildeo do meacutetodo

                        Aleacutem disso assim como o TRS este sistema tambeacutem possui natildeo-monotonicidade ouseja um candidato pode ser prejudicado ao ser ranqueado mais alto enquanto que outropode se beneficiar sendo ranqueado mais baixo pelos eleitores (ORNSTEIN 2018) issopode ocorrer quando esse ranqueamento causa alteraccedilotildees na ordem em que os candidatossatildeo eliminados Essa caracteriacutestica se manifesta em fenocircmenos complexos e especiacuteficos epor isso um exemplo de sua ocorrecircncia seraacute abordada em detalhes na seccedilatildeo 43

                        233 Voto Uacutetil no IRV

                        Como os sistemas de votaccedilatildeo anteriores o IRV natildeo eacute completamente imune ao vototaacutetico No entanto este meacutetodo se mostra bem resistente a eles quando comparado aoutros meacutetodos como o FPTP e o Borda Count (Bartholdi John J III and Orlin JamesB 1990) Distintivamente o IRV requer um maior esforccedilo do eleitor para elaborar umaestrateacutegia que melhor ajuste os resultados da eleiccedilatildeo de acordo com a sua preferecircnciaAleacutem disso eacute necessaacuterio que ele tenha informaccedilatildeo suficiente sobre os rankings de outroseleitores naturalmente obtida atraveacutes de pesquisas eleitorais

                        Existe tambeacutem a possibilidade de ocorrer uma exaustatildeo dos votos quando natildeo haacuteo completo preenchimento do ranking por parte dos eleitores Nessas ocasiotildees o votonatildeo pode continuar a ser transferido a outros candidatos e ele eacute descartado Isso afetaa legitimidade do mandato do candidato eleito pois o resultado final natildeo representaraacute100 da populaccedilatildeo votante Essas ocorrecircncias no entanto podem ser minimizadas comuma melhor educaccedilatildeo eleitoral ou como foi implementado na Austraacutelia requerer que osrankings incluam uma totalidade dos candidatos concorrentes

                        24

                        24 APPROVAL VOTING SYSTEM

                        No meacutetodo Approval Voting os eleitores natildeo satildeo limitados pelo nuacutemero de candidatosem que podem votar por isso approval cada eleitor pode votar em todos os candidatos osquais ele aprova Apoacutes as votaccedilotildees o candidato com a maior quantidade de votos eacute eleitoSegundo Hamlin (2015) a cidade de Fargo na Dakota do Norte se tornou a primeiracidade nos EUA a colocar em praacutetica este sistema em suas eleiccedilotildees gerais em novembrode 2018 AVS tambeacutem eacute utilizado para eleger o secretaacuterio-geral das Naccedilotildees Unidas e emdiversas outras organizaccedilotildees

                        241 Exemplo

                        Na tabela 5 abaixo pode-se encontrar 8 perfis de eleitores com seus candidatos apro-vados e quantidade de eleitores que se encaixam no perfil Na tabela 6 temos o resultadoda contabilizaccedilatildeo dos votos destes perfis O candidato mais popular eacute o B que se encontraaprovado em 5 perfis distintos totalizando 60 votos ou aproximadamente 32

                        Tabela 5 ndash Exemplo AVS

                        Aprovaccedilotildees Ndeg de eleitoresA 20AB 16B 19

                        BDC 6CAB 7CD 15DC 5DCB 12

                        Tabela 6 ndash Resultado AVSCandidatos Total de votos

                        A 43B 60C 45D 38

                        242 Vantagens e Desvantagens do AVS

                        Aleacutem de simples este meacutetodo permite um niacutevel maior de expressividade aos eleitoresOnde no FPTP e TRS eles satildeo limitados pelo seu uacutenico voto aqui os eleitores tecircm aliberdade de demonstrar exatamente quais candidatos consideram aptos ou aceitaacuteveis aocargo

                        25

                        Outro efeito dessa liberdade trazida pelo AVS eacute a dizimaccedilatildeo do spoiler effect Can-didatos de partidos menores natildeo tem como roubar votos de partidos maiores nessesistema ambos os candidatos contabilizariam o voto

                        243 Voto Uacutetil no AVS

                        O tipo de voto uacutetil no AVS eacute denominado bullet voting Segundo The Center forElection Science (2015) esta taacutetica envolve simplesmente ignorar a possibilidade de votarem mais de um candidato e votar apenas em sua primeira opccedilatildeo Um eleitor pode serlevado a adotar essa estrateacutegia quando percebe que sua preferecircncia pode ser prejudicadacom o voto em alguma segunda opccedilatildeo sua Em um cenaacuterio extremo onde 100 doseleitores adotam esta estrateacutegia as eleiccedilotildees satildeo convertidas a um simples First Past ThePost

                        25 THE BORDA COUNT

                        Este meacutetodo carrega o nome em homenagem a seu criador Jean-Charles de Bordaque o desenvolveu em 1770 (LIPPMAN 2012) A contagem de Borda utiliza a abordagemde ranqueamento dos candidatos poreacutem de maneira diferente ao IRV Este eacute um sistemaque atribui uma pontuaccedilatildeo aos candidatos com base nestes rankings O candidato na basedo ranking natildeo recebe pontos o candidato imediatamente acima deste recebe 1 pontoo proacuteximo recebe 2 pontos e assim por diante ateacute o topo do ranking As pontuaccedilotildees detodos os rankings satildeo contabilizadas e o candidato com maior pontuaccedilatildeo eacute eleito Deacordo com Lippman variaccedilotildees deste meacutetodo satildeo encontradas em uso na premiaccedilatildeo dediversos esportes como na seleccedilatildeo do MVP(Most Valuable Player) da MLB(principal ligade beisebol dos EUA) e no Trofeacuteu Heisman de futebol americano universitaacuterio

                        251 Exemplo

                        Neste exemplo seratildeo aproveitados os mesmos rankings apresentados na tabela 3 Porserem 4 candidatos o primeiro colocado de cada ranking receberaacute 3 pontos o segundo 2pontos o terceiro 1 e o quarto 0 Assim o nuacutemero maacuteximo de pontos que um candidatopode atingir eacute igual a 300(se ficar na primeira posiccedilatildeo em todos os rankings) e o nuacutemerototal de pontos no sistema eacute 600 O nuacutemero maacuteximo de pontos que um candidato podeatingir eacute calculado com

                        (cminus 1)times e

                        Sendo c igual ao nuacutemero de candidatos e e o nuacutemero de eleitores Por sua vez onuacutemero total de pontos no sistema eacute

                        26

                        (cminus 1)times c2

                        times e

                        A contagem final dos pontos eacute apresentada na tabela 7 abaixo

                        Tabela 7 ndash Resultado BCCandidatos Total de pontos

                        A 146B 181C 126D 147

                        O candidato eleito eacute o B com 181 pontos ou aproximadamente 60 da pontuaccedilatildeomaacutexima

                        252 Vantagens e Desvantagens do BC

                        Em comparaccedilatildeo com os meacutetodos abordados anteriormente que apenas consideramas primeiras opccedilotildees de cada eleitor este meacutetodo regularmente escolhe candidatos comaceitaccedilatildeo mais ampla ao inveacutes de uma preferecircncia direta dos eleitores (Electoral ReformSociety 2017b)

                        Ele tambeacutem encoraja uma abordagem estrateacutegica por parte dos partidos onde seriade seu interesse nomear mais de um candidato para concorrer pois quanto mais candi-datos estatildeo no paacutereo maior eacute a pontuaccedilatildeo dos primeiros colocados Logo a nomeaccedilatildeo decandidatos menos populares pode beneficiar os principais candidatos de um partido

                        253 Voto Uacutetil no BC

                        Existem duas estrateacutegias aplicaacuteveis a esse sistema A primeira denominada compromi-sing de maneira similar a outros meacutetodos de votaccedilatildeo se resume em ranquear em primeirolugar um dos candidatos que estejam liderando as eleiccedilotildees mesmo que este natildeo seja suapreferecircncia real A segunda estrateacutegia burying eacute o oposto esta se baseia em ranquearem uacuteltimo lugar um dos candidatos liacutederes mesmo que este natildeo seja o seu candidato demaior desgosto Ambas estrateacutegias podem ser aplicadas ao mesmo tempo por um eleitor

                        26 SCORE VOTING SYSTEM

                        Score Voting ou Range Voting como tambeacutem eacute conhecido eacute mais um meacutetodo quetenta trazer maior liberdade de expressatildeo aos eleitores Assim como o Borda Counteste sistema funciona baseado na pontuaccedilatildeo dos candidatos no entanto ao inveacutes dessapontuaccedilatildeo ser relativa agrave posiccedilatildeo do candidato no ranking de cada eleitor este por sua veztem completa liberdade de atribuir qualquer quantidade de pontos aos candidatos dentro

                        27

                        de determinada escala Um eleitor pode dar o mesmo nuacutemero de pontos para diferentescandidatos e apoacutes o somatoacuterio de todas as pontuaccedilotildees o candidato com a pontuaccedilatildeo maisalta eacute eleito Incorporado ao escopo poliacutetico o SVS eacute utilizado no Partido Pirata Alematildeobem como em diversas organizaccedilotildees tais como o Fedora Project e Mozilla e tambeacutem emvariados esportes oliacutempicos e reality shows como o American Idol aponta Hamlin (2015)

                        261 Exemplo

                        Neste exemplo temos apresentados na tabela 8 abaixo 4 perfis distintos de eleitorese suas respectivas atribuiccedilotildees de pontos aos 4 candidatos Cada eleitor pode atribuirqualquer pontuaccedilatildeo a um candidato dentro da escala de -10 a 10 O resultado da eleiccedilatildeoapoacutes a soma de todos os pontos por candidato se encontra na tabela 9 onde o candidatoA eacute eleito com um total de 605 pontos

                        Tabela 8 ndash Exemplo SVS

                        Perfil A B C D Ndeg de eleitores1 10 -1 5 2 362 6 9 -3 4 253 2 0 8 4 224 3 3 3 10 17

                        Tabela 9 ndash Resultado SVSCandidatos Total de pontos

                        A 605B 240C 332D 430

                        262 Vantagens e Desvantagens do SVS

                        A grande vantagem do SVS eacute como ele proporciona aos eleitores expressar de maneiramuito proacutexima potencialmente exata suas impressotildees poliacuteticas de cada candidato Eleeacute ainda mais expressivo que o AVS Dessa maneira o spoiler effect tambeacutem se torna nuloao passo que toda intenccedilatildeo de voto eacute precisamente representada neste sistema

                        Assim como outros meacutetodos eleitorais este sofre igualmente dos males produzidos pelovoto taacutetico Sua principal desvantagem eacute discutida na seccedilatildeo abaixo

                        263 Voto Uacutetil no SVS

                        Da mesma maneira que no Approval Voting atraveacutes do bullet voting o SVS tambeacutempode ser convertido em uma eleiccedilatildeo sob o meacutetodo FPTP em um cenaacuterio com um grande

                        28

                        volume de eleitores maliciosos O voto uacutetil sob este sistema se manifesta pontuando-seapenas um candidato com uma nota positiva e todos os outros com as notas mais baixasda escala Se todos os eleitores se aproveitarem dessa abordagem natildeo existiraacute distinccedilatildeoefetiva entre uma eleiccedilatildeo sob SVS e FPTP Essencialmente cada eleitor estaacute votando emapenas um candidato Essa eacute a principal desvantagem do SVS e ela consegue eliminarsua principal vantagem dar ao eleitor um poder maior de expressatildeo

                        27 BLOC VOTE

                        O Bloc Vote eacute um meacutetodo utilizado para a eleiccedilatildeo de candidatos a cargos no governocom mais de uma vacacircncia Pode ser considerado um meio-termo entre o FPTP e oAVS pois os eleitores podem votar em mais de um candidato poreacutem satildeo limitados pelonuacutemero de vagas Em uma eleiccedilatildeo com duas vagas por exemplo cada eleitor selecionaraacutedois candidatos ou menos Sensatamente o candidato mais votado eacute eleito Ele possuialgumas utilizaccedilotildees em eleiccedilotildees locais em algumas partes da Inglaterra (Electoral ReformSociety 2017a)

                        271 Exemplo

                        Neste exemplo dois candidatos seratildeo eleitos logo cada eleitor votaraacute em no maacuteximodois candidatos A distribuiccedilatildeo de votos pode ser conferida na tabela 10 e o resultado dacontagem de votos na tabela 11 abaixo Os candidatos eleitos satildeo o C totalizando 78do maacuteximo de votos possiacuteveis para um candidato e o A com 43

                        Tabela 10 ndash Exemplo BV

                        Aprovaccedilotildees Ndeg de eleitoresAC 20AB 16BC 19BD 6CA 7CD 15DC 17

                        Tabela 11 ndash Resultado BVCandidatos Total de votos

                        A 43B 41C 78D 38

                        29

                        272 Voto Uacutetil no BV

                        Neste sistema eacute possiacutevel que um eleitor evite votar em sua primeira opccedilatildeo quandoeste natildeo tem chances de vitoacuteria e se fazendo isto ele diminuiraacute as chances de algum outrocandidato de seu desgosto ganhar Poreacutem o sistema previne um outro tipo de voto uacutetilEm eleiccedilotildees com mais de uma vaga onde os eleitores soacute podem votar em um candidatose um eleitor sabe que sua primeira opccedilatildeo tambeacutem eacute a primeira opccedilatildeo da maior parteda populaccedilatildeo e portanto muito provavelmente seraacute um dos candidatos eleitos eacute possiacutevelque ele arrisque votar em uma segunda opccedilatildeo sua na esperanccedila de a longo prazo elegersuas duas principais opccedilotildees de voto Com os eleitores podendo votar no nuacutemero exato devagas disponiacuteveis esse tipo de pensamento taacutetico perde o sentido

                        30

                        3 O SIMULADOR

                        Para este trabalho foi implementado um simulador eleitoral na forma de uma aplicaccedilatildeoweb para que a interaccedilatildeo do usuaacuterio fosse facilitada Veremos a seguir como se daacute suautilizaccedilatildeo de forma geral

                        Figura 2 ndash Captura de tela 1

                        Figura 3 ndash Captura de tela 2

                        A primeira opccedilatildeo encontrada pelo usuaacuterio eacute a escolha de quais sistemas de votaccedilatildeo se-ratildeo simulados (Figura 2) Todos eles podem ser selecionados para rodar simultaneamentePoreacutem natildeo eacute permitido rodar uma simulaccedilatildeo do Bloc Vote para uma eleiccedilatildeo onde apenasum candidato eacute eleito aleacutem disso natildeo existe implementaccedilatildeo dos meacutetodos TRS e IRV para

                        31

                        eleiccedilotildees com mais de um candidato eleito jaacute que eles se comportariam exatamente comono FPTP

                        A maioria das linguagens de programaccedilatildeo senatildeo todas possuem um gerador de nuacuteme-ros pseudoaleatoacuterios que fornece a possibilidade de definir uma seed para o gerador Estaseed funciona como um ponto de partida para a geraccedilatildeo dos nuacutemero e portanto todasimulaccedilatildeo que rodar com a mesma seed sempre teraacute os mesmos resultados Se nenhumvalor for fornecido pelo usuaacuterio o tempo atual do sistema eacute utilizado As opccedilotildees subse-quentes satildeo a escolha do nuacutemero de eleitores gerados e o nuacutemero de vagas (Figura 3) Senenhum valor for fornecido o nuacutemero de eleitores padratildeo utilizado eacute 1000 e o nuacutemero devagas igual a 1

                        Figura 4 ndash Captura de tela 3

                        Este simulador possui dois modos para a criaccedilatildeo dos rankings dos eleitores No modoManipulate (Figura 4) primeiramente se define o nuacutemero de candidatos atraveacutes do campode entrada ao lado do tiacutetulo Candidates ou alternativamente pode-se adicionar candida-tos um a um atraveacutes do sinal de mais na parte inferior da paacutegina Para cada candidatoeacute possiacutevel definir a porcentagem de seus eleitores que optaraacute pelo voto taacutetico e pelovoto de minoria Tambeacutem eacute possiacutevel alterar o nome dos candidatos se for do interessedo usuaacuterio

                        32

                        Figura 5 ndash Captura de tela 4

                        Figura 6 ndash Captura de tela 5

                        33

                        Figura 7 ndash Captura de tela 6

                        Apoacutes a criaccedilatildeo dos candidatos o usuaacuterio pode criar perfis de eleitores que definiratildeo demaneira exata como partes da populaccedilatildeo iraacute votar (Figura 5) Em cada perfil se defineo valor em porcentos da populaccedilatildeo votante que o adotaraacute e a nota de cada candidatoTambeacutem eacute possiacutevel nomear cada perfil livremente

                        No modo Generate (Figura 6) eacute onde o gerador de nuacutemeros pseudoaleatoacuterios eacute usadoNesse modo ao inveacutes do usuaacuterio criar perfis de eleitores ele define qual seraacute a distribuiccedilatildeoadotada para a geraccedilatildeo de notas de cada candidato Essas distribuiccedilotildees seratildeo mais bemdetalhadas no Capiacutetulo 5 Da mesma maneira que no modo Manipulate nesse modotambeacutem eacute possiacutevel definir os valores para os dois tipos de voto uacutetil os votos taacuteticos eos votos de minoria No primeiro estatildeo incluiacutedas as estrateacutegias de mudanccedila de votoespeciacuteficas de cada sistema como o bullet voting no AVS e SVS ou quando a preferecircnciade um eleitor claramente natildeo possui chances de vitoacuteria e ele muda seu voto para um doscandidatos que esteja na lideranccedila o que ocorre no FPTP e TRS O voto de minoriase apresenta apenas no FPTP em eleiccedilotildees onde mais de um candidato eacute eleito Se apreferecircncia de um eleitor claramente lidera a eleiccedilatildeo por ser tambeacutem a preferecircncia damaior parte da populaccedilatildeo esse eleitor pode mudar o seu voto para uma segunda opccedilatildeona esperanccedila de eleger dois de seus candidatos favoritos

                        Por fim em ambos os modos o usuaacuterio tem a opccedilatildeo de definir coalizotildees entre oscandidatos se o sistema TRS estiver habilitado pois as coalizotildees apenas se manifestamnesse sistema Essas coalizotildees alteraratildeo as notas dos candidatos dependendo dos outroscandidatos pertencentes a elas (Figura 7)

                        A aplicaccedilatildeo pode ser encontrada na paacutegina httpelectionsimpythonanywherecom

                        34

                        4 CENAacuteRIOS PERTINENTES

                        Para todos os cenaacuterios deste capiacutetulo seraacute usada a seed do simulador igual a 100 e apopulaccedilatildeo de eleitores igual a 1000 para que exista consistecircncia na anaacutelise e tambeacutem paraque possa haver replicaccedilatildeo dos resultados se necessaacuterio

                        41 CENAacuteRIO 1 VOTO TAacuteTICO

                        Neste exemplo teremos quatro candidatos Ana Beto Carla e Diego Ana e Betoseratildeo gerados a partir da distribuiccedilatildeo Neutral (Figura 47) Carla da distribuiccedilatildeo Disliked(Figura 51) e Diego da Hated (Figura 55) Para a simulaccedilatildeo com a seed 100 o melhorcandidato a ser eleito ou seja aquele que maximiza a meacutedia das notas dos eleitores eacute oBeto com uma meacutedia de 0073 Para cada sistema seratildeo comparados os resultados semvoto taacutetico aos com 20 de voto taacutetico a favor da Ana Abaixo se encontram osresultados para o sistema FPTP

                        Figura 8 ndash FPTP - Cenaacuterio 1 sem voto taacutetico

                        Figura 9 ndash TRS segundo turno - Cenaacuterio 1 sem voto taacutetico

                        35

                        Figura 10 ndash IRV primeiro turno - Cenaacuterio 1

                        Figura 11 ndash IRV segundo turno - Cenaacuterio 1

                        Figura 12 ndash IRV terceiro turno - Cenaacuterio 1

                        36

                        Figura 13 ndash AVS - Cenaacuterio 1 sem voto taacutetico

                        Figura 14 ndash BC - Cenaacuterio 1 sem voto taacutetico

                        Figura 15 ndash SVS - Cenaacuterio 1 sem voto taacutetico

                        37

                        Nesse cenaacuterio sem voto taacutetico o uacutenico sistema que natildeo elege o Beto eacute o AVS Todosos outros elegem o melhor candidato Ou seja apesar de Beto ter uma melhor meacutediadas notas dos eleitores existem mais eleitores que ranqueiam Ana com uma nota acimade 0 No entanto apenas 20 dos eleitores de Diego e Carla que preferem a Ana aoinveacutes do Beto satildeo o suficiente para fazer Beto natildeo ser eleito se eles decidirem abandonarsua primeira opccedilatildeo e votar na Ana Considerando a vantagem que os votos taacuteticosproporcionam agrave Ana esta eacute eleita em todos os sistemas menos o TRS e o IRV

                        Figura 16 ndash FPTP - Cenaacuterio 1 - 20 de voto taacutetico na Ana

                        Figura 17 ndash TRS segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                        38

                        Figura 18 ndash IRV primeiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                        Figura 19 ndash IRV segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                        Figura 20 ndash IRV terceiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                        39

                        Figura 21 ndash AVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                        Figura 22 ndash BC - Cenaacuterio 1 20 de voto taacutetico na Ana

                        Figura 23 ndash SVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                        40

                        Eacute claro que se os eleitores que preferem o Beto tambeacutem votassem de maneira estra-teacutegica a situaccedilatildeo se equilibraria e haveria o mesmo niacutevel de concorrecircncia entre os doiscandidatos que ocorre quando natildeo haacute voto taacutetico Poreacutem no Borda Count esse equiliacute-brio pode natildeo acontecer e as estrateacutegias de compromising e burying podem acabar saindopela culatra se uma porcentagem elevada dos eleitores as adotarem Abaixo encontram-seos resultados para esse sistema quando 100 dos eleitores de Carla e Diego se comportammaliciosamente

                        Figura 24 ndash BC - Cenaacuterio 1 100 de voto taacutetico na Ana e Beto

                        Por causa do uso demasiado da estrateacutegia burying Ana e Beto perdem muitos pontose isso abre espaccedilo para uma vitoacuteria da Carla No entanto para porcentagens menores que100 o Beto ainda eacute o vencedor

                        Essas duas estrateacutegias tambeacutem foram implementadas nesse simulador para o sistemaIRV e eacute possiacutevel ver como ele eacute resistente a elas Para que seja possiacutevel mudar os resultadosde uma eleiccedilatildeo sob o IRV eacute necessaacuterio mudar a ordem de eliminaccedilatildeo dos candidatos paraque o seu candidato preferido acabe enfrentando um candidato mais fraco nas rodadasfinais Isso natildeo ocorre com compromising e burying No proacuteximo cenaacuterio seraacute analisadacomo eacute possiacutevel modificar os resultados de uma eleiccedilatildeo sob o IRV

                        Esses resultados podem ser replicados acessando os linksSem votos taacuteticos lthttpelectionsimpythonanywherecomdirect_res1111110

                        --[0021][22Ana2222Beto222022Carla2222Diego22]------100gt

                        Com 20 de voto taacutetico lthttpelectionsimpythonanywherecomdirect_res1111110--[0021][22Ana222022Beto2222Carla2222Diego22]1-[02000]---100gt

                        Com 100 de voto taacuteticona Ana e Beto lthttpelectionsimpythonanywherecomdirect_res0000100--[0021][22Ana222022Beto222022Carla2222Diego22]1-[101000]---100gt

                        41

                        42 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV

                        Neste cenaacuterio teremos Ana Carla e Beto concorrendo e trecircs perfis distintos que apoiamcada candidato As distribuiccedilotildees de notas dos perfis se encontram na tabela abaixo

                        Tabela 12 ndash Distribuiccedilatildeo de notas - Cenaacuterio 2

                        Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                        deeleitores

                        1 10 5 0 422 0 10 5 303 5 0 10 28

                        Com essas distribuiccedilotildees Carla eacute eliminada na primeira rodada e seus 28 de votossatildeo transferidos para a segunda opccedilatildeo de seus eleitores Ana que eacute eleita com 70 dosvotos e uma meacutedia de 56

                        Figura 25 ndash IRV primeiro turno - Cenaacuterio 2

                        Figura 26 ndash IRV segundo turno - Cenaacuterio 2

                        42

                        Cientes desse provaacutevel futuro cenaacuterio onde Ana eacute eleita uma pequena parte dos elei-tores de Beto estrategicamente o abandona e decide apoiar Carla na esperanccedila de leva-laao segundo turno contra Ana As novas distribuiccedilotildees de notas se encontram na tabelaabaixo com essa porccedilatildeo de eleitores representada pelo perfil 4

                        Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2

                        Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                        deeleitores

                        1 10 5 0 422 0 10 5 283 5 0 10 284 0 8 10 2

                        Essa mudanccedila estrateacutegica de voto altera a ordem de eliminaccedilotildees do sistema com Betosendo o primeiro a ser eliminado Com isso seus votos satildeo naturalmente transferidos paraCarla que derrota Ana no segundo turno com 58 dos votos

                        Figura 27 ndash IRV primeiro turno com voto taacutetico - Cenaacuterio 2

                        Figura 28 ndash IRV segundo turno com voto taacutetico - Cenaacuterio 2

                        43

                        Percebendo que a eleiccedilatildeo de Beto natildeo era provaacutevel seus eleitores conseguiram aomenos impedir a eleiccedilatildeo do pior candidato para eles Mas para isso foi necessaacuterio queeles tivessem a informaccedilatildeo de como os outros eleitores votariam Uma aproximaccedilatildeo dessasinformaccedilotildees poderia ser obtida em um cenaacuterio real com poucos candidatos atraveacutes depesquisas eleitorais poreacutem se o nuacutemero de candidatos eacute significativo uma noccedilatildeo completadas distribuiccedilotildees dos rankings dos eleitores se torna muito menos viaacutevel e dificulta aformulaccedilatildeo de estrateacutegias para alterar a ordem em que os candidatos satildeo eliminados

                        Esses resultados podem ser replicados acessando os linksSem voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana22

                        22Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                        Com voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana

                        2222Beto2222Carla22]-----42Voter20Profile2001020520028Voter20Profile2010201020528Voter20Profile202520020102Voter20Profile20302082010100gt

                        43 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE

                        O interessante dos sistemas IRV e TRS eacute que os resultados do cenaacuterio anterior po-deriam ter sido obtidos ao inveacutes do voto taacutetico pela sua natildeo-monotonicidade Seriapossiacutevel que a Carla derrotasse a Ana no segundo turno atraveacutes do proacuteprio aumento depopularidade da Ana Assumindo que essa popularizaccedilatildeo ocorresse entre os candidatosdo perfil 2 onde 3 passasse a apoiar a Ana ao inveacutes do Beto as novas distribuiccedilotildeesseguiriam a tabela abaixo

                        Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                        Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                        deeleitores

                        1 10 5 0 452 0 10 5 273 5 0 10 28

                        Dessa maneira Beto agora com uma porcentagem dos eleitores menor do que a deCarla seraacute eliminado na primeira rodada e como seus eleitores tecircm a Carla como segundaopccedilatildeo ela receberaacute todos os seus votos e seraacute eleita na segunda rodada As rodadas doIRV podem ser vistas nas figuras 29 e 30

                        44

                        Figura 29 ndash IRV primeiro turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                        Figura 30 ndash IRV segundo turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                        Tabela 15 ndash Resultados do Cenaacuterio 3Candidato

                        eleitoMeacutedia das

                        notasAntes da

                        popularizaccedilatildeode Ana

                        Ana 56

                        Apoacutespopularizaccedilatildeo

                        de AnaCarla 415

                        Os efeitos dessa caracteriacutestica se refletem na satisfaccedilatildeo meacutedia da populaccedilatildeo A Ana eacuteclaramente a melhor candidata e mesmo com o seu ganho de popularidade (ou devido aele) a Carla eacute eleita

                        Esses resultados podem ser replicados acessando os linksAntes da popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecom

                        direct_res0010000---[22Ana2222Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                        45

                        Apoacutes popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana2222Beto2222Carla22]-----45Voter20Profile2001020520027Voter20Profile2010201020528Voter20Profile20252002010100gt

                        44 CENAacuteRIO 4 COALIZOtildeES

                        O TRS por ser organizado em dois turnos separados normalmente a semanas dedistacircncia um do outro acaba abrindo brecha agrave mudanccedila de opiniatildeo por parte dos eleitorese o desenvolvimento de novas estrateacutegias por parte dos candidatos tais como a coalizatildeocom candidatos jaacute eliminados Com isso em mente nesse cenaacuterio teremos novamenteos quatro candidatos Ana Beto Carla e Diego Os trecircs primeiros seratildeo gerados dadistribuiccedilatildeo Neutral e Diego da distribuiccedilatildeo Disliked

                        Figura 31 ndash TRS turno 1 - Cenaacuterio 4

                        No TRS normal Ana Beto e Carla possuem com essas distribuiccedilotildees quantidades devotos muito proacuteximas com Beto e Carla indo para o segundo turno Carla estaacute 10 votosatraacutes de Beto e decide aproveitar o espaccedilo de tempo entre os dois turnos para tentaragregar mais votos Com isso Carla se aproxima de Diego e juntos formam uma coalizatildeoNo entanto com sua baixa popularidade Diego acaba ferindo a reputaccedilatildeo de Carla etorna o segundo turno muito mais faacutecil para Beto (Figura 33) Se Carla tivesse buscado osuporte de Ana por outro lado ela se veria vitoriosa no segundo turno e com uma amplavantagem sobre o Beto (Figura 34) Ou ateacute mesmo sem buscar uma coalizatildeo mesmosendo uma corrida apertada Carla teria naturalmente sido eleita (Figura 32)

                        Esses resultados podem ser replicados acessando os linksSem coalizotildees lthttpelectionsimpythonanywherecomdirect_res0100000

                        --[0002][22Ana222022Beto2222Carla2222Diego22]------100gt

                        46

                        Figura 32 ndash TRS turno 2 - Cenaacuterio 4

                        Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4

                        Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4

                        47

                        Coalizatildeo Carla e Diego lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2203Carla20Diego-100gt

                        Coalizatildeo Carla e Ana lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2200Carla20Ana-100gt

                        45 CENAacuteRIO 5 DILEMA DO PRISIONEIRO

                        Neste cenaacuterio temos uma eleiccedilatildeo de uma vaga com trecircs candidatos concorrentes e trecircsperfis distintos de eleitores que seguiratildeo as seguintes distribuiccedilotildees

                        Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5

                        Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                        deeleitores

                        1 10 -10 5 362 -10 10 5 343 -10 -10 5 30

                        Esse contexto nos remete ao notaacutevel dilema do prisioneiro Nele dois prisioneiroscuacutemplices satildeo interrogados individualmente sem poder se comunicar um com o outro ecada um enfrenta o dilema de delatar ou natildeo o seu parceiro Se os dois prisioneirosdecidem se manter calados sobre o crime ambos satildeo sentenciados a um ano de prisatildeo Seapenas um deles dedurar o outro o traidor sai livre enquanto seu parceiro eacute condenadoa trecircs anos Se ambos dedurarem um ao outro eles satildeo condenados juntos a dois anosde prisatildeo Esse dilema eacute uma ideia claacutessica presente no estudo da teoria dos jogos sendooriginalmente elaborada por Merrill Flood e Melvin Dresher em 1950 e mais tarde sendonomeada de dilema dos prisioneiros por Albert W Tucker (POUNDSTONE 1992)

                        O que esse dilema nos mostra eacute a tentaccedilatildeo que o indiviacuteduo deteacutem se sua racionalizaccedilatildeoestiver voltada para seus proacuteprios interesses e somente eles em oposiccedilatildeo a pensar no bemdo grupo como um todo Neste cenaacuterio encontramos dois grupos de eleitores expressiva-mente opostos os perfis 1 e 2 Se qualquer uma das preferecircncias desses perfis fosse eleitaisso significaria uma alta rejeiccedilatildeo de maior parte da populaccedilatildeo No entanto eles possuema segunda opccedilatildeo em comum a Carla que por sua vez eacute a preferecircncia do terceiro perfilPortanto a eleiccedilatildeo da Carla seria logicamente o resultado oacutetimo

                        Mesmo assim a Ana eacute eleita nos dois sistemas acima o que natildeo parece justo poispela tabela 16 eacute evidente que apenas 36 da populaccedilatildeo a aprova enquanto que os outros64 a reprovam ao maacuteximo O sistema IRV se comporta de maneira idecircntica ao TRS

                        48

                        Figura 35 ndash FPTP - Cenaacuterio 5

                        Figura 36 ndash TRS segundo turno - Cenaacuterio 5

                        nesta situaccedilatildeo Com esse resultado a meacutedia das notas eacute -28 No entanto os trecircs sistemasseguintes nos apresentam resultados diferentes

                        Tabela 17 ndash Resultados do Cenaacuterio 5

                        Sistema Candidatoeleito

                        Meacutedia dasnotas

                        FPTP Ana -28TRS Ana -28IRV Ana -28AVS Carla 50BC Carla 50SVS Carla 50

                        49

                        Figura 37 ndash AVS - Cenaacuterio 5

                        Figura 38 ndash BC - Cenaacuterio 5

                        Tanto o AVS quanto o Borda Count e o SVS satildeo sistemas que consideram todasas opiniotildees de cada eleitor ao mesmo tempo e por isso satildeo capazes de eleger o melhorcandidato nesta situaccedilatildeo diferentemente do TRS que natildeo absorve completamente todosentimento do eleitor por todos os candidatos e o IRV que apesar de ser bem expressivoquebra esse processo em inuacutemeras rodadas o que permite a perda de informaccedilatildeo ao longodelas

                        Esses resultados podem ser replicados acessando o linklthttpelectionsimpythonanywherecomdirect_res1111110---[22Ana

                        222022Beto222022Carla22]-----36Voter20Profile2001020-1020534Voter20Profile201-10201020530Voter20Profile202-1020-10205100gt

                        50

                        Figura 39 ndash SVS - Cenaacuterio 5

                        46 CENAacuteRIO 6 VOTO DE MINORIA

                        Neste cenaacuterio temos uma eleiccedilatildeo com quatro candidatos e duas vagas A Ana seraacutea preferecircncia de uma extensa parte da populaccedilatildeo (distribuiccedilatildeo Loved Figura 53) Betoe Carla seratildeo candidatos razoavelmente populares (distribuiccedilatildeo Neutral Figura 47) eDiego seraacute a preferecircncia de apenas um pequeno grupo especiacutefico e rejeitado pela maioria(distribuiccedilatildeo Disliked Figura 51) Eacute intuitivo esperar que os dois candidatos eleitos seratildeoa Ana e ou o Beto ou a Carla e isso eacute exatamente o que ocorre na figura 40 no sistemaFPTP sem voto de minoria

                        Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria

                        Eacute evidente a discrepacircncia da quantidade de votos da Ana para os outros candidatose apesar de Beto e Carla serem mais populares que Diego os trecircs natildeo se encontrammuito afastados Poreacutem se a pequena fraccedilatildeo de candidatos que possuem a Ana como

                        51

                        Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego

                        preferecircncia e Diego como segunda opccedilatildeo optarem pelo voto de minoria a situaccedilatildeo mudacompletamente (Figura 41) Assim apesar de extensamente rejeitado Diego conquistaa segunda vaga e a meacutedia das notas despenca de 2929 para 0505 No entanto aindaexiste um cenaacuterio pior Se os outros grupos de eleitores pensarem da mesma forma eevitarem votar na Ana achando que sua eleiccedilatildeo jaacute estaacute assegurada apenas 80 de votode minoria para esses grupos jaacute eacute o suficiente para eliminaacute-la das eleiccedilotildees (Figura 42)Com a Ana eliminada a meacutedia das notas cai ainda mais para 0058

                        Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego

                        O sistema Bloc Vote eacute uma das soluccedilotildees para o voto de minoria Permitindo queos eleitores votem no mesmo nuacutemero de candidatos que de vagas a serem preenchidasnatildeo existe o iacutempeto a esse tipo de voto estrateacutegico O resultado desse sistema portantoretorna a meacutedia das notas a casa dos 29 (Figura 43) Os sistemas AVS Borda Count eSVS tambeacutem impedem a presenccedila do voto de minoria e atingem resultados semelhantes

                        52

                        Figura 43 ndash BV - Cenaacuterio 6

                        Tabela 18 ndash Resultados do Cenaacuterio 6

                        Sistema Candidatoseleitos

                        Meacutedia dasnotas

                        FPTP sem voto de minoriaAna eBeto 2929

                        FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

                        FPTP com 80 de voto de minoriaBeto eCarla 0058

                        Bloc VoteAna eCarla 2913

                        Esses resultados podem ser replicados acessando os links

                        Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

                        100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

                        80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

                        53

                        5 COMO FUNCIONA O SIMULADOR

                        O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

                        51 CLASSE ELECTIONS

                        Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

                        bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

                        Figura 44 ndash estrutura candidates

                        bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

                        bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

                        Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

                        Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

                        54

                        Figura 45 ndash estrutura voters

                        Figura 46 ndash estrutura votes

                        daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

                        Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

                        55

                        Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

                        Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

                        na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

                        56

                        Figura 49 ndash PDF - Distribuiccedilatildeo Liked

                        Figura 50 ndash CDF - Distribuiccedilatildeo Liked

                        (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

                        Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

                        57

                        Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

                        Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

                        candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

                        Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

                        58

                        Figura 53 ndash PDF - Distribuiccedilatildeo Loved

                        Figura 54 ndash CDF - Distribuiccedilatildeo Loved

                        funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

                        59

                        Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                        Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                        Meacutedia das Notas sumei

                        sumvj nij

                        etimes v

                        Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                        Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                        60

                        Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                        Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                        52 CLASSE FIRSTPASTTHEPOST

                        Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                        Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                        61

                        Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                        Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                        mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                        62

                        53 CLASSE TWOROUNDSYSTEM

                        A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                        54 CLASSE INSTANTRUNOFFVOTING

                        A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                        Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                        63

                        cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                        55 CLASSE APPROVALVOTING

                        Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                        56 CLASSE BORDACOUNT

                        Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                        57 CLASSE SCOREVOTING

                        De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                        64

                        58 CLASSE BLOCVOTE

                        O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                        59 TECNOLOGIAS UTILIZADAS

                        A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                        Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                        O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                        Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                        65

                        6 CONCLUSAtildeO

                        Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                        Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                        Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                        Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                        Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                        66

                        REFEREcircNCIAS

                        AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                        Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                        Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                        Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                        HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                        LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                        ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                        Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                        POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                        The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                        67

                        APEcircNDICES

                        APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                        Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                        if(not len(selfvoter_profiles))

                        for voter in range(selfN_VOTERS)

                        candidates_rank = dict()

                        for candidate in reversed(range(selfN_CANDIDATES))

                        if(selfBIAS_VECTOR[candidate]==4)

                        candidates_rank[candidate] = self_sortear(selfloved)

                        elif(selfBIAS_VECTOR[candidate]==3)

                        candidates_rank[candidate] = self_sortear(selfliked)

                        elif(selfBIAS_VECTOR[candidate]==2)

                        candidates_rank[candidate] = self_sortear(selfdisliked)

                        elif(selfBIAS_VECTOR[candidate]==1)

                        candidates_rank[candidate] = self_sortear(selfhated)

                        elif(selfBIAS_VECTOR[candidate]==-1)

                        candidates_rank[candidate] = self_sortear(selfpolarizer

                        )

                        elif(selfBIAS_VECTOR[candidate]==-2)

                        candidates_rank[candidate] = self_sortear(self

                        more_polarizer)

                        else

                        candidates_rank[candidate] = self_sortear(selfneutral)

                        selfvotersappend(candidates_rank)

                        else

                        ranges = []

                        ranks = []

                        for prof in selfvoter_profiles

                        rangesappend(int(prof[pop_percentage]))

                        rank =

                        for index score in enumerate(prof[scores])

                        rank[index] = score

                        ranksappend(rank)

                        for index _range in enumerate(ranges)

                        for _ in range(int(selfN_VOTERS(_range100)))

                        selfvotersappend(ranks[index])

                        68

                        APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                        Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                        for i in range(selfN_CANDIDATES)

                        selfcandidates[i] = 0

                        selfvotes[i] = set()

                        APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                        Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                        for candidate in range(selfN_CANDIDATES)

                        rating_sum = 0

                        for voter in selfvoters

                        rating_sum += voter[candidate]

                        selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                        APEcircNDICE D ndash MEacuteTODO GET_MEAN

                        Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                        if len(winners) gt 1 or selfN_CANDIDATES gt 10

                        return selfcalculate_mean(winners)

                        else

                        chose_best = True if winners[0] == selfbest_candidate else

                        False

                        return selfstats[rsquomeansrsquo][winners[0]] chose_best

                        69

                        APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                        Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                        rating_sum = 0

                        for voter in selfvoters

                        for candidate in winners

                        rating_sum += voter[candidate]

                        return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                        APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                        Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                        for i in range(1 selfN_VACANCIES + 2)

                        selfleading_candidatesappend(selfsorted_candidates[-i][self

                        CANDIDATE_INDEX])

                        APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                        Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                        for leader in selfelecrounds[-1]

                        selfleading_candidatesappend(leader[0])

                        70

                        APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                        Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                        self_account_for_coalitions()

                        for voter in selfvoters

                        selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                        (1)))

                        temp = []

                        for voter in selfsorted_voters

                        new_dict = defaultdict(list)

                        for k in voter

                        new_dict[k[1]]append(k[0])

                        tempappend(new_dict)

                        selfsorted_voters = []

                        for voter_index current_voter in enumerate(temp)

                        new_voter = []

                        for rating candidate_indexes in current_voteritems()

                        if len(current_voter[rating]) gt 1

                        shuffle(current_voter[rating])

                        for e in candidate_indexes

                        new_voterappend((e rating))

                        else

                        new_voterappend((candidate_indexes[0] rating))

                        selfsorted_votersappend(new_voter)

                        selfcandidates[new_voter[-1][0]] += 1

                        selfvotes[new_voter[-1][0]]add(voter_index)

                        71

                        APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                        Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                        for candidate in selfvotes_copy

                        if candidate not in selfelecleading_candidates

                        for voter_index in selfvotes_copy[candidate]

                        for index _candidate in enumerate(reversed(selfelec

                        sorted_voters[voter_index]))

                        if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                        leading_candidates

                        if randomrandom() lt selfelec

                        tactical_vote_percentages[_candidate[selfelec

                        CANDIDATE_INDEX]]

                        selfrankings_changed[voter_index] = copy

                        deepcopy(selfelecsorted_voters[voter_index])

                        selfrankings_changed[voter_index][-(index + 1)]

                        selfrankings_changed[voter_index][-1] = self

                        rankings_changed[voter_index][-1] self

                        rankings_changed[voter_index][-(index + 1)]

                        selfcandidates[candidate] -= 1

                        selfcandidates[_candidate[selfelec

                        CANDIDATE_INDEX]] += 1

                        selfvotes[candidate]remove(voter_index)

                        selfvotes[_candidate[selfelecCANDIDATE_INDEX

                        ]]add(voter_index)

                        break

                        break

                        72

                        APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                        Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                        half_vacancies = mathfloor(selfelecN_VACANCIES2)

                        for candidate in selfelecleading_candidates

                        if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                        continue

                        for voter_index in selfvotes_copy[candidate]

                        if voter_index in selfrankings_changed

                        ranking = selfrankings_changed[voter_index]

                        else

                        ranking = copydeepcopy(selfelecsorted_voters[voter_index

                        ])

                        for index _candidate in enumerate(reversed(ranking))

                        if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                        leading_candidates or (_candidate[selfelec

                        CANDIDATE_INDEX] in selfelecleading_candidates and

                        selfelecleading_candidatesindex(_candidate[selfelec

                        CANDIDATE_INDEX]) gt= half_vacancies)

                        if _candidate[selfelecCANDIDATE_RANK] gt= 0

                        if randomrandom() lt selfelec

                        minority_vote_percentages[_candidate[selfelec

                        CANDIDATE_INDEX]]

                        selfcandidates[candidate] -= 1

                        selfcandidates[_candidate[selfelec

                        CANDIDATE_INDEX]] += 1

                        break

                        break

                        break

                        73

                        APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                        Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                        self_account_for_coalitions()

                        for candidate in selfvotes

                        if candidate = selfwinner and candidate = selfsecond_place

                        for voter_index in selfvotes[candidate]

                        if voter_index in selfrankings_changed

                        ranking = selfrankings_changed[voter_index]

                        else

                        ranking = copydeepcopy(selfelecsorted_voters[

                        voter_index])

                        for index2 candidate in enumerate(reversed(ranking))

                        if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                        selfcandidates[selfwinner] += 1

                        selfvotes[selfwinner]add(voter_index)

                        break

                        elif candidate[selfelecCANDIDATE_INDEX] == self

                        second_place

                        selfcandidates[selfsecond_place] += 1

                        selfvotes[selfsecond_place]add(voter_index)

                        break

                        selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                        winners = []

                        vacancies = selfelecN_VACANCIES

                        for candidate in reversed(selfsorted_candidates)

                        if vacancies == 0

                        break

                        winnersappend(candidate[0])

                        vacancies -= 1

                        mean chose_best = selfelecget_mean(winners = winners)

                        74

                        APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                        Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                        for voter_index voter in enumerate(selfelecsorted_voters)

                        voter_dict = dict()

                        og_voter_dict = dict()

                        for tup in voter

                        voter_dict[tup[0]] = tup[1]

                        og_voter_dict[tup[0]] = tup[1]

                        for coalition in selfeleccoalitions

                        for candidate in coalition

                        add_to_score = 0

                        for candidate2 in coalition

                        if candidate == candidate2

                        continue

                        half = og_voter_dict[candidate2[rsquovaluersquo]]2

                        if half lt 0

                        add_to_score += mathceil(half)

                        else

                        add_to_score += mathfloor(half)

                        if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                        voter_dict[candidate[rsquovaluersquo]] = 10

                        elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                        voter_dict[candidate[rsquovaluersquo]] = -10

                        else

                        voter_dict[candidate[rsquovaluersquo]] += add_to_score

                        selfrankings_changed[voter_index] = []

                        for candidate in voter_dict

                        selfrankings_changed[voter_index]append((candidate voter_dict[

                        candidate]))

                        selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                        voter_index] key=lambda x x[1])

                        75

                        APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                        Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                        selfelecroundsappend(selfsorted_candidates[_round])

                        if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                        N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                        N_VACANCIES - 1)

                        return 2

                        elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                        N_VOTERS gt 05)

                        return 1

                        else

                        selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                        CANDIDATE_INDEX])

                        for voter_index in selfvotes[selfsorted_candidates[_round][self

                        elecCANDIDATE_INDEX]]

                        if voter_index in selfrankings_changed

                        for candidate in reversed(selfrankings_changed[voter_index

                        ])

                        if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                        excluded

                        selfcandidates[candidate[selfelecCANDIDATE_INDEX

                        ]] += 1

                        selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                        add(voter_index)

                        break

                        else

                        continue

                        else

                        for candidate in reversed(selfelecsorted_voters[

                        voter_index])

                        if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                        excluded

                        selfcandidates[candidate[selfelecCANDIDATE_INDEX

                        ]] += 1

                        selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                        add(voter_index)

                        break

                        else

                        continue

                        selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                        return 0

                        76

                        APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                        Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                        for index in range(selfelecN_CANDIDATES)

                        selfcandidates[index] = 0

                        for voter in selfelecsorted_voters

                        for candidate in reversed(voter)

                        if candidate[selfelecCANDIDATE_SCORE] gt 0

                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                        else

                        break

                        APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                        Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                        for index in range(selfelecN_CANDIDATES)

                        selfcandidates[index] = 0

                        for voter in selfelecsorted_voters

                        if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                        elecCANDIDATE_INDEX]]

                        selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                        else

                        for candidate in reversed(voter)

                        if candidate[selfelecCANDIDATE_SCORE] gt 0

                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                        else

                        break

                        77

                        APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                        Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                        pos = set()

                        for index perc in enumerate(selfelectactical_vote_percentages)

                        if perc gt 0

                        posadd(index)

                        for candidate in selfeleccandidates

                        if candidate not in selfleading_candidates

                        for voter_index in selfvotes[candidate]

                        raised = None

                        for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                        ])

                        if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                        leading_candidates

                        if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                        if randomrandom() lt selfelectactical_vote_percentages[

                        candidate_tuple[selfelecCANDIDATE_INDEX]]

                        ranking = [None]selfelecN_CANDIDATES

                        ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                        selfelecvoters[voter_index][candidate_tuple[selfelec

                        CANDIDATE_INDEX]])

                        raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                        break

                        break

                        break

                        if raised = None

                        for _candidate in selfleading_candidates

                        if _candidate = ranking[-1][0]

                        ranking[0] = (_candidate selfelecvoters[voter_index][

                        _candidate])

                        buried = _candidate

                        break

                        i = 1

                        for candidate_tuple in selfelecsorted_voters[voter_index]

                        if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                        buried]

                        continue

                        else

                        ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                        selfelecvoters[voter_index][candidate_tuple[selfelec

                        CANDIDATE_INDEX]])

                        i += 1

                        selfrankings_changed[voter_index] = ranking

                        78

                        APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                        Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                        for voter_index in selfvotes[candidate]

                        if randomrandom() lt selfelectactical_vote_percentages[candidate

                        ]

                        for _candidate in selfleading_candidates

                        if _candidate = candidate

                        ranking = [None]selfelecN_CANDIDATES

                        ranking[0] = (_candidate selfelecvoters[voter_index][

                        _candidate])

                        buried = _candidate

                        break

                        i = 1

                        for candidate_tuple in selfelecsorted_voters[voter_index]

                        if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                        continue

                        else

                        ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                        selfelecvoters[voter_index][candidate_tuple[selfelec

                        CANDIDATE_INDEX]])

                        i += 1

                        selfrankings_changed[voter_index] = ranking

                        79

                        APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                        Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                        for index in range(selfelecN_CANDIDATES)

                        selfcandidates[index] = 0

                        for voter_index voter in enumerate(selfelecsorted_voters)

                        score = 0

                        if voter_index in selfrankings_changed

                        for candidate in selfrankings_changed[voter_index]

                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                        score += 1

                        else

                        for candidate in voter

                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                        score += 1

                        APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                        Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                        for voter_index voter in enumerate(selfelecsorted_voters)

                        if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                        elecCANDIDATE_INDEX]]

                        selfrankings_changed[voter_index] = copydeepcopy(selfelec

                        sorted_voters[voter_index])

                        for candidate_index candidate in enumerate(reversed(voter))

                        if candidate_index == 0

                        selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                        voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                        else

                        selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                        voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                        80

                        APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                        Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                        for index in range(selfelecN_CANDIDATES)

                        selfcandidates[index] = 0

                        for voter_index voter in enumerate(selfelecsorted_voters)

                        if voter_index in selfrankings_changed

                        for candidate in selfrankings_changed[voter_index]

                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                        selfelecCANDIDATE_RANK]

                        else

                        for candidate in voter

                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                        selfelecCANDIDATE_RANK]

                        APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                        Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                        for index in range(selfelecN_CANDIDATES)

                        selfcandidates[index] = 0

                        for voter in selfelecsorted_voters

                        votes = selfelecN_VACANCIES

                        for candidate in reversed(voter)

                        if votes == 0

                        break

                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                        votes -= 1

                        • Folha de aprovaccedilatildeo
                        • Agradecimentos
                        • Epiacutegrafe
                        • Resumo
                        • Abstract
                        • Lista de ilustraccedilotildees
                        • Lista de Coacutedigos
                        • Lista de tabelas
                        • Lista de abreviaturas e siglas
                        • Sumaacuterio
                        • INTRODUCcedilAtildeO
                          • MOTIVACcedilAtildeO E OBJETIVO
                          • MEacuteTODO
                          • ESTRUTURA
                            • SISTEMAS ELEITORAIS
                              • FISRT PAST THE POST
                                • Exemplo
                                • Vantagens e Desvantagens do FPTP
                                • Voto Uacutetil no FPTP
                                  • TWO-ROUND SYSTEM
                                    • Exemplo
                                    • Vantagens e Desvantagens do TRS
                                    • Voto Uacutetil no TRS
                                      • INSTANT-RUNOFF VOTING
                                        • Exemplo
                                        • Vantagens e Desvantagens do IRV
                                        • Voto Uacutetil no IRV
                                          • APPROVAL VOTING SYSTEM
                                            • Exemplo
                                            • Vantagens e Desvantagens do AVS
                                            • Voto Uacutetil no AVS
                                              • THE BORDA COUNT
                                                • Exemplo
                                                • Vantagens e Desvantagens do BC
                                                • Voto Uacutetil no BC
                                                  • SCORE VOTING SYSTEM
                                                    • Exemplo
                                                    • Vantagens e Desvantagens do SVS
                                                    • Voto Uacutetil no SVS
                                                      • BLOC VOTE
                                                        • Exemplo
                                                        • Voto Uacutetil no BV
                                                            • O SIMULADOR
                                                            • CENAacuteRIOS PERTINENTES
                                                              • CENAacuteRIO 1 VOTO TAacuteTICO
                                                              • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                              • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                              • CENAacuteRIO 4 COALIZOtildeES
                                                              • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                              • CENAacuteRIO 6 VOTO DE MINORIA
                                                                • COMO FUNCIONA O SIMULADOR
                                                                  • CLASSE Elections
                                                                  • CLASSE FirstPastThePost
                                                                  • CLASSE TwoRoundSystem
                                                                  • CLASSE InstantRunoffVoting
                                                                  • CLASSE ApprovalVoting
                                                                  • CLASSE BordaCount
                                                                  • CLASSE ScoreVoting
                                                                  • CLASSE BlocVote
                                                                  • TECNOLOGIAS UTILIZADAS
                                                                    • CONCLUSAtildeO
                                                                    • Referecircncias
                                                                    • Meacutetodo create_voters
                                                                    • Meacutetodo create_candidates
                                                                    • Meacutetodo calculate_means
                                                                    • Meacutetodo get_mean
                                                                    • Meacutetodo calculate_mean
                                                                    • Meacutetodo set_leading_candidates
                                                                    • Meacutetodo irv_set_leading_candidates
                                                                    • Meacutetodo sort_ranks
                                                                    • Meacutetodo fptp_count_tactical_votes
                                                                    • Meacutetodo fptp_count_minority_votes
                                                                    • Meacutetodo trs_second_round
                                                                    • Meacutetodo trs_account_for_coalitions
                                                                    • Meacutetodo irv_count_votes
                                                                    • Meacutetodo avs_count_votes
                                                                    • Meacutetodo avs_count_votes_with_tactical
                                                                    • Meacutetodo irv_apply_tactical_votes
                                                                    • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                    • Meacutetodo bc_sum_candidates_scores
                                                                    • Meacutetodo svs_apply_tactical_votes
                                                                    • Meacutetodo svs_sum_candidates_scores
                                                                    • Meacutetodo bv_count_votes

                          4 CENAacuteRIOS PERTINENTES 3441 CENAacuteRIO 1 VOTO TAacuteTICO 3442 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV 4143 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE 4344 CENAacuteRIO 4 COALIZOtildeES 4545 CENAacuteRIO 5 DILEMA DO PRISIONEIRO 4746 CENAacuteRIO 6 VOTO DE MINORIA 50

                          5 COMO FUNCIONA O SIMULADOR 5351 CLASSE Elections 5352 CLASSE FirstPastThePost 6053 CLASSE TwoRoundSystem 6254 CLASSE InstantRunoffVoting 6255 CLASSE ApprovalVoting 6356 CLASSE BordaCount 6357 CLASSE ScoreVoting 6358 CLASSE BlocVote 6459 TECNOLOGIAS UTILIZADAS 64

                          6 CONCLUSAtildeO 65

                          REFEREcircNCIAS 66

                          APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS 67

                          APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES 68

                          APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS 68

                          APEcircNDICE D ndash MEacuteTODO GET_MEAN 68

                          APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN 69

                          APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES 69

                          APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES 69

                          APEcircNDICE H ndash MEacuteTODO SORT_RANKS 70

                          APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES 71

                          APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES 72

                          APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND 73

                          APEcircNDICE L ndash MEacuteTODOTRS_ACCOUNT_FOR_COALITIONS 74

                          APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES 75

                          APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES 76

                          APEcircNDICE O ndash MEacuteTODOAVS_COUNT_VOTES_WITH_TACTICAL 76

                          APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES 77

                          APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES (CON-TINUACcedilAtildeO) 78

                          APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES 79

                          APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES 79

                          APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES 80

                          APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES 80

                          15

                          1 INTRODUCcedilAtildeO

                          Em toda eleiccedilatildeo existe pelo menos um grupo de indiviacuteduos que sai completamentedesfavorecido e insatisfeito com o resultado O contentamento completo de uma populaccedilatildeoeacute certamente improvaacutevel e muitas vezes impossiacutevel considerando a gama de candidatosque se dispotildee a concorrer Em todo caso o miacutenimo que pode ser feito eacute escolher demaneira eficiente o melhor candidato ao cargo dentre as opccedilotildees disponiacuteveis Diante dissoeacute necessaacuterio avaliar como essa escolha eacute feita e quais meacutetodos satildeo capazes de tornaacute-larealidade

                          11 MOTIVACcedilAtildeO E OBJETIVO

                          Em conformidade com o extenso nuacutemero de sistemas eleitorais pelo mundo este tra-balho tem como objetivo testar uma porccedilatildeo desses sistemas sob a simulaccedilatildeo de diferentescenaacuterios especiacuteficos a fim de determinar quais deles podem ser considerados como os maisjustos perante a taxa de satisfaccedilatildeo meacutedia da populaccedilatildeo

                          12 MEacuteTODO

                          Para que essa anaacutelise seja possiacutevel foi desenvolvido um programa que permite a criaccedilatildeoe configuraccedilatildeo de diferentes cenaacuterios onde os sistemas eleitorais seratildeo simulados Nele eacutepossiacutevel definir o nuacutemero total de eleitores e candidatos como esses eleitores iratildeo votar eo niacutevel de popularidade de cada candidato Aleacutem disso eacute possiacutevel formar coalizotildees entreos candidatos e escolher a porcentagem dos eleitores que optaratildeo pelo voto uacutetil Dessamaneira seraacute possiacutevel elaborar cenaacuterios que buscam expor os pontos fortes e fracos decada sistema

                          13 ESTRUTURA

                          Este trabalho eacute relatado ao longo de seis capiacutetulos No Capiacutetulo 2 seratildeo apresentados ossistemas eleitorais implementados no simulador suas vantagens e desvantagens conhecidase outras caracteriacutesticas especiacuteficas de cada um A intenccedilatildeo do capiacutetulo eacute tornar o textomais autocontido trazendo conceitos jaacute estudados que ajudaratildeo na melhor compreensatildeodos capiacutetulos seguintes por isso grande parte de sua composiccedilatildeo eacute oriunda de diferentesfontes consultadas

                          O Capiacutetulo 3 eacute uma apresentaccedilatildeo das funcionalidades que o simulador possui Seratildeoexplicados todos os campos de entrada e os dois modos distintos nos quais o programaopera

                          16

                          No Capiacutetulo 4 os sistemas seratildeo colocados em teste Todos seratildeo simulados em cenaacuteriosespeciacuteficos a fim de fazer sobressair aqueles com as maiores taxas de satisfaccedilatildeo meacutedia

                          A estrutura e implementaccedilatildeo do simulador seratildeo abordadas em detalhes no Capiacutetulo5 assim como uma breve descriccedilatildeo da stack utilizada Todos os meacutetodos relevantes aofuncionamento das simulaccedilotildees seratildeo explicados passo a passo

                          No Capiacutetulo 6 seratildeo apresentadas as conclusotildees referentes agrave anaacutelise dos resultadosobtidos no Capiacutetulo 4 e as consideraccedilotildees finais do projeto como um todo

                          17

                          2 SISTEMAS ELEITORAIS

                          Atualmente mais e mais paiacuteses estatildeo adotando sistemas democraacuteticos de governoCerca de 6 em 10 governos no mundo satildeo democracias (Pew Research Center 2017) o quepode ser observado na Figura 1 abaixo Em um sistema democraacutetico a populaccedilatildeo escolheseus liacutederes atraveacutes de seu sistema eleitoral Existem diversos sistemas eleitorais em usono mundo muitos dos quais satildeo usados em conjunto para eleger um uacutenico candidato Emvaacuterios paiacuteses mais de um sistema eleitoral pode ser utilizado tambeacutem em diferentes niacuteveisde governo tanto presidencial quanto estadual ou municipal Natildeo apenas imersos nomeio poliacutetico eles tambeacutem podem ser usados em escopos menores como em esportes oucompeticcedilotildees artiacutesticas poreacutem sempre com a finalidade de alocar um ou mais indiviacuteduosa determinado cargo ou tiacutetulo

                          Figura 1 ndash de paiacuteses de cada tipo de regime 1946-2016

                          Fonte Center of Systemic Peacersquos Polity IV Project

                          Os proacuteximos trecircs toacutepicos discutidos neste capiacutetulo referentes aos meacutetodos First Pastthe Post Two-Round System e Instant Runoff Voting possuem seus conceitos e infor-maccedilotildees relevantes com exceccedilatildeo dos exemplos traduzidos livremente do livro Behind theBallot Box A Citizenrsquos Guide to Voting Systems (AMY 2000)

                          21 FISRT PAST THE POST

                          O meacutetodo First Past the Post tambeacutem conhecido como Plurality Voting ou WinnerTakes All eacute o meacutetodo mais simples e direto e provavelmente o primeiro meacutetodo que sepensa quando se fala de eleiccedilotildees Os eleitores escolhem apenas um candidato e apoacutes a

                          18

                          contagem dos votos o candidato com o maior nuacutemero de votos eacute eleito O vencedor natildeonecessita da aprovaccedilatildeo de mais de 50 dos eleitores ele apenas precisa de uma pluralidadedos votos ou seja apenas possuir mais votos que os outros candidatos

                          Esse sistema eacute utilizado em escala nos Estados Unidos para a maior parte das eleiccedilotildeesvoltadas a eleger apenas um candidato como prefeitos e governadores aleacutem de ser usadana disputa presidencial Dentre outros paiacuteses que empregam o sistema em suas corridaspresidenciais estatildeo listados o Meacutexico as Filipinas a Coreia do Sul e a Venezuela

                          211 Exemplo

                          Tabela 1 ndash Exemplo FPTP

                          Candidatos VotosA 36B 25C 22D 17

                          Neste exemplo o candidato A possui uma pluralidade dos votos com 36 e ele eacute ocandidato eleito mesmo natildeo tendo uma maioria

                          212 Vantagens e Desvantagens do FPTP

                          A vantagem do FPTP eacute a sua simplicidade Natildeo eacute difiacutecil para um eleitor comumcompreender o seu funcionamento eles apenas precisam se decidir por um candidato Eletambeacutem eacute muito simples e direto na sua contagem e seleccedilatildeo do vencedor

                          Esse meacutetodo tambeacutem tende a criar listas de candidatos concorrentes mais curtasCandidatos independentes ou de partidos menores frequentemente acabam se sentindodesencorajados a concorrer devido agraves suas baixas chances de vitoacuteria Isso normalmentefornece aos eleitores uma faacutecil decisatildeo entre um ou dois candidatos dos maiores partidosao mesmo tempo poreacutem limitando suas opccedilotildees

                          No entanto sua essecircncia eacute sua principal desvantagem a pluralidade O fato do can-didato eleito natildeo necessitar de uma maioridade dos votos da populaccedilatildeo parece violaros princiacutepios baacutesicos da democracia Democracia eacute em sua origem o poder(kratos) nopovo(demos) poreacutem na pluralidade o poder de eleger um candidato pode residir emapenas uma fraccedilatildeo relativamente pequena do povo Em um cenaacuterio hipoteacutetico comapenas trecircs candidatos um deles apenas poderia necessitar de natildeo mais do que 34 dosvotos para ser eleito o que significa que no pior dos casos 66 da populaccedilatildeo rejeitao candidato eleito O cenaacuterio soacute piora com mais e mais candidatos concorrendo Paraquatro candidatos satildeo necessaacuterios 26 dos votos no pior dos casos para cinco satildeo 21 eassim por diante

                          19

                          213 Voto Uacutetil no FPTP

                          No FPTP tambeacutem existe a possibilidade de os eleitores evitarem votar em sua prefe-recircncia verdadeira No caso de sua preferecircncia natildeo aparentar ter boas chances de vitoacuteriamuitas vezes opta-se por uma segunda opccedilatildeo que esteja mais bem colocada nas eleiccedilotildeesO motivo disso eacute que nessas situaccedilotildees votar em sua preferecircncia pode parecer um des-perdiacutecio do seu voto e no pior dos cenaacuterios optar por natildeo transferir seu voto para umasegunda opccedilatildeo pode acabar resultando na eleiccedilatildeo de um candidato de seu desgosto As-sim votar de maneira verdadeira muitas vezes pode acabar prejudicando o eleitor que sevecirc forccedilado a abandonar seus interesses poliacuteticos mais imediatos e escolher o menor entredois(ou mais) males Os candidatos de partidos menores satildeo os que mais sofrem com essetipo de voto estrateacutegico por natildeo conseguirem agregar as maiores quantidades de votos

                          Entretanto ao mesmo tempo que partidos maiores roubam votos de partidos meno-res com os votos taacuteticos partidos menores tambeacutem tem a oportunidade de ganhar algunsvotos com o denominado spoiler effect Ao entrarem na eleiccedilatildeo candidatos de partidosmenores podem adquirir votos de candidatos mais populares que possuem inclinaccedilatildeo po-liacutetica semelhante Logo eacute possiacutevel que haja certo equiliacutebrio ao se contrapor as mudanccedilasde voto devido aos votos uacuteteis agraves mudanccedilas oriundas do spoiler effect

                          Poreacutem o spoiler effect natildeo necessariamente ocorre apenas entre partidos maiores emenores mas pode prejudicar candidatos de popularidades proacuteximas Por exemplo entretrecircs candidatos A B e C onde A representa determinada posiccedilatildeo no espectro poliacuteticoenquanto B e C possuem posiccedilotildees parecidas o que pode acontecer eacute B e C se prejudicaremmutuamente jaacute que ambos dividem os eleitores de um mesmo espectro poliacutetico Se esseespectro tem a maioria com 60 por exemplo com B e C compartilhando cada um 30dos votos o candidato A sairia vencedor com 40 mesmo que todos os eleitores de Bprefiram C e todos os eleitores de C prefiram B Esse exemplo demonstra claramente oproblema com os sistemas de pluralidade

                          22 TWO-ROUND SYSTEM

                          Uma das primeiras tentativas de lidar com a desvantagem dos sistemas por pluralidadeo Two-round System eacute usado desde o seacuteculo XIX no ocidente e atualmente ainda eacute utilizadoem corridas presidecircncias de paiacuteses como o Brasil Bulgaacuteria Chile Colocircmbia FinlacircndiaPolocircnia Portugal Ruacutessia e em inuacutemeras eleiccedilotildees locais nos Estados Unidos

                          O principal objetivo do TRS eacute garantir que o vencedor tenha conseguido uma maioriados votos Para isso as eleiccedilotildees satildeo estruturadas em duas rodadas de votaccedilatildeo Na primeirarodada os eleitores se dirigem agraves urnas e votam no candidato de sua preferecircncia Apoacutesa contagem se a quantidade de votos do candidato mais votado superar a proporccedilatildeo de50 natildeo haacute a necessidade de uma segunda rodada e este candidato eacute eleito No entantose este natildeo for o caso haveraacute uma segunda rodada com apenas os dois candidatos mais

                          20

                          votados Nesta rodada os eleitores retornam as urnas para escolher uma das duas opccedilotildeessendo eleito o candidato mais votado agora definitivamente com uma maioria dos votos

                          221 Exemplo

                          Utilizando a mesma distribuiccedilatildeo de votos descrita na tabela 1 Neste caso como ocandidato A natildeo possui uma maioria dos votos ele e o candidato B iratildeo concorrer em umsegundo turno Digamos que as distribuiccedilotildees dos votos dos eleitores dos candidatos C eD em relaccedilatildeo aos candidatos A e B satildeo as seguintes

                          Tabela 2 ndash 2deg turno do TRS

                          Candidatos Votos dos eleitoresde C

                          Votos dos eleitoresde D

                          Votos do 1degturno

                          A 7 5 36B 15 12 25

                          O candidato B agora eacute eleito com uma maioria dos votos 52 contra 48 do candidatoA

                          222 Vantagens e Desvantagens do TRS

                          Por ser parecido com o FPTP esse sistema tambeacutem eacute de faacutecil compreensatildeo do eleitorcomum poreacutem a maior vantagem do TRS eacute a garantia de que o candidato vencedor teraacute oapoio da maioria dos eleitores no segundo turno eliminando a pluralidade Argumenta-seque isso daacute maior legitimidade poliacutetica ao mandato do candidato eleito

                          O TRS tende a abrigar uma lista maior de candidatos sendo mais convidativo acandidatos de partidos menores mesmo que suas chances natildeo sejam maiores quandocomparadas agraves eleiccedilotildees sob o FPTP Mesmo assim essa listagem mais abrangente eacute umavantagem do sistema pois daacute aos eleitores uma variedade maior de opccedilotildees de voto

                          Em relaccedilatildeo agraves suas desvantagens o TRS possui duas principais A primeira satildeo oscustos elevados do sistema decorrentes da necessidade da organizaccedilatildeo de um segundoturno de votaccedilotildees A segunda eacute o aumento no iacutendice de ausecircncias dos eleitores agraves urnasEssa ampliaccedilatildeo no natildeo comparecimento dos eleitores se daacute tambeacutem devido ao segundoturno por pura fatiga eleitoral bem como consequecircncia da desistecircncia de eleitores queapoiam candidatos que jaacute foram eliminados

                          Outro ponto negativo do TRS eacute a sua natildeo-monotonicidade Isso significa que umcandidato pode ser prejudicado com um aumento em sua popularidade e suporte e domesmo modo um candidato pode se beneficiar com a perda de popularidade e suporteSe os candidatos A e B satildeo os esperados para ir ao segundo turno onde A eacute mais fortedo que B um aumento no suporte pelo candidato A pode resultar na sua derrota quandoesse aumento causa uma alteraccedilatildeo nos candidatos que satildeo selecionados para ir ao segundoturno Se esse aumento na popularidade de A resultar na eliminaccedilatildeo preacutevia de B um

                          21

                          terceiro candidato C pode ser vitorioso sobre A no segundo turno caso os eleitores de Bprefiram C ao candidato A Se natildeo houvesse esse crescimento de popularidade A teriaderrotado B no segundo turno Essa situaccedilatildeo seraacute vista em melhores detalhes na seccedilatildeo 43

                          223 Voto Uacutetil no TRS

                          Esse sistema minimiza os efeitos do voto uacutetil em relaccedilatildeo ao FPTP pois um eleitorqualquer pode tranquilamente votar em sua preferecircncia sem se preocupar em desperdiccedilaacute-lo mesmo que seu candidato natildeo tenha chances de vitoacuteria Se este natildeo for eleito aindapoderaacute escolher a sua preferecircncia dentre os dois candidatos que prosseguirem para osegundo turno

                          Apesar disso ainda existe um cenaacuterio em que o eleitor pode ser tentado a natildeo votar emsua preferecircncia Eacute possiacutevel que ele opte pela sua segunda opccedilatildeo se souber que sua primeiraopccedilatildeo possui miacutenimas chances de ir ao segundo turno ou ateacute mesmo por saber que issodiminuiraacute as chances de algum outro candidato ser eleito Mesmo assim eacute evidente queo TRS natildeo proporciona o mesmo apelo ao voto taacutetico que o FPTP

                          Outra caracteriacutestica do TRS eacute o incentivo a formaccedilatildeo de coalizotildees entre candidatosde partidos mais populares com candidatos de partidos menos populares As coalizotildeesfornecem benefiacutecios agrave ambas as partes onde os candidatos classificados para o segundoturno em geral se juntam a candidatos jaacute eliminados com a intenccedilatildeo de agregar maisvotos enquanto os candidatos jaacute eliminados apoiam um dos dois classificados na esperanccedilade inserir propostas proacuteprias ou modificaccedilotildees agrave chapa deles

                          23 INSTANT-RUNOFF VOTING

                          Instant Runoff Voting foi uma alternativa aos meacutetodos FPTP e TRS desenvolvidanos anos 70 por um professor do Instituto de Tecnologia de Massachusetts(MIT) O IRVelimina as principais desvantagens desses outros dois sistemas a pluralidade do FPTP e anecessidade de mais de uma rodada de votaccedilatildeo do TRS Este meacutetodo tambeacutem opera emmais de uma rodada poreacutem como o proacuteprio nome sugere essas rodadas satildeo instantacircneasnatildeo sendo necessaacuterio o retorno dos eleitores agraves urnas Atualmente ele eacute utilizado naIrlanda nas eleiccedilotildees presidenciais em Londres na eleiccedilatildeo de seu prefeito e em distritosindividuais na Austraacutelia para eleger membros de sua cacircmara baixa do parlamento OIRV tambeacutem eacute usado por vaacuterias organizaccedilotildees privadas nos Estados Unidos incluindoa American Political Science Association e a American Psychological Association paraeleger seus funcionaacuterios

                          Nesse sistema os eleitores natildeo satildeo solicitados a votar em um uacutenico candidato aoinveacutes disso eles listam todos os candidatos concorrentes na ordem de sua preferecircnciaA partir dessas listas as primeiras opccedilotildees de cada eleitor recebem o seu voto e apoacutes acontagem se um candidato obtiver 50 dos votos mais um este candidato eacute eleito Se

                          22

                          isso natildeo ocorrer o candidato menos votado eacute eliminado das eleiccedilotildees e seus votos satildeotransferidos para a segunda opccedilatildeo de cada um de seus eleitores Esse procedimento serepete eliminando o candidato menos votado a cada rodada ateacute que algum dos candidatospossuam a maioridade dos votos

                          231 Exemplo

                          Na tabela 3 pode-se verificar a distribuiccedilatildeo de votos por perfil de eleitor e na tabela4 vecirc-se o desenvolvimento do IRV para essas distribuiccedilotildees O candidato D eacute o menosvotado e por consequecircncia eacute o primeiro a ser eliminado A segunda opccedilatildeo de todos oseleitores que votaram no candidato D eacute o candidato C por isso este recebe todos os votosdistribuiacutedos na segunda rodada Com isso o candidato B eacute eliminado com 25 dos votos eos candidatos A e C concorrem na uacuteltima rodada Mesmo com o candidato C na lideranccedilana segunda rodada a maior parte dos eleitores do B tem como preferecircncia o candidatoA por isso A eacute eleito com 55 dos votos contra 45 do C

                          Tabela 3 ndash Exemplo IRV

                          Rankings Ndeg de eleitoresABCD 20ABDC 16BDAC 19BDCA 6CABD 7CDBA 15DCAB 5DCBA 12

                          Tabela 4 ndash Desenvolvimento do IRVTurnos D C B A

                          1 17 22 25 362 eliminado 39 25 363 eliminado 45 eliminado 55

                          232 Vantagens e Desvantagens do IRV

                          Assim como no TRS a pluralidade eacute irrelevante no IRV e um candidato soacute eacute eleitocom a maioridade dos votos dando maior legitimidade ao mandato deste No entantopode-se argumentar que o IRV faz isso com mais eficiecircncia pois natildeo requer a execuccedilatildeode mais de uma rodada de votaccedilotildees Isso diminui os custos das eleiccedilotildees como um todoao mesmo tempo que proporciona um nuacutemero menor de isenccedilotildees por parte dos eleitoresdevido ao desgaste de todo o processo eleitoral

                          23

                          Aleacutem disso candidatos de partidos menores tendem a receber mais votos do queno FPTP e portanto satildeo mais encorajados a se candidatar Com uma lista maior decandidatos eleitores desfrutam de uma variedade maior de opccedilotildees de voto Contudomesmo com mais candidatos menos populares o spoiler effect mencionado anteriormentetambeacutem natildeo possui espaccedilo nesse sistema de votaccedilatildeo Partidos menores natildeo tem comoroubar votos de partidos maiores visto que esses votos eventualmente seratildeo transferidosde volta a eles durante o desenvolvimento das rodadas do IRV

                          Em virtude de sua estrutura acredita-se que esse meacutetodo tende a encorajar os can-didatos tambeacutem a elaborar suas campanhas de forma mais abrangente ampliando suainfluecircncia para mais do que apenas um grupo especiacutefico de maneira que ele consiga agre-gar votos de segunda ou terceira opccedilatildeo aleacutem dos votos de seus eleitores principais

                          A principal desvantagem do IRV eacute o fato de ele ainda natildeo ser amplamente utilizado aoredor do mundo Essa falta de familiaridade do sistema pode causar confusatildeo ao eleitorcomum em suas primeiras ocorrecircncias No entanto nos paiacuteses em que este eacute utilizadonatildeo parece haver confusatildeo entre os eleitores Aleacutem disso na maioria dos casos haveraacute umcusto potencialmente alto da substituiccedilatildeo ou alteraccedilatildeo dos sistemas das urnas eletrocircnicaspara que seja possiacutevel haver a implementaccedilatildeo do meacutetodo

                          Aleacutem disso assim como o TRS este sistema tambeacutem possui natildeo-monotonicidade ouseja um candidato pode ser prejudicado ao ser ranqueado mais alto enquanto que outropode se beneficiar sendo ranqueado mais baixo pelos eleitores (ORNSTEIN 2018) issopode ocorrer quando esse ranqueamento causa alteraccedilotildees na ordem em que os candidatossatildeo eliminados Essa caracteriacutestica se manifesta em fenocircmenos complexos e especiacuteficos epor isso um exemplo de sua ocorrecircncia seraacute abordada em detalhes na seccedilatildeo 43

                          233 Voto Uacutetil no IRV

                          Como os sistemas de votaccedilatildeo anteriores o IRV natildeo eacute completamente imune ao vototaacutetico No entanto este meacutetodo se mostra bem resistente a eles quando comparado aoutros meacutetodos como o FPTP e o Borda Count (Bartholdi John J III and Orlin JamesB 1990) Distintivamente o IRV requer um maior esforccedilo do eleitor para elaborar umaestrateacutegia que melhor ajuste os resultados da eleiccedilatildeo de acordo com a sua preferecircnciaAleacutem disso eacute necessaacuterio que ele tenha informaccedilatildeo suficiente sobre os rankings de outroseleitores naturalmente obtida atraveacutes de pesquisas eleitorais

                          Existe tambeacutem a possibilidade de ocorrer uma exaustatildeo dos votos quando natildeo haacuteo completo preenchimento do ranking por parte dos eleitores Nessas ocasiotildees o votonatildeo pode continuar a ser transferido a outros candidatos e ele eacute descartado Isso afetaa legitimidade do mandato do candidato eleito pois o resultado final natildeo representaraacute100 da populaccedilatildeo votante Essas ocorrecircncias no entanto podem ser minimizadas comuma melhor educaccedilatildeo eleitoral ou como foi implementado na Austraacutelia requerer que osrankings incluam uma totalidade dos candidatos concorrentes

                          24

                          24 APPROVAL VOTING SYSTEM

                          No meacutetodo Approval Voting os eleitores natildeo satildeo limitados pelo nuacutemero de candidatosem que podem votar por isso approval cada eleitor pode votar em todos os candidatos osquais ele aprova Apoacutes as votaccedilotildees o candidato com a maior quantidade de votos eacute eleitoSegundo Hamlin (2015) a cidade de Fargo na Dakota do Norte se tornou a primeiracidade nos EUA a colocar em praacutetica este sistema em suas eleiccedilotildees gerais em novembrode 2018 AVS tambeacutem eacute utilizado para eleger o secretaacuterio-geral das Naccedilotildees Unidas e emdiversas outras organizaccedilotildees

                          241 Exemplo

                          Na tabela 5 abaixo pode-se encontrar 8 perfis de eleitores com seus candidatos apro-vados e quantidade de eleitores que se encaixam no perfil Na tabela 6 temos o resultadoda contabilizaccedilatildeo dos votos destes perfis O candidato mais popular eacute o B que se encontraaprovado em 5 perfis distintos totalizando 60 votos ou aproximadamente 32

                          Tabela 5 ndash Exemplo AVS

                          Aprovaccedilotildees Ndeg de eleitoresA 20AB 16B 19

                          BDC 6CAB 7CD 15DC 5DCB 12

                          Tabela 6 ndash Resultado AVSCandidatos Total de votos

                          A 43B 60C 45D 38

                          242 Vantagens e Desvantagens do AVS

                          Aleacutem de simples este meacutetodo permite um niacutevel maior de expressividade aos eleitoresOnde no FPTP e TRS eles satildeo limitados pelo seu uacutenico voto aqui os eleitores tecircm aliberdade de demonstrar exatamente quais candidatos consideram aptos ou aceitaacuteveis aocargo

                          25

                          Outro efeito dessa liberdade trazida pelo AVS eacute a dizimaccedilatildeo do spoiler effect Can-didatos de partidos menores natildeo tem como roubar votos de partidos maiores nessesistema ambos os candidatos contabilizariam o voto

                          243 Voto Uacutetil no AVS

                          O tipo de voto uacutetil no AVS eacute denominado bullet voting Segundo The Center forElection Science (2015) esta taacutetica envolve simplesmente ignorar a possibilidade de votarem mais de um candidato e votar apenas em sua primeira opccedilatildeo Um eleitor pode serlevado a adotar essa estrateacutegia quando percebe que sua preferecircncia pode ser prejudicadacom o voto em alguma segunda opccedilatildeo sua Em um cenaacuterio extremo onde 100 doseleitores adotam esta estrateacutegia as eleiccedilotildees satildeo convertidas a um simples First Past ThePost

                          25 THE BORDA COUNT

                          Este meacutetodo carrega o nome em homenagem a seu criador Jean-Charles de Bordaque o desenvolveu em 1770 (LIPPMAN 2012) A contagem de Borda utiliza a abordagemde ranqueamento dos candidatos poreacutem de maneira diferente ao IRV Este eacute um sistemaque atribui uma pontuaccedilatildeo aos candidatos com base nestes rankings O candidato na basedo ranking natildeo recebe pontos o candidato imediatamente acima deste recebe 1 pontoo proacuteximo recebe 2 pontos e assim por diante ateacute o topo do ranking As pontuaccedilotildees detodos os rankings satildeo contabilizadas e o candidato com maior pontuaccedilatildeo eacute eleito Deacordo com Lippman variaccedilotildees deste meacutetodo satildeo encontradas em uso na premiaccedilatildeo dediversos esportes como na seleccedilatildeo do MVP(Most Valuable Player) da MLB(principal ligade beisebol dos EUA) e no Trofeacuteu Heisman de futebol americano universitaacuterio

                          251 Exemplo

                          Neste exemplo seratildeo aproveitados os mesmos rankings apresentados na tabela 3 Porserem 4 candidatos o primeiro colocado de cada ranking receberaacute 3 pontos o segundo 2pontos o terceiro 1 e o quarto 0 Assim o nuacutemero maacuteximo de pontos que um candidatopode atingir eacute igual a 300(se ficar na primeira posiccedilatildeo em todos os rankings) e o nuacutemerototal de pontos no sistema eacute 600 O nuacutemero maacuteximo de pontos que um candidato podeatingir eacute calculado com

                          (cminus 1)times e

                          Sendo c igual ao nuacutemero de candidatos e e o nuacutemero de eleitores Por sua vez onuacutemero total de pontos no sistema eacute

                          26

                          (cminus 1)times c2

                          times e

                          A contagem final dos pontos eacute apresentada na tabela 7 abaixo

                          Tabela 7 ndash Resultado BCCandidatos Total de pontos

                          A 146B 181C 126D 147

                          O candidato eleito eacute o B com 181 pontos ou aproximadamente 60 da pontuaccedilatildeomaacutexima

                          252 Vantagens e Desvantagens do BC

                          Em comparaccedilatildeo com os meacutetodos abordados anteriormente que apenas consideramas primeiras opccedilotildees de cada eleitor este meacutetodo regularmente escolhe candidatos comaceitaccedilatildeo mais ampla ao inveacutes de uma preferecircncia direta dos eleitores (Electoral ReformSociety 2017b)

                          Ele tambeacutem encoraja uma abordagem estrateacutegica por parte dos partidos onde seriade seu interesse nomear mais de um candidato para concorrer pois quanto mais candi-datos estatildeo no paacutereo maior eacute a pontuaccedilatildeo dos primeiros colocados Logo a nomeaccedilatildeo decandidatos menos populares pode beneficiar os principais candidatos de um partido

                          253 Voto Uacutetil no BC

                          Existem duas estrateacutegias aplicaacuteveis a esse sistema A primeira denominada compromi-sing de maneira similar a outros meacutetodos de votaccedilatildeo se resume em ranquear em primeirolugar um dos candidatos que estejam liderando as eleiccedilotildees mesmo que este natildeo seja suapreferecircncia real A segunda estrateacutegia burying eacute o oposto esta se baseia em ranquearem uacuteltimo lugar um dos candidatos liacutederes mesmo que este natildeo seja o seu candidato demaior desgosto Ambas estrateacutegias podem ser aplicadas ao mesmo tempo por um eleitor

                          26 SCORE VOTING SYSTEM

                          Score Voting ou Range Voting como tambeacutem eacute conhecido eacute mais um meacutetodo quetenta trazer maior liberdade de expressatildeo aos eleitores Assim como o Borda Counteste sistema funciona baseado na pontuaccedilatildeo dos candidatos no entanto ao inveacutes dessapontuaccedilatildeo ser relativa agrave posiccedilatildeo do candidato no ranking de cada eleitor este por sua veztem completa liberdade de atribuir qualquer quantidade de pontos aos candidatos dentro

                          27

                          de determinada escala Um eleitor pode dar o mesmo nuacutemero de pontos para diferentescandidatos e apoacutes o somatoacuterio de todas as pontuaccedilotildees o candidato com a pontuaccedilatildeo maisalta eacute eleito Incorporado ao escopo poliacutetico o SVS eacute utilizado no Partido Pirata Alematildeobem como em diversas organizaccedilotildees tais como o Fedora Project e Mozilla e tambeacutem emvariados esportes oliacutempicos e reality shows como o American Idol aponta Hamlin (2015)

                          261 Exemplo

                          Neste exemplo temos apresentados na tabela 8 abaixo 4 perfis distintos de eleitorese suas respectivas atribuiccedilotildees de pontos aos 4 candidatos Cada eleitor pode atribuirqualquer pontuaccedilatildeo a um candidato dentro da escala de -10 a 10 O resultado da eleiccedilatildeoapoacutes a soma de todos os pontos por candidato se encontra na tabela 9 onde o candidatoA eacute eleito com um total de 605 pontos

                          Tabela 8 ndash Exemplo SVS

                          Perfil A B C D Ndeg de eleitores1 10 -1 5 2 362 6 9 -3 4 253 2 0 8 4 224 3 3 3 10 17

                          Tabela 9 ndash Resultado SVSCandidatos Total de pontos

                          A 605B 240C 332D 430

                          262 Vantagens e Desvantagens do SVS

                          A grande vantagem do SVS eacute como ele proporciona aos eleitores expressar de maneiramuito proacutexima potencialmente exata suas impressotildees poliacuteticas de cada candidato Eleeacute ainda mais expressivo que o AVS Dessa maneira o spoiler effect tambeacutem se torna nuloao passo que toda intenccedilatildeo de voto eacute precisamente representada neste sistema

                          Assim como outros meacutetodos eleitorais este sofre igualmente dos males produzidos pelovoto taacutetico Sua principal desvantagem eacute discutida na seccedilatildeo abaixo

                          263 Voto Uacutetil no SVS

                          Da mesma maneira que no Approval Voting atraveacutes do bullet voting o SVS tambeacutempode ser convertido em uma eleiccedilatildeo sob o meacutetodo FPTP em um cenaacuterio com um grande

                          28

                          volume de eleitores maliciosos O voto uacutetil sob este sistema se manifesta pontuando-seapenas um candidato com uma nota positiva e todos os outros com as notas mais baixasda escala Se todos os eleitores se aproveitarem dessa abordagem natildeo existiraacute distinccedilatildeoefetiva entre uma eleiccedilatildeo sob SVS e FPTP Essencialmente cada eleitor estaacute votando emapenas um candidato Essa eacute a principal desvantagem do SVS e ela consegue eliminarsua principal vantagem dar ao eleitor um poder maior de expressatildeo

                          27 BLOC VOTE

                          O Bloc Vote eacute um meacutetodo utilizado para a eleiccedilatildeo de candidatos a cargos no governocom mais de uma vacacircncia Pode ser considerado um meio-termo entre o FPTP e oAVS pois os eleitores podem votar em mais de um candidato poreacutem satildeo limitados pelonuacutemero de vagas Em uma eleiccedilatildeo com duas vagas por exemplo cada eleitor selecionaraacutedois candidatos ou menos Sensatamente o candidato mais votado eacute eleito Ele possuialgumas utilizaccedilotildees em eleiccedilotildees locais em algumas partes da Inglaterra (Electoral ReformSociety 2017a)

                          271 Exemplo

                          Neste exemplo dois candidatos seratildeo eleitos logo cada eleitor votaraacute em no maacuteximodois candidatos A distribuiccedilatildeo de votos pode ser conferida na tabela 10 e o resultado dacontagem de votos na tabela 11 abaixo Os candidatos eleitos satildeo o C totalizando 78do maacuteximo de votos possiacuteveis para um candidato e o A com 43

                          Tabela 10 ndash Exemplo BV

                          Aprovaccedilotildees Ndeg de eleitoresAC 20AB 16BC 19BD 6CA 7CD 15DC 17

                          Tabela 11 ndash Resultado BVCandidatos Total de votos

                          A 43B 41C 78D 38

                          29

                          272 Voto Uacutetil no BV

                          Neste sistema eacute possiacutevel que um eleitor evite votar em sua primeira opccedilatildeo quandoeste natildeo tem chances de vitoacuteria e se fazendo isto ele diminuiraacute as chances de algum outrocandidato de seu desgosto ganhar Poreacutem o sistema previne um outro tipo de voto uacutetilEm eleiccedilotildees com mais de uma vaga onde os eleitores soacute podem votar em um candidatose um eleitor sabe que sua primeira opccedilatildeo tambeacutem eacute a primeira opccedilatildeo da maior parteda populaccedilatildeo e portanto muito provavelmente seraacute um dos candidatos eleitos eacute possiacutevelque ele arrisque votar em uma segunda opccedilatildeo sua na esperanccedila de a longo prazo elegersuas duas principais opccedilotildees de voto Com os eleitores podendo votar no nuacutemero exato devagas disponiacuteveis esse tipo de pensamento taacutetico perde o sentido

                          30

                          3 O SIMULADOR

                          Para este trabalho foi implementado um simulador eleitoral na forma de uma aplicaccedilatildeoweb para que a interaccedilatildeo do usuaacuterio fosse facilitada Veremos a seguir como se daacute suautilizaccedilatildeo de forma geral

                          Figura 2 ndash Captura de tela 1

                          Figura 3 ndash Captura de tela 2

                          A primeira opccedilatildeo encontrada pelo usuaacuterio eacute a escolha de quais sistemas de votaccedilatildeo se-ratildeo simulados (Figura 2) Todos eles podem ser selecionados para rodar simultaneamentePoreacutem natildeo eacute permitido rodar uma simulaccedilatildeo do Bloc Vote para uma eleiccedilatildeo onde apenasum candidato eacute eleito aleacutem disso natildeo existe implementaccedilatildeo dos meacutetodos TRS e IRV para

                          31

                          eleiccedilotildees com mais de um candidato eleito jaacute que eles se comportariam exatamente comono FPTP

                          A maioria das linguagens de programaccedilatildeo senatildeo todas possuem um gerador de nuacuteme-ros pseudoaleatoacuterios que fornece a possibilidade de definir uma seed para o gerador Estaseed funciona como um ponto de partida para a geraccedilatildeo dos nuacutemero e portanto todasimulaccedilatildeo que rodar com a mesma seed sempre teraacute os mesmos resultados Se nenhumvalor for fornecido pelo usuaacuterio o tempo atual do sistema eacute utilizado As opccedilotildees subse-quentes satildeo a escolha do nuacutemero de eleitores gerados e o nuacutemero de vagas (Figura 3) Senenhum valor for fornecido o nuacutemero de eleitores padratildeo utilizado eacute 1000 e o nuacutemero devagas igual a 1

                          Figura 4 ndash Captura de tela 3

                          Este simulador possui dois modos para a criaccedilatildeo dos rankings dos eleitores No modoManipulate (Figura 4) primeiramente se define o nuacutemero de candidatos atraveacutes do campode entrada ao lado do tiacutetulo Candidates ou alternativamente pode-se adicionar candida-tos um a um atraveacutes do sinal de mais na parte inferior da paacutegina Para cada candidatoeacute possiacutevel definir a porcentagem de seus eleitores que optaraacute pelo voto taacutetico e pelovoto de minoria Tambeacutem eacute possiacutevel alterar o nome dos candidatos se for do interessedo usuaacuterio

                          32

                          Figura 5 ndash Captura de tela 4

                          Figura 6 ndash Captura de tela 5

                          33

                          Figura 7 ndash Captura de tela 6

                          Apoacutes a criaccedilatildeo dos candidatos o usuaacuterio pode criar perfis de eleitores que definiratildeo demaneira exata como partes da populaccedilatildeo iraacute votar (Figura 5) Em cada perfil se defineo valor em porcentos da populaccedilatildeo votante que o adotaraacute e a nota de cada candidatoTambeacutem eacute possiacutevel nomear cada perfil livremente

                          No modo Generate (Figura 6) eacute onde o gerador de nuacutemeros pseudoaleatoacuterios eacute usadoNesse modo ao inveacutes do usuaacuterio criar perfis de eleitores ele define qual seraacute a distribuiccedilatildeoadotada para a geraccedilatildeo de notas de cada candidato Essas distribuiccedilotildees seratildeo mais bemdetalhadas no Capiacutetulo 5 Da mesma maneira que no modo Manipulate nesse modotambeacutem eacute possiacutevel definir os valores para os dois tipos de voto uacutetil os votos taacuteticos eos votos de minoria No primeiro estatildeo incluiacutedas as estrateacutegias de mudanccedila de votoespeciacuteficas de cada sistema como o bullet voting no AVS e SVS ou quando a preferecircnciade um eleitor claramente natildeo possui chances de vitoacuteria e ele muda seu voto para um doscandidatos que esteja na lideranccedila o que ocorre no FPTP e TRS O voto de minoriase apresenta apenas no FPTP em eleiccedilotildees onde mais de um candidato eacute eleito Se apreferecircncia de um eleitor claramente lidera a eleiccedilatildeo por ser tambeacutem a preferecircncia damaior parte da populaccedilatildeo esse eleitor pode mudar o seu voto para uma segunda opccedilatildeona esperanccedila de eleger dois de seus candidatos favoritos

                          Por fim em ambos os modos o usuaacuterio tem a opccedilatildeo de definir coalizotildees entre oscandidatos se o sistema TRS estiver habilitado pois as coalizotildees apenas se manifestamnesse sistema Essas coalizotildees alteraratildeo as notas dos candidatos dependendo dos outroscandidatos pertencentes a elas (Figura 7)

                          A aplicaccedilatildeo pode ser encontrada na paacutegina httpelectionsimpythonanywherecom

                          34

                          4 CENAacuteRIOS PERTINENTES

                          Para todos os cenaacuterios deste capiacutetulo seraacute usada a seed do simulador igual a 100 e apopulaccedilatildeo de eleitores igual a 1000 para que exista consistecircncia na anaacutelise e tambeacutem paraque possa haver replicaccedilatildeo dos resultados se necessaacuterio

                          41 CENAacuteRIO 1 VOTO TAacuteTICO

                          Neste exemplo teremos quatro candidatos Ana Beto Carla e Diego Ana e Betoseratildeo gerados a partir da distribuiccedilatildeo Neutral (Figura 47) Carla da distribuiccedilatildeo Disliked(Figura 51) e Diego da Hated (Figura 55) Para a simulaccedilatildeo com a seed 100 o melhorcandidato a ser eleito ou seja aquele que maximiza a meacutedia das notas dos eleitores eacute oBeto com uma meacutedia de 0073 Para cada sistema seratildeo comparados os resultados semvoto taacutetico aos com 20 de voto taacutetico a favor da Ana Abaixo se encontram osresultados para o sistema FPTP

                          Figura 8 ndash FPTP - Cenaacuterio 1 sem voto taacutetico

                          Figura 9 ndash TRS segundo turno - Cenaacuterio 1 sem voto taacutetico

                          35

                          Figura 10 ndash IRV primeiro turno - Cenaacuterio 1

                          Figura 11 ndash IRV segundo turno - Cenaacuterio 1

                          Figura 12 ndash IRV terceiro turno - Cenaacuterio 1

                          36

                          Figura 13 ndash AVS - Cenaacuterio 1 sem voto taacutetico

                          Figura 14 ndash BC - Cenaacuterio 1 sem voto taacutetico

                          Figura 15 ndash SVS - Cenaacuterio 1 sem voto taacutetico

                          37

                          Nesse cenaacuterio sem voto taacutetico o uacutenico sistema que natildeo elege o Beto eacute o AVS Todosos outros elegem o melhor candidato Ou seja apesar de Beto ter uma melhor meacutediadas notas dos eleitores existem mais eleitores que ranqueiam Ana com uma nota acimade 0 No entanto apenas 20 dos eleitores de Diego e Carla que preferem a Ana aoinveacutes do Beto satildeo o suficiente para fazer Beto natildeo ser eleito se eles decidirem abandonarsua primeira opccedilatildeo e votar na Ana Considerando a vantagem que os votos taacuteticosproporcionam agrave Ana esta eacute eleita em todos os sistemas menos o TRS e o IRV

                          Figura 16 ndash FPTP - Cenaacuterio 1 - 20 de voto taacutetico na Ana

                          Figura 17 ndash TRS segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                          38

                          Figura 18 ndash IRV primeiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                          Figura 19 ndash IRV segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                          Figura 20 ndash IRV terceiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                          39

                          Figura 21 ndash AVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                          Figura 22 ndash BC - Cenaacuterio 1 20 de voto taacutetico na Ana

                          Figura 23 ndash SVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                          40

                          Eacute claro que se os eleitores que preferem o Beto tambeacutem votassem de maneira estra-teacutegica a situaccedilatildeo se equilibraria e haveria o mesmo niacutevel de concorrecircncia entre os doiscandidatos que ocorre quando natildeo haacute voto taacutetico Poreacutem no Borda Count esse equiliacute-brio pode natildeo acontecer e as estrateacutegias de compromising e burying podem acabar saindopela culatra se uma porcentagem elevada dos eleitores as adotarem Abaixo encontram-seos resultados para esse sistema quando 100 dos eleitores de Carla e Diego se comportammaliciosamente

                          Figura 24 ndash BC - Cenaacuterio 1 100 de voto taacutetico na Ana e Beto

                          Por causa do uso demasiado da estrateacutegia burying Ana e Beto perdem muitos pontose isso abre espaccedilo para uma vitoacuteria da Carla No entanto para porcentagens menores que100 o Beto ainda eacute o vencedor

                          Essas duas estrateacutegias tambeacutem foram implementadas nesse simulador para o sistemaIRV e eacute possiacutevel ver como ele eacute resistente a elas Para que seja possiacutevel mudar os resultadosde uma eleiccedilatildeo sob o IRV eacute necessaacuterio mudar a ordem de eliminaccedilatildeo dos candidatos paraque o seu candidato preferido acabe enfrentando um candidato mais fraco nas rodadasfinais Isso natildeo ocorre com compromising e burying No proacuteximo cenaacuterio seraacute analisadacomo eacute possiacutevel modificar os resultados de uma eleiccedilatildeo sob o IRV

                          Esses resultados podem ser replicados acessando os linksSem votos taacuteticos lthttpelectionsimpythonanywherecomdirect_res1111110

                          --[0021][22Ana2222Beto222022Carla2222Diego22]------100gt

                          Com 20 de voto taacutetico lthttpelectionsimpythonanywherecomdirect_res1111110--[0021][22Ana222022Beto2222Carla2222Diego22]1-[02000]---100gt

                          Com 100 de voto taacuteticona Ana e Beto lthttpelectionsimpythonanywherecomdirect_res0000100--[0021][22Ana222022Beto222022Carla2222Diego22]1-[101000]---100gt

                          41

                          42 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV

                          Neste cenaacuterio teremos Ana Carla e Beto concorrendo e trecircs perfis distintos que apoiamcada candidato As distribuiccedilotildees de notas dos perfis se encontram na tabela abaixo

                          Tabela 12 ndash Distribuiccedilatildeo de notas - Cenaacuterio 2

                          Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                          deeleitores

                          1 10 5 0 422 0 10 5 303 5 0 10 28

                          Com essas distribuiccedilotildees Carla eacute eliminada na primeira rodada e seus 28 de votossatildeo transferidos para a segunda opccedilatildeo de seus eleitores Ana que eacute eleita com 70 dosvotos e uma meacutedia de 56

                          Figura 25 ndash IRV primeiro turno - Cenaacuterio 2

                          Figura 26 ndash IRV segundo turno - Cenaacuterio 2

                          42

                          Cientes desse provaacutevel futuro cenaacuterio onde Ana eacute eleita uma pequena parte dos elei-tores de Beto estrategicamente o abandona e decide apoiar Carla na esperanccedila de leva-laao segundo turno contra Ana As novas distribuiccedilotildees de notas se encontram na tabelaabaixo com essa porccedilatildeo de eleitores representada pelo perfil 4

                          Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2

                          Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                          deeleitores

                          1 10 5 0 422 0 10 5 283 5 0 10 284 0 8 10 2

                          Essa mudanccedila estrateacutegica de voto altera a ordem de eliminaccedilotildees do sistema com Betosendo o primeiro a ser eliminado Com isso seus votos satildeo naturalmente transferidos paraCarla que derrota Ana no segundo turno com 58 dos votos

                          Figura 27 ndash IRV primeiro turno com voto taacutetico - Cenaacuterio 2

                          Figura 28 ndash IRV segundo turno com voto taacutetico - Cenaacuterio 2

                          43

                          Percebendo que a eleiccedilatildeo de Beto natildeo era provaacutevel seus eleitores conseguiram aomenos impedir a eleiccedilatildeo do pior candidato para eles Mas para isso foi necessaacuterio queeles tivessem a informaccedilatildeo de como os outros eleitores votariam Uma aproximaccedilatildeo dessasinformaccedilotildees poderia ser obtida em um cenaacuterio real com poucos candidatos atraveacutes depesquisas eleitorais poreacutem se o nuacutemero de candidatos eacute significativo uma noccedilatildeo completadas distribuiccedilotildees dos rankings dos eleitores se torna muito menos viaacutevel e dificulta aformulaccedilatildeo de estrateacutegias para alterar a ordem em que os candidatos satildeo eliminados

                          Esses resultados podem ser replicados acessando os linksSem voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana22

                          22Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                          Com voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana

                          2222Beto2222Carla22]-----42Voter20Profile2001020520028Voter20Profile2010201020528Voter20Profile202520020102Voter20Profile20302082010100gt

                          43 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE

                          O interessante dos sistemas IRV e TRS eacute que os resultados do cenaacuterio anterior po-deriam ter sido obtidos ao inveacutes do voto taacutetico pela sua natildeo-monotonicidade Seriapossiacutevel que a Carla derrotasse a Ana no segundo turno atraveacutes do proacuteprio aumento depopularidade da Ana Assumindo que essa popularizaccedilatildeo ocorresse entre os candidatosdo perfil 2 onde 3 passasse a apoiar a Ana ao inveacutes do Beto as novas distribuiccedilotildeesseguiriam a tabela abaixo

                          Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                          Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                          deeleitores

                          1 10 5 0 452 0 10 5 273 5 0 10 28

                          Dessa maneira Beto agora com uma porcentagem dos eleitores menor do que a deCarla seraacute eliminado na primeira rodada e como seus eleitores tecircm a Carla como segundaopccedilatildeo ela receberaacute todos os seus votos e seraacute eleita na segunda rodada As rodadas doIRV podem ser vistas nas figuras 29 e 30

                          44

                          Figura 29 ndash IRV primeiro turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                          Figura 30 ndash IRV segundo turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                          Tabela 15 ndash Resultados do Cenaacuterio 3Candidato

                          eleitoMeacutedia das

                          notasAntes da

                          popularizaccedilatildeode Ana

                          Ana 56

                          Apoacutespopularizaccedilatildeo

                          de AnaCarla 415

                          Os efeitos dessa caracteriacutestica se refletem na satisfaccedilatildeo meacutedia da populaccedilatildeo A Ana eacuteclaramente a melhor candidata e mesmo com o seu ganho de popularidade (ou devido aele) a Carla eacute eleita

                          Esses resultados podem ser replicados acessando os linksAntes da popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecom

                          direct_res0010000---[22Ana2222Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                          45

                          Apoacutes popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana2222Beto2222Carla22]-----45Voter20Profile2001020520027Voter20Profile2010201020528Voter20Profile20252002010100gt

                          44 CENAacuteRIO 4 COALIZOtildeES

                          O TRS por ser organizado em dois turnos separados normalmente a semanas dedistacircncia um do outro acaba abrindo brecha agrave mudanccedila de opiniatildeo por parte dos eleitorese o desenvolvimento de novas estrateacutegias por parte dos candidatos tais como a coalizatildeocom candidatos jaacute eliminados Com isso em mente nesse cenaacuterio teremos novamenteos quatro candidatos Ana Beto Carla e Diego Os trecircs primeiros seratildeo gerados dadistribuiccedilatildeo Neutral e Diego da distribuiccedilatildeo Disliked

                          Figura 31 ndash TRS turno 1 - Cenaacuterio 4

                          No TRS normal Ana Beto e Carla possuem com essas distribuiccedilotildees quantidades devotos muito proacuteximas com Beto e Carla indo para o segundo turno Carla estaacute 10 votosatraacutes de Beto e decide aproveitar o espaccedilo de tempo entre os dois turnos para tentaragregar mais votos Com isso Carla se aproxima de Diego e juntos formam uma coalizatildeoNo entanto com sua baixa popularidade Diego acaba ferindo a reputaccedilatildeo de Carla etorna o segundo turno muito mais faacutecil para Beto (Figura 33) Se Carla tivesse buscado osuporte de Ana por outro lado ela se veria vitoriosa no segundo turno e com uma amplavantagem sobre o Beto (Figura 34) Ou ateacute mesmo sem buscar uma coalizatildeo mesmosendo uma corrida apertada Carla teria naturalmente sido eleita (Figura 32)

                          Esses resultados podem ser replicados acessando os linksSem coalizotildees lthttpelectionsimpythonanywherecomdirect_res0100000

                          --[0002][22Ana222022Beto2222Carla2222Diego22]------100gt

                          46

                          Figura 32 ndash TRS turno 2 - Cenaacuterio 4

                          Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4

                          Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4

                          47

                          Coalizatildeo Carla e Diego lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2203Carla20Diego-100gt

                          Coalizatildeo Carla e Ana lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2200Carla20Ana-100gt

                          45 CENAacuteRIO 5 DILEMA DO PRISIONEIRO

                          Neste cenaacuterio temos uma eleiccedilatildeo de uma vaga com trecircs candidatos concorrentes e trecircsperfis distintos de eleitores que seguiratildeo as seguintes distribuiccedilotildees

                          Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5

                          Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                          deeleitores

                          1 10 -10 5 362 -10 10 5 343 -10 -10 5 30

                          Esse contexto nos remete ao notaacutevel dilema do prisioneiro Nele dois prisioneiroscuacutemplices satildeo interrogados individualmente sem poder se comunicar um com o outro ecada um enfrenta o dilema de delatar ou natildeo o seu parceiro Se os dois prisioneirosdecidem se manter calados sobre o crime ambos satildeo sentenciados a um ano de prisatildeo Seapenas um deles dedurar o outro o traidor sai livre enquanto seu parceiro eacute condenadoa trecircs anos Se ambos dedurarem um ao outro eles satildeo condenados juntos a dois anosde prisatildeo Esse dilema eacute uma ideia claacutessica presente no estudo da teoria dos jogos sendooriginalmente elaborada por Merrill Flood e Melvin Dresher em 1950 e mais tarde sendonomeada de dilema dos prisioneiros por Albert W Tucker (POUNDSTONE 1992)

                          O que esse dilema nos mostra eacute a tentaccedilatildeo que o indiviacuteduo deteacutem se sua racionalizaccedilatildeoestiver voltada para seus proacuteprios interesses e somente eles em oposiccedilatildeo a pensar no bemdo grupo como um todo Neste cenaacuterio encontramos dois grupos de eleitores expressiva-mente opostos os perfis 1 e 2 Se qualquer uma das preferecircncias desses perfis fosse eleitaisso significaria uma alta rejeiccedilatildeo de maior parte da populaccedilatildeo No entanto eles possuema segunda opccedilatildeo em comum a Carla que por sua vez eacute a preferecircncia do terceiro perfilPortanto a eleiccedilatildeo da Carla seria logicamente o resultado oacutetimo

                          Mesmo assim a Ana eacute eleita nos dois sistemas acima o que natildeo parece justo poispela tabela 16 eacute evidente que apenas 36 da populaccedilatildeo a aprova enquanto que os outros64 a reprovam ao maacuteximo O sistema IRV se comporta de maneira idecircntica ao TRS

                          48

                          Figura 35 ndash FPTP - Cenaacuterio 5

                          Figura 36 ndash TRS segundo turno - Cenaacuterio 5

                          nesta situaccedilatildeo Com esse resultado a meacutedia das notas eacute -28 No entanto os trecircs sistemasseguintes nos apresentam resultados diferentes

                          Tabela 17 ndash Resultados do Cenaacuterio 5

                          Sistema Candidatoeleito

                          Meacutedia dasnotas

                          FPTP Ana -28TRS Ana -28IRV Ana -28AVS Carla 50BC Carla 50SVS Carla 50

                          49

                          Figura 37 ndash AVS - Cenaacuterio 5

                          Figura 38 ndash BC - Cenaacuterio 5

                          Tanto o AVS quanto o Borda Count e o SVS satildeo sistemas que consideram todasas opiniotildees de cada eleitor ao mesmo tempo e por isso satildeo capazes de eleger o melhorcandidato nesta situaccedilatildeo diferentemente do TRS que natildeo absorve completamente todosentimento do eleitor por todos os candidatos e o IRV que apesar de ser bem expressivoquebra esse processo em inuacutemeras rodadas o que permite a perda de informaccedilatildeo ao longodelas

                          Esses resultados podem ser replicados acessando o linklthttpelectionsimpythonanywherecomdirect_res1111110---[22Ana

                          222022Beto222022Carla22]-----36Voter20Profile2001020-1020534Voter20Profile201-10201020530Voter20Profile202-1020-10205100gt

                          50

                          Figura 39 ndash SVS - Cenaacuterio 5

                          46 CENAacuteRIO 6 VOTO DE MINORIA

                          Neste cenaacuterio temos uma eleiccedilatildeo com quatro candidatos e duas vagas A Ana seraacutea preferecircncia de uma extensa parte da populaccedilatildeo (distribuiccedilatildeo Loved Figura 53) Betoe Carla seratildeo candidatos razoavelmente populares (distribuiccedilatildeo Neutral Figura 47) eDiego seraacute a preferecircncia de apenas um pequeno grupo especiacutefico e rejeitado pela maioria(distribuiccedilatildeo Disliked Figura 51) Eacute intuitivo esperar que os dois candidatos eleitos seratildeoa Ana e ou o Beto ou a Carla e isso eacute exatamente o que ocorre na figura 40 no sistemaFPTP sem voto de minoria

                          Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria

                          Eacute evidente a discrepacircncia da quantidade de votos da Ana para os outros candidatose apesar de Beto e Carla serem mais populares que Diego os trecircs natildeo se encontrammuito afastados Poreacutem se a pequena fraccedilatildeo de candidatos que possuem a Ana como

                          51

                          Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego

                          preferecircncia e Diego como segunda opccedilatildeo optarem pelo voto de minoria a situaccedilatildeo mudacompletamente (Figura 41) Assim apesar de extensamente rejeitado Diego conquistaa segunda vaga e a meacutedia das notas despenca de 2929 para 0505 No entanto aindaexiste um cenaacuterio pior Se os outros grupos de eleitores pensarem da mesma forma eevitarem votar na Ana achando que sua eleiccedilatildeo jaacute estaacute assegurada apenas 80 de votode minoria para esses grupos jaacute eacute o suficiente para eliminaacute-la das eleiccedilotildees (Figura 42)Com a Ana eliminada a meacutedia das notas cai ainda mais para 0058

                          Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego

                          O sistema Bloc Vote eacute uma das soluccedilotildees para o voto de minoria Permitindo queos eleitores votem no mesmo nuacutemero de candidatos que de vagas a serem preenchidasnatildeo existe o iacutempeto a esse tipo de voto estrateacutegico O resultado desse sistema portantoretorna a meacutedia das notas a casa dos 29 (Figura 43) Os sistemas AVS Borda Count eSVS tambeacutem impedem a presenccedila do voto de minoria e atingem resultados semelhantes

                          52

                          Figura 43 ndash BV - Cenaacuterio 6

                          Tabela 18 ndash Resultados do Cenaacuterio 6

                          Sistema Candidatoseleitos

                          Meacutedia dasnotas

                          FPTP sem voto de minoriaAna eBeto 2929

                          FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

                          FPTP com 80 de voto de minoriaBeto eCarla 0058

                          Bloc VoteAna eCarla 2913

                          Esses resultados podem ser replicados acessando os links

                          Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

                          100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

                          80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

                          53

                          5 COMO FUNCIONA O SIMULADOR

                          O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

                          51 CLASSE ELECTIONS

                          Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

                          bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

                          Figura 44 ndash estrutura candidates

                          bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

                          bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

                          Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

                          Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

                          54

                          Figura 45 ndash estrutura voters

                          Figura 46 ndash estrutura votes

                          daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

                          Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

                          55

                          Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

                          Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

                          na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

                          56

                          Figura 49 ndash PDF - Distribuiccedilatildeo Liked

                          Figura 50 ndash CDF - Distribuiccedilatildeo Liked

                          (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

                          Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

                          57

                          Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

                          Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

                          candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

                          Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

                          58

                          Figura 53 ndash PDF - Distribuiccedilatildeo Loved

                          Figura 54 ndash CDF - Distribuiccedilatildeo Loved

                          funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

                          59

                          Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                          Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                          Meacutedia das Notas sumei

                          sumvj nij

                          etimes v

                          Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                          Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                          60

                          Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                          Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                          52 CLASSE FIRSTPASTTHEPOST

                          Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                          Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                          61

                          Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                          Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                          mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                          62

                          53 CLASSE TWOROUNDSYSTEM

                          A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                          54 CLASSE INSTANTRUNOFFVOTING

                          A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                          Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                          63

                          cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                          55 CLASSE APPROVALVOTING

                          Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                          56 CLASSE BORDACOUNT

                          Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                          57 CLASSE SCOREVOTING

                          De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                          64

                          58 CLASSE BLOCVOTE

                          O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                          59 TECNOLOGIAS UTILIZADAS

                          A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                          Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                          O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                          Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                          65

                          6 CONCLUSAtildeO

                          Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                          Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                          Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                          Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                          Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                          66

                          REFEREcircNCIAS

                          AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                          Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                          Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                          Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                          HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                          LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                          ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                          Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                          POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                          The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                          67

                          APEcircNDICES

                          APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                          Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                          if(not len(selfvoter_profiles))

                          for voter in range(selfN_VOTERS)

                          candidates_rank = dict()

                          for candidate in reversed(range(selfN_CANDIDATES))

                          if(selfBIAS_VECTOR[candidate]==4)

                          candidates_rank[candidate] = self_sortear(selfloved)

                          elif(selfBIAS_VECTOR[candidate]==3)

                          candidates_rank[candidate] = self_sortear(selfliked)

                          elif(selfBIAS_VECTOR[candidate]==2)

                          candidates_rank[candidate] = self_sortear(selfdisliked)

                          elif(selfBIAS_VECTOR[candidate]==1)

                          candidates_rank[candidate] = self_sortear(selfhated)

                          elif(selfBIAS_VECTOR[candidate]==-1)

                          candidates_rank[candidate] = self_sortear(selfpolarizer

                          )

                          elif(selfBIAS_VECTOR[candidate]==-2)

                          candidates_rank[candidate] = self_sortear(self

                          more_polarizer)

                          else

                          candidates_rank[candidate] = self_sortear(selfneutral)

                          selfvotersappend(candidates_rank)

                          else

                          ranges = []

                          ranks = []

                          for prof in selfvoter_profiles

                          rangesappend(int(prof[pop_percentage]))

                          rank =

                          for index score in enumerate(prof[scores])

                          rank[index] = score

                          ranksappend(rank)

                          for index _range in enumerate(ranges)

                          for _ in range(int(selfN_VOTERS(_range100)))

                          selfvotersappend(ranks[index])

                          68

                          APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                          Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                          for i in range(selfN_CANDIDATES)

                          selfcandidates[i] = 0

                          selfvotes[i] = set()

                          APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                          Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                          for candidate in range(selfN_CANDIDATES)

                          rating_sum = 0

                          for voter in selfvoters

                          rating_sum += voter[candidate]

                          selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                          APEcircNDICE D ndash MEacuteTODO GET_MEAN

                          Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                          if len(winners) gt 1 or selfN_CANDIDATES gt 10

                          return selfcalculate_mean(winners)

                          else

                          chose_best = True if winners[0] == selfbest_candidate else

                          False

                          return selfstats[rsquomeansrsquo][winners[0]] chose_best

                          69

                          APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                          Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                          rating_sum = 0

                          for voter in selfvoters

                          for candidate in winners

                          rating_sum += voter[candidate]

                          return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                          APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                          Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                          for i in range(1 selfN_VACANCIES + 2)

                          selfleading_candidatesappend(selfsorted_candidates[-i][self

                          CANDIDATE_INDEX])

                          APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                          Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                          for leader in selfelecrounds[-1]

                          selfleading_candidatesappend(leader[0])

                          70

                          APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                          Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                          self_account_for_coalitions()

                          for voter in selfvoters

                          selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                          (1)))

                          temp = []

                          for voter in selfsorted_voters

                          new_dict = defaultdict(list)

                          for k in voter

                          new_dict[k[1]]append(k[0])

                          tempappend(new_dict)

                          selfsorted_voters = []

                          for voter_index current_voter in enumerate(temp)

                          new_voter = []

                          for rating candidate_indexes in current_voteritems()

                          if len(current_voter[rating]) gt 1

                          shuffle(current_voter[rating])

                          for e in candidate_indexes

                          new_voterappend((e rating))

                          else

                          new_voterappend((candidate_indexes[0] rating))

                          selfsorted_votersappend(new_voter)

                          selfcandidates[new_voter[-1][0]] += 1

                          selfvotes[new_voter[-1][0]]add(voter_index)

                          71

                          APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                          Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                          for candidate in selfvotes_copy

                          if candidate not in selfelecleading_candidates

                          for voter_index in selfvotes_copy[candidate]

                          for index _candidate in enumerate(reversed(selfelec

                          sorted_voters[voter_index]))

                          if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                          leading_candidates

                          if randomrandom() lt selfelec

                          tactical_vote_percentages[_candidate[selfelec

                          CANDIDATE_INDEX]]

                          selfrankings_changed[voter_index] = copy

                          deepcopy(selfelecsorted_voters[voter_index])

                          selfrankings_changed[voter_index][-(index + 1)]

                          selfrankings_changed[voter_index][-1] = self

                          rankings_changed[voter_index][-1] self

                          rankings_changed[voter_index][-(index + 1)]

                          selfcandidates[candidate] -= 1

                          selfcandidates[_candidate[selfelec

                          CANDIDATE_INDEX]] += 1

                          selfvotes[candidate]remove(voter_index)

                          selfvotes[_candidate[selfelecCANDIDATE_INDEX

                          ]]add(voter_index)

                          break

                          break

                          72

                          APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                          Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                          half_vacancies = mathfloor(selfelecN_VACANCIES2)

                          for candidate in selfelecleading_candidates

                          if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                          continue

                          for voter_index in selfvotes_copy[candidate]

                          if voter_index in selfrankings_changed

                          ranking = selfrankings_changed[voter_index]

                          else

                          ranking = copydeepcopy(selfelecsorted_voters[voter_index

                          ])

                          for index _candidate in enumerate(reversed(ranking))

                          if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                          leading_candidates or (_candidate[selfelec

                          CANDIDATE_INDEX] in selfelecleading_candidates and

                          selfelecleading_candidatesindex(_candidate[selfelec

                          CANDIDATE_INDEX]) gt= half_vacancies)

                          if _candidate[selfelecCANDIDATE_RANK] gt= 0

                          if randomrandom() lt selfelec

                          minority_vote_percentages[_candidate[selfelec

                          CANDIDATE_INDEX]]

                          selfcandidates[candidate] -= 1

                          selfcandidates[_candidate[selfelec

                          CANDIDATE_INDEX]] += 1

                          break

                          break

                          break

                          73

                          APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                          Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                          self_account_for_coalitions()

                          for candidate in selfvotes

                          if candidate = selfwinner and candidate = selfsecond_place

                          for voter_index in selfvotes[candidate]

                          if voter_index in selfrankings_changed

                          ranking = selfrankings_changed[voter_index]

                          else

                          ranking = copydeepcopy(selfelecsorted_voters[

                          voter_index])

                          for index2 candidate in enumerate(reversed(ranking))

                          if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                          selfcandidates[selfwinner] += 1

                          selfvotes[selfwinner]add(voter_index)

                          break

                          elif candidate[selfelecCANDIDATE_INDEX] == self

                          second_place

                          selfcandidates[selfsecond_place] += 1

                          selfvotes[selfsecond_place]add(voter_index)

                          break

                          selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                          winners = []

                          vacancies = selfelecN_VACANCIES

                          for candidate in reversed(selfsorted_candidates)

                          if vacancies == 0

                          break

                          winnersappend(candidate[0])

                          vacancies -= 1

                          mean chose_best = selfelecget_mean(winners = winners)

                          74

                          APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                          Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                          for voter_index voter in enumerate(selfelecsorted_voters)

                          voter_dict = dict()

                          og_voter_dict = dict()

                          for tup in voter

                          voter_dict[tup[0]] = tup[1]

                          og_voter_dict[tup[0]] = tup[1]

                          for coalition in selfeleccoalitions

                          for candidate in coalition

                          add_to_score = 0

                          for candidate2 in coalition

                          if candidate == candidate2

                          continue

                          half = og_voter_dict[candidate2[rsquovaluersquo]]2

                          if half lt 0

                          add_to_score += mathceil(half)

                          else

                          add_to_score += mathfloor(half)

                          if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                          voter_dict[candidate[rsquovaluersquo]] = 10

                          elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                          voter_dict[candidate[rsquovaluersquo]] = -10

                          else

                          voter_dict[candidate[rsquovaluersquo]] += add_to_score

                          selfrankings_changed[voter_index] = []

                          for candidate in voter_dict

                          selfrankings_changed[voter_index]append((candidate voter_dict[

                          candidate]))

                          selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                          voter_index] key=lambda x x[1])

                          75

                          APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                          Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                          selfelecroundsappend(selfsorted_candidates[_round])

                          if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                          N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                          N_VACANCIES - 1)

                          return 2

                          elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                          N_VOTERS gt 05)

                          return 1

                          else

                          selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                          CANDIDATE_INDEX])

                          for voter_index in selfvotes[selfsorted_candidates[_round][self

                          elecCANDIDATE_INDEX]]

                          if voter_index in selfrankings_changed

                          for candidate in reversed(selfrankings_changed[voter_index

                          ])

                          if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                          excluded

                          selfcandidates[candidate[selfelecCANDIDATE_INDEX

                          ]] += 1

                          selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                          add(voter_index)

                          break

                          else

                          continue

                          else

                          for candidate in reversed(selfelecsorted_voters[

                          voter_index])

                          if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                          excluded

                          selfcandidates[candidate[selfelecCANDIDATE_INDEX

                          ]] += 1

                          selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                          add(voter_index)

                          break

                          else

                          continue

                          selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                          return 0

                          76

                          APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                          Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                          for index in range(selfelecN_CANDIDATES)

                          selfcandidates[index] = 0

                          for voter in selfelecsorted_voters

                          for candidate in reversed(voter)

                          if candidate[selfelecCANDIDATE_SCORE] gt 0

                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                          else

                          break

                          APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                          Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                          for index in range(selfelecN_CANDIDATES)

                          selfcandidates[index] = 0

                          for voter in selfelecsorted_voters

                          if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                          elecCANDIDATE_INDEX]]

                          selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                          else

                          for candidate in reversed(voter)

                          if candidate[selfelecCANDIDATE_SCORE] gt 0

                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                          else

                          break

                          77

                          APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                          Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                          pos = set()

                          for index perc in enumerate(selfelectactical_vote_percentages)

                          if perc gt 0

                          posadd(index)

                          for candidate in selfeleccandidates

                          if candidate not in selfleading_candidates

                          for voter_index in selfvotes[candidate]

                          raised = None

                          for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                          ])

                          if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                          leading_candidates

                          if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                          if randomrandom() lt selfelectactical_vote_percentages[

                          candidate_tuple[selfelecCANDIDATE_INDEX]]

                          ranking = [None]selfelecN_CANDIDATES

                          ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                          selfelecvoters[voter_index][candidate_tuple[selfelec

                          CANDIDATE_INDEX]])

                          raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                          break

                          break

                          break

                          if raised = None

                          for _candidate in selfleading_candidates

                          if _candidate = ranking[-1][0]

                          ranking[0] = (_candidate selfelecvoters[voter_index][

                          _candidate])

                          buried = _candidate

                          break

                          i = 1

                          for candidate_tuple in selfelecsorted_voters[voter_index]

                          if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                          buried]

                          continue

                          else

                          ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                          selfelecvoters[voter_index][candidate_tuple[selfelec

                          CANDIDATE_INDEX]])

                          i += 1

                          selfrankings_changed[voter_index] = ranking

                          78

                          APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                          Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                          for voter_index in selfvotes[candidate]

                          if randomrandom() lt selfelectactical_vote_percentages[candidate

                          ]

                          for _candidate in selfleading_candidates

                          if _candidate = candidate

                          ranking = [None]selfelecN_CANDIDATES

                          ranking[0] = (_candidate selfelecvoters[voter_index][

                          _candidate])

                          buried = _candidate

                          break

                          i = 1

                          for candidate_tuple in selfelecsorted_voters[voter_index]

                          if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                          continue

                          else

                          ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                          selfelecvoters[voter_index][candidate_tuple[selfelec

                          CANDIDATE_INDEX]])

                          i += 1

                          selfrankings_changed[voter_index] = ranking

                          79

                          APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                          Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                          for index in range(selfelecN_CANDIDATES)

                          selfcandidates[index] = 0

                          for voter_index voter in enumerate(selfelecsorted_voters)

                          score = 0

                          if voter_index in selfrankings_changed

                          for candidate in selfrankings_changed[voter_index]

                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                          score += 1

                          else

                          for candidate in voter

                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                          score += 1

                          APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                          Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                          for voter_index voter in enumerate(selfelecsorted_voters)

                          if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                          elecCANDIDATE_INDEX]]

                          selfrankings_changed[voter_index] = copydeepcopy(selfelec

                          sorted_voters[voter_index])

                          for candidate_index candidate in enumerate(reversed(voter))

                          if candidate_index == 0

                          selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                          voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                          else

                          selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                          voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                          80

                          APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                          Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                          for index in range(selfelecN_CANDIDATES)

                          selfcandidates[index] = 0

                          for voter_index voter in enumerate(selfelecsorted_voters)

                          if voter_index in selfrankings_changed

                          for candidate in selfrankings_changed[voter_index]

                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                          selfelecCANDIDATE_RANK]

                          else

                          for candidate in voter

                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                          selfelecCANDIDATE_RANK]

                          APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                          Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                          for index in range(selfelecN_CANDIDATES)

                          selfcandidates[index] = 0

                          for voter in selfelecsorted_voters

                          votes = selfelecN_VACANCIES

                          for candidate in reversed(voter)

                          if votes == 0

                          break

                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                          votes -= 1

                          • Folha de aprovaccedilatildeo
                          • Agradecimentos
                          • Epiacutegrafe
                          • Resumo
                          • Abstract
                          • Lista de ilustraccedilotildees
                          • Lista de Coacutedigos
                          • Lista de tabelas
                          • Lista de abreviaturas e siglas
                          • Sumaacuterio
                          • INTRODUCcedilAtildeO
                            • MOTIVACcedilAtildeO E OBJETIVO
                            • MEacuteTODO
                            • ESTRUTURA
                              • SISTEMAS ELEITORAIS
                                • FISRT PAST THE POST
                                  • Exemplo
                                  • Vantagens e Desvantagens do FPTP
                                  • Voto Uacutetil no FPTP
                                    • TWO-ROUND SYSTEM
                                      • Exemplo
                                      • Vantagens e Desvantagens do TRS
                                      • Voto Uacutetil no TRS
                                        • INSTANT-RUNOFF VOTING
                                          • Exemplo
                                          • Vantagens e Desvantagens do IRV
                                          • Voto Uacutetil no IRV
                                            • APPROVAL VOTING SYSTEM
                                              • Exemplo
                                              • Vantagens e Desvantagens do AVS
                                              • Voto Uacutetil no AVS
                                                • THE BORDA COUNT
                                                  • Exemplo
                                                  • Vantagens e Desvantagens do BC
                                                  • Voto Uacutetil no BC
                                                    • SCORE VOTING SYSTEM
                                                      • Exemplo
                                                      • Vantagens e Desvantagens do SVS
                                                      • Voto Uacutetil no SVS
                                                        • BLOC VOTE
                                                          • Exemplo
                                                          • Voto Uacutetil no BV
                                                              • O SIMULADOR
                                                              • CENAacuteRIOS PERTINENTES
                                                                • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                • CENAacuteRIO 4 COALIZOtildeES
                                                                • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                • CENAacuteRIO 6 VOTO DE MINORIA
                                                                  • COMO FUNCIONA O SIMULADOR
                                                                    • CLASSE Elections
                                                                    • CLASSE FirstPastThePost
                                                                    • CLASSE TwoRoundSystem
                                                                    • CLASSE InstantRunoffVoting
                                                                    • CLASSE ApprovalVoting
                                                                    • CLASSE BordaCount
                                                                    • CLASSE ScoreVoting
                                                                    • CLASSE BlocVote
                                                                    • TECNOLOGIAS UTILIZADAS
                                                                      • CONCLUSAtildeO
                                                                      • Referecircncias
                                                                      • Meacutetodo create_voters
                                                                      • Meacutetodo create_candidates
                                                                      • Meacutetodo calculate_means
                                                                      • Meacutetodo get_mean
                                                                      • Meacutetodo calculate_mean
                                                                      • Meacutetodo set_leading_candidates
                                                                      • Meacutetodo irv_set_leading_candidates
                                                                      • Meacutetodo sort_ranks
                                                                      • Meacutetodo fptp_count_tactical_votes
                                                                      • Meacutetodo fptp_count_minority_votes
                                                                      • Meacutetodo trs_second_round
                                                                      • Meacutetodo trs_account_for_coalitions
                                                                      • Meacutetodo irv_count_votes
                                                                      • Meacutetodo avs_count_votes
                                                                      • Meacutetodo avs_count_votes_with_tactical
                                                                      • Meacutetodo irv_apply_tactical_votes
                                                                      • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                      • Meacutetodo bc_sum_candidates_scores
                                                                      • Meacutetodo svs_apply_tactical_votes
                                                                      • Meacutetodo svs_sum_candidates_scores
                                                                      • Meacutetodo bv_count_votes

                            APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND 73

                            APEcircNDICE L ndash MEacuteTODOTRS_ACCOUNT_FOR_COALITIONS 74

                            APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES 75

                            APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES 76

                            APEcircNDICE O ndash MEacuteTODOAVS_COUNT_VOTES_WITH_TACTICAL 76

                            APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES 77

                            APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES (CON-TINUACcedilAtildeO) 78

                            APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES 79

                            APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES 79

                            APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES 80

                            APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES 80

                            15

                            1 INTRODUCcedilAtildeO

                            Em toda eleiccedilatildeo existe pelo menos um grupo de indiviacuteduos que sai completamentedesfavorecido e insatisfeito com o resultado O contentamento completo de uma populaccedilatildeoeacute certamente improvaacutevel e muitas vezes impossiacutevel considerando a gama de candidatosque se dispotildee a concorrer Em todo caso o miacutenimo que pode ser feito eacute escolher demaneira eficiente o melhor candidato ao cargo dentre as opccedilotildees disponiacuteveis Diante dissoeacute necessaacuterio avaliar como essa escolha eacute feita e quais meacutetodos satildeo capazes de tornaacute-larealidade

                            11 MOTIVACcedilAtildeO E OBJETIVO

                            Em conformidade com o extenso nuacutemero de sistemas eleitorais pelo mundo este tra-balho tem como objetivo testar uma porccedilatildeo desses sistemas sob a simulaccedilatildeo de diferentescenaacuterios especiacuteficos a fim de determinar quais deles podem ser considerados como os maisjustos perante a taxa de satisfaccedilatildeo meacutedia da populaccedilatildeo

                            12 MEacuteTODO

                            Para que essa anaacutelise seja possiacutevel foi desenvolvido um programa que permite a criaccedilatildeoe configuraccedilatildeo de diferentes cenaacuterios onde os sistemas eleitorais seratildeo simulados Nele eacutepossiacutevel definir o nuacutemero total de eleitores e candidatos como esses eleitores iratildeo votar eo niacutevel de popularidade de cada candidato Aleacutem disso eacute possiacutevel formar coalizotildees entreos candidatos e escolher a porcentagem dos eleitores que optaratildeo pelo voto uacutetil Dessamaneira seraacute possiacutevel elaborar cenaacuterios que buscam expor os pontos fortes e fracos decada sistema

                            13 ESTRUTURA

                            Este trabalho eacute relatado ao longo de seis capiacutetulos No Capiacutetulo 2 seratildeo apresentados ossistemas eleitorais implementados no simulador suas vantagens e desvantagens conhecidase outras caracteriacutesticas especiacuteficas de cada um A intenccedilatildeo do capiacutetulo eacute tornar o textomais autocontido trazendo conceitos jaacute estudados que ajudaratildeo na melhor compreensatildeodos capiacutetulos seguintes por isso grande parte de sua composiccedilatildeo eacute oriunda de diferentesfontes consultadas

                            O Capiacutetulo 3 eacute uma apresentaccedilatildeo das funcionalidades que o simulador possui Seratildeoexplicados todos os campos de entrada e os dois modos distintos nos quais o programaopera

                            16

                            No Capiacutetulo 4 os sistemas seratildeo colocados em teste Todos seratildeo simulados em cenaacuteriosespeciacuteficos a fim de fazer sobressair aqueles com as maiores taxas de satisfaccedilatildeo meacutedia

                            A estrutura e implementaccedilatildeo do simulador seratildeo abordadas em detalhes no Capiacutetulo5 assim como uma breve descriccedilatildeo da stack utilizada Todos os meacutetodos relevantes aofuncionamento das simulaccedilotildees seratildeo explicados passo a passo

                            No Capiacutetulo 6 seratildeo apresentadas as conclusotildees referentes agrave anaacutelise dos resultadosobtidos no Capiacutetulo 4 e as consideraccedilotildees finais do projeto como um todo

                            17

                            2 SISTEMAS ELEITORAIS

                            Atualmente mais e mais paiacuteses estatildeo adotando sistemas democraacuteticos de governoCerca de 6 em 10 governos no mundo satildeo democracias (Pew Research Center 2017) o quepode ser observado na Figura 1 abaixo Em um sistema democraacutetico a populaccedilatildeo escolheseus liacutederes atraveacutes de seu sistema eleitoral Existem diversos sistemas eleitorais em usono mundo muitos dos quais satildeo usados em conjunto para eleger um uacutenico candidato Emvaacuterios paiacuteses mais de um sistema eleitoral pode ser utilizado tambeacutem em diferentes niacuteveisde governo tanto presidencial quanto estadual ou municipal Natildeo apenas imersos nomeio poliacutetico eles tambeacutem podem ser usados em escopos menores como em esportes oucompeticcedilotildees artiacutesticas poreacutem sempre com a finalidade de alocar um ou mais indiviacuteduosa determinado cargo ou tiacutetulo

                            Figura 1 ndash de paiacuteses de cada tipo de regime 1946-2016

                            Fonte Center of Systemic Peacersquos Polity IV Project

                            Os proacuteximos trecircs toacutepicos discutidos neste capiacutetulo referentes aos meacutetodos First Pastthe Post Two-Round System e Instant Runoff Voting possuem seus conceitos e infor-maccedilotildees relevantes com exceccedilatildeo dos exemplos traduzidos livremente do livro Behind theBallot Box A Citizenrsquos Guide to Voting Systems (AMY 2000)

                            21 FISRT PAST THE POST

                            O meacutetodo First Past the Post tambeacutem conhecido como Plurality Voting ou WinnerTakes All eacute o meacutetodo mais simples e direto e provavelmente o primeiro meacutetodo que sepensa quando se fala de eleiccedilotildees Os eleitores escolhem apenas um candidato e apoacutes a

                            18

                            contagem dos votos o candidato com o maior nuacutemero de votos eacute eleito O vencedor natildeonecessita da aprovaccedilatildeo de mais de 50 dos eleitores ele apenas precisa de uma pluralidadedos votos ou seja apenas possuir mais votos que os outros candidatos

                            Esse sistema eacute utilizado em escala nos Estados Unidos para a maior parte das eleiccedilotildeesvoltadas a eleger apenas um candidato como prefeitos e governadores aleacutem de ser usadana disputa presidencial Dentre outros paiacuteses que empregam o sistema em suas corridaspresidenciais estatildeo listados o Meacutexico as Filipinas a Coreia do Sul e a Venezuela

                            211 Exemplo

                            Tabela 1 ndash Exemplo FPTP

                            Candidatos VotosA 36B 25C 22D 17

                            Neste exemplo o candidato A possui uma pluralidade dos votos com 36 e ele eacute ocandidato eleito mesmo natildeo tendo uma maioria

                            212 Vantagens e Desvantagens do FPTP

                            A vantagem do FPTP eacute a sua simplicidade Natildeo eacute difiacutecil para um eleitor comumcompreender o seu funcionamento eles apenas precisam se decidir por um candidato Eletambeacutem eacute muito simples e direto na sua contagem e seleccedilatildeo do vencedor

                            Esse meacutetodo tambeacutem tende a criar listas de candidatos concorrentes mais curtasCandidatos independentes ou de partidos menores frequentemente acabam se sentindodesencorajados a concorrer devido agraves suas baixas chances de vitoacuteria Isso normalmentefornece aos eleitores uma faacutecil decisatildeo entre um ou dois candidatos dos maiores partidosao mesmo tempo poreacutem limitando suas opccedilotildees

                            No entanto sua essecircncia eacute sua principal desvantagem a pluralidade O fato do can-didato eleito natildeo necessitar de uma maioridade dos votos da populaccedilatildeo parece violaros princiacutepios baacutesicos da democracia Democracia eacute em sua origem o poder(kratos) nopovo(demos) poreacutem na pluralidade o poder de eleger um candidato pode residir emapenas uma fraccedilatildeo relativamente pequena do povo Em um cenaacuterio hipoteacutetico comapenas trecircs candidatos um deles apenas poderia necessitar de natildeo mais do que 34 dosvotos para ser eleito o que significa que no pior dos casos 66 da populaccedilatildeo rejeitao candidato eleito O cenaacuterio soacute piora com mais e mais candidatos concorrendo Paraquatro candidatos satildeo necessaacuterios 26 dos votos no pior dos casos para cinco satildeo 21 eassim por diante

                            19

                            213 Voto Uacutetil no FPTP

                            No FPTP tambeacutem existe a possibilidade de os eleitores evitarem votar em sua prefe-recircncia verdadeira No caso de sua preferecircncia natildeo aparentar ter boas chances de vitoacuteriamuitas vezes opta-se por uma segunda opccedilatildeo que esteja mais bem colocada nas eleiccedilotildeesO motivo disso eacute que nessas situaccedilotildees votar em sua preferecircncia pode parecer um des-perdiacutecio do seu voto e no pior dos cenaacuterios optar por natildeo transferir seu voto para umasegunda opccedilatildeo pode acabar resultando na eleiccedilatildeo de um candidato de seu desgosto As-sim votar de maneira verdadeira muitas vezes pode acabar prejudicando o eleitor que sevecirc forccedilado a abandonar seus interesses poliacuteticos mais imediatos e escolher o menor entredois(ou mais) males Os candidatos de partidos menores satildeo os que mais sofrem com essetipo de voto estrateacutegico por natildeo conseguirem agregar as maiores quantidades de votos

                            Entretanto ao mesmo tempo que partidos maiores roubam votos de partidos meno-res com os votos taacuteticos partidos menores tambeacutem tem a oportunidade de ganhar algunsvotos com o denominado spoiler effect Ao entrarem na eleiccedilatildeo candidatos de partidosmenores podem adquirir votos de candidatos mais populares que possuem inclinaccedilatildeo po-liacutetica semelhante Logo eacute possiacutevel que haja certo equiliacutebrio ao se contrapor as mudanccedilasde voto devido aos votos uacuteteis agraves mudanccedilas oriundas do spoiler effect

                            Poreacutem o spoiler effect natildeo necessariamente ocorre apenas entre partidos maiores emenores mas pode prejudicar candidatos de popularidades proacuteximas Por exemplo entretrecircs candidatos A B e C onde A representa determinada posiccedilatildeo no espectro poliacuteticoenquanto B e C possuem posiccedilotildees parecidas o que pode acontecer eacute B e C se prejudicaremmutuamente jaacute que ambos dividem os eleitores de um mesmo espectro poliacutetico Se esseespectro tem a maioria com 60 por exemplo com B e C compartilhando cada um 30dos votos o candidato A sairia vencedor com 40 mesmo que todos os eleitores de Bprefiram C e todos os eleitores de C prefiram B Esse exemplo demonstra claramente oproblema com os sistemas de pluralidade

                            22 TWO-ROUND SYSTEM

                            Uma das primeiras tentativas de lidar com a desvantagem dos sistemas por pluralidadeo Two-round System eacute usado desde o seacuteculo XIX no ocidente e atualmente ainda eacute utilizadoem corridas presidecircncias de paiacuteses como o Brasil Bulgaacuteria Chile Colocircmbia FinlacircndiaPolocircnia Portugal Ruacutessia e em inuacutemeras eleiccedilotildees locais nos Estados Unidos

                            O principal objetivo do TRS eacute garantir que o vencedor tenha conseguido uma maioriados votos Para isso as eleiccedilotildees satildeo estruturadas em duas rodadas de votaccedilatildeo Na primeirarodada os eleitores se dirigem agraves urnas e votam no candidato de sua preferecircncia Apoacutesa contagem se a quantidade de votos do candidato mais votado superar a proporccedilatildeo de50 natildeo haacute a necessidade de uma segunda rodada e este candidato eacute eleito No entantose este natildeo for o caso haveraacute uma segunda rodada com apenas os dois candidatos mais

                            20

                            votados Nesta rodada os eleitores retornam as urnas para escolher uma das duas opccedilotildeessendo eleito o candidato mais votado agora definitivamente com uma maioria dos votos

                            221 Exemplo

                            Utilizando a mesma distribuiccedilatildeo de votos descrita na tabela 1 Neste caso como ocandidato A natildeo possui uma maioria dos votos ele e o candidato B iratildeo concorrer em umsegundo turno Digamos que as distribuiccedilotildees dos votos dos eleitores dos candidatos C eD em relaccedilatildeo aos candidatos A e B satildeo as seguintes

                            Tabela 2 ndash 2deg turno do TRS

                            Candidatos Votos dos eleitoresde C

                            Votos dos eleitoresde D

                            Votos do 1degturno

                            A 7 5 36B 15 12 25

                            O candidato B agora eacute eleito com uma maioria dos votos 52 contra 48 do candidatoA

                            222 Vantagens e Desvantagens do TRS

                            Por ser parecido com o FPTP esse sistema tambeacutem eacute de faacutecil compreensatildeo do eleitorcomum poreacutem a maior vantagem do TRS eacute a garantia de que o candidato vencedor teraacute oapoio da maioria dos eleitores no segundo turno eliminando a pluralidade Argumenta-seque isso daacute maior legitimidade poliacutetica ao mandato do candidato eleito

                            O TRS tende a abrigar uma lista maior de candidatos sendo mais convidativo acandidatos de partidos menores mesmo que suas chances natildeo sejam maiores quandocomparadas agraves eleiccedilotildees sob o FPTP Mesmo assim essa listagem mais abrangente eacute umavantagem do sistema pois daacute aos eleitores uma variedade maior de opccedilotildees de voto

                            Em relaccedilatildeo agraves suas desvantagens o TRS possui duas principais A primeira satildeo oscustos elevados do sistema decorrentes da necessidade da organizaccedilatildeo de um segundoturno de votaccedilotildees A segunda eacute o aumento no iacutendice de ausecircncias dos eleitores agraves urnasEssa ampliaccedilatildeo no natildeo comparecimento dos eleitores se daacute tambeacutem devido ao segundoturno por pura fatiga eleitoral bem como consequecircncia da desistecircncia de eleitores queapoiam candidatos que jaacute foram eliminados

                            Outro ponto negativo do TRS eacute a sua natildeo-monotonicidade Isso significa que umcandidato pode ser prejudicado com um aumento em sua popularidade e suporte e domesmo modo um candidato pode se beneficiar com a perda de popularidade e suporteSe os candidatos A e B satildeo os esperados para ir ao segundo turno onde A eacute mais fortedo que B um aumento no suporte pelo candidato A pode resultar na sua derrota quandoesse aumento causa uma alteraccedilatildeo nos candidatos que satildeo selecionados para ir ao segundoturno Se esse aumento na popularidade de A resultar na eliminaccedilatildeo preacutevia de B um

                            21

                            terceiro candidato C pode ser vitorioso sobre A no segundo turno caso os eleitores de Bprefiram C ao candidato A Se natildeo houvesse esse crescimento de popularidade A teriaderrotado B no segundo turno Essa situaccedilatildeo seraacute vista em melhores detalhes na seccedilatildeo 43

                            223 Voto Uacutetil no TRS

                            Esse sistema minimiza os efeitos do voto uacutetil em relaccedilatildeo ao FPTP pois um eleitorqualquer pode tranquilamente votar em sua preferecircncia sem se preocupar em desperdiccedilaacute-lo mesmo que seu candidato natildeo tenha chances de vitoacuteria Se este natildeo for eleito aindapoderaacute escolher a sua preferecircncia dentre os dois candidatos que prosseguirem para osegundo turno

                            Apesar disso ainda existe um cenaacuterio em que o eleitor pode ser tentado a natildeo votar emsua preferecircncia Eacute possiacutevel que ele opte pela sua segunda opccedilatildeo se souber que sua primeiraopccedilatildeo possui miacutenimas chances de ir ao segundo turno ou ateacute mesmo por saber que issodiminuiraacute as chances de algum outro candidato ser eleito Mesmo assim eacute evidente queo TRS natildeo proporciona o mesmo apelo ao voto taacutetico que o FPTP

                            Outra caracteriacutestica do TRS eacute o incentivo a formaccedilatildeo de coalizotildees entre candidatosde partidos mais populares com candidatos de partidos menos populares As coalizotildeesfornecem benefiacutecios agrave ambas as partes onde os candidatos classificados para o segundoturno em geral se juntam a candidatos jaacute eliminados com a intenccedilatildeo de agregar maisvotos enquanto os candidatos jaacute eliminados apoiam um dos dois classificados na esperanccedilade inserir propostas proacuteprias ou modificaccedilotildees agrave chapa deles

                            23 INSTANT-RUNOFF VOTING

                            Instant Runoff Voting foi uma alternativa aos meacutetodos FPTP e TRS desenvolvidanos anos 70 por um professor do Instituto de Tecnologia de Massachusetts(MIT) O IRVelimina as principais desvantagens desses outros dois sistemas a pluralidade do FPTP e anecessidade de mais de uma rodada de votaccedilatildeo do TRS Este meacutetodo tambeacutem opera emmais de uma rodada poreacutem como o proacuteprio nome sugere essas rodadas satildeo instantacircneasnatildeo sendo necessaacuterio o retorno dos eleitores agraves urnas Atualmente ele eacute utilizado naIrlanda nas eleiccedilotildees presidenciais em Londres na eleiccedilatildeo de seu prefeito e em distritosindividuais na Austraacutelia para eleger membros de sua cacircmara baixa do parlamento OIRV tambeacutem eacute usado por vaacuterias organizaccedilotildees privadas nos Estados Unidos incluindoa American Political Science Association e a American Psychological Association paraeleger seus funcionaacuterios

                            Nesse sistema os eleitores natildeo satildeo solicitados a votar em um uacutenico candidato aoinveacutes disso eles listam todos os candidatos concorrentes na ordem de sua preferecircnciaA partir dessas listas as primeiras opccedilotildees de cada eleitor recebem o seu voto e apoacutes acontagem se um candidato obtiver 50 dos votos mais um este candidato eacute eleito Se

                            22

                            isso natildeo ocorrer o candidato menos votado eacute eliminado das eleiccedilotildees e seus votos satildeotransferidos para a segunda opccedilatildeo de cada um de seus eleitores Esse procedimento serepete eliminando o candidato menos votado a cada rodada ateacute que algum dos candidatospossuam a maioridade dos votos

                            231 Exemplo

                            Na tabela 3 pode-se verificar a distribuiccedilatildeo de votos por perfil de eleitor e na tabela4 vecirc-se o desenvolvimento do IRV para essas distribuiccedilotildees O candidato D eacute o menosvotado e por consequecircncia eacute o primeiro a ser eliminado A segunda opccedilatildeo de todos oseleitores que votaram no candidato D eacute o candidato C por isso este recebe todos os votosdistribuiacutedos na segunda rodada Com isso o candidato B eacute eliminado com 25 dos votos eos candidatos A e C concorrem na uacuteltima rodada Mesmo com o candidato C na lideranccedilana segunda rodada a maior parte dos eleitores do B tem como preferecircncia o candidatoA por isso A eacute eleito com 55 dos votos contra 45 do C

                            Tabela 3 ndash Exemplo IRV

                            Rankings Ndeg de eleitoresABCD 20ABDC 16BDAC 19BDCA 6CABD 7CDBA 15DCAB 5DCBA 12

                            Tabela 4 ndash Desenvolvimento do IRVTurnos D C B A

                            1 17 22 25 362 eliminado 39 25 363 eliminado 45 eliminado 55

                            232 Vantagens e Desvantagens do IRV

                            Assim como no TRS a pluralidade eacute irrelevante no IRV e um candidato soacute eacute eleitocom a maioridade dos votos dando maior legitimidade ao mandato deste No entantopode-se argumentar que o IRV faz isso com mais eficiecircncia pois natildeo requer a execuccedilatildeode mais de uma rodada de votaccedilotildees Isso diminui os custos das eleiccedilotildees como um todoao mesmo tempo que proporciona um nuacutemero menor de isenccedilotildees por parte dos eleitoresdevido ao desgaste de todo o processo eleitoral

                            23

                            Aleacutem disso candidatos de partidos menores tendem a receber mais votos do queno FPTP e portanto satildeo mais encorajados a se candidatar Com uma lista maior decandidatos eleitores desfrutam de uma variedade maior de opccedilotildees de voto Contudomesmo com mais candidatos menos populares o spoiler effect mencionado anteriormentetambeacutem natildeo possui espaccedilo nesse sistema de votaccedilatildeo Partidos menores natildeo tem comoroubar votos de partidos maiores visto que esses votos eventualmente seratildeo transferidosde volta a eles durante o desenvolvimento das rodadas do IRV

                            Em virtude de sua estrutura acredita-se que esse meacutetodo tende a encorajar os can-didatos tambeacutem a elaborar suas campanhas de forma mais abrangente ampliando suainfluecircncia para mais do que apenas um grupo especiacutefico de maneira que ele consiga agre-gar votos de segunda ou terceira opccedilatildeo aleacutem dos votos de seus eleitores principais

                            A principal desvantagem do IRV eacute o fato de ele ainda natildeo ser amplamente utilizado aoredor do mundo Essa falta de familiaridade do sistema pode causar confusatildeo ao eleitorcomum em suas primeiras ocorrecircncias No entanto nos paiacuteses em que este eacute utilizadonatildeo parece haver confusatildeo entre os eleitores Aleacutem disso na maioria dos casos haveraacute umcusto potencialmente alto da substituiccedilatildeo ou alteraccedilatildeo dos sistemas das urnas eletrocircnicaspara que seja possiacutevel haver a implementaccedilatildeo do meacutetodo

                            Aleacutem disso assim como o TRS este sistema tambeacutem possui natildeo-monotonicidade ouseja um candidato pode ser prejudicado ao ser ranqueado mais alto enquanto que outropode se beneficiar sendo ranqueado mais baixo pelos eleitores (ORNSTEIN 2018) issopode ocorrer quando esse ranqueamento causa alteraccedilotildees na ordem em que os candidatossatildeo eliminados Essa caracteriacutestica se manifesta em fenocircmenos complexos e especiacuteficos epor isso um exemplo de sua ocorrecircncia seraacute abordada em detalhes na seccedilatildeo 43

                            233 Voto Uacutetil no IRV

                            Como os sistemas de votaccedilatildeo anteriores o IRV natildeo eacute completamente imune ao vototaacutetico No entanto este meacutetodo se mostra bem resistente a eles quando comparado aoutros meacutetodos como o FPTP e o Borda Count (Bartholdi John J III and Orlin JamesB 1990) Distintivamente o IRV requer um maior esforccedilo do eleitor para elaborar umaestrateacutegia que melhor ajuste os resultados da eleiccedilatildeo de acordo com a sua preferecircnciaAleacutem disso eacute necessaacuterio que ele tenha informaccedilatildeo suficiente sobre os rankings de outroseleitores naturalmente obtida atraveacutes de pesquisas eleitorais

                            Existe tambeacutem a possibilidade de ocorrer uma exaustatildeo dos votos quando natildeo haacuteo completo preenchimento do ranking por parte dos eleitores Nessas ocasiotildees o votonatildeo pode continuar a ser transferido a outros candidatos e ele eacute descartado Isso afetaa legitimidade do mandato do candidato eleito pois o resultado final natildeo representaraacute100 da populaccedilatildeo votante Essas ocorrecircncias no entanto podem ser minimizadas comuma melhor educaccedilatildeo eleitoral ou como foi implementado na Austraacutelia requerer que osrankings incluam uma totalidade dos candidatos concorrentes

                            24

                            24 APPROVAL VOTING SYSTEM

                            No meacutetodo Approval Voting os eleitores natildeo satildeo limitados pelo nuacutemero de candidatosem que podem votar por isso approval cada eleitor pode votar em todos os candidatos osquais ele aprova Apoacutes as votaccedilotildees o candidato com a maior quantidade de votos eacute eleitoSegundo Hamlin (2015) a cidade de Fargo na Dakota do Norte se tornou a primeiracidade nos EUA a colocar em praacutetica este sistema em suas eleiccedilotildees gerais em novembrode 2018 AVS tambeacutem eacute utilizado para eleger o secretaacuterio-geral das Naccedilotildees Unidas e emdiversas outras organizaccedilotildees

                            241 Exemplo

                            Na tabela 5 abaixo pode-se encontrar 8 perfis de eleitores com seus candidatos apro-vados e quantidade de eleitores que se encaixam no perfil Na tabela 6 temos o resultadoda contabilizaccedilatildeo dos votos destes perfis O candidato mais popular eacute o B que se encontraaprovado em 5 perfis distintos totalizando 60 votos ou aproximadamente 32

                            Tabela 5 ndash Exemplo AVS

                            Aprovaccedilotildees Ndeg de eleitoresA 20AB 16B 19

                            BDC 6CAB 7CD 15DC 5DCB 12

                            Tabela 6 ndash Resultado AVSCandidatos Total de votos

                            A 43B 60C 45D 38

                            242 Vantagens e Desvantagens do AVS

                            Aleacutem de simples este meacutetodo permite um niacutevel maior de expressividade aos eleitoresOnde no FPTP e TRS eles satildeo limitados pelo seu uacutenico voto aqui os eleitores tecircm aliberdade de demonstrar exatamente quais candidatos consideram aptos ou aceitaacuteveis aocargo

                            25

                            Outro efeito dessa liberdade trazida pelo AVS eacute a dizimaccedilatildeo do spoiler effect Can-didatos de partidos menores natildeo tem como roubar votos de partidos maiores nessesistema ambos os candidatos contabilizariam o voto

                            243 Voto Uacutetil no AVS

                            O tipo de voto uacutetil no AVS eacute denominado bullet voting Segundo The Center forElection Science (2015) esta taacutetica envolve simplesmente ignorar a possibilidade de votarem mais de um candidato e votar apenas em sua primeira opccedilatildeo Um eleitor pode serlevado a adotar essa estrateacutegia quando percebe que sua preferecircncia pode ser prejudicadacom o voto em alguma segunda opccedilatildeo sua Em um cenaacuterio extremo onde 100 doseleitores adotam esta estrateacutegia as eleiccedilotildees satildeo convertidas a um simples First Past ThePost

                            25 THE BORDA COUNT

                            Este meacutetodo carrega o nome em homenagem a seu criador Jean-Charles de Bordaque o desenvolveu em 1770 (LIPPMAN 2012) A contagem de Borda utiliza a abordagemde ranqueamento dos candidatos poreacutem de maneira diferente ao IRV Este eacute um sistemaque atribui uma pontuaccedilatildeo aos candidatos com base nestes rankings O candidato na basedo ranking natildeo recebe pontos o candidato imediatamente acima deste recebe 1 pontoo proacuteximo recebe 2 pontos e assim por diante ateacute o topo do ranking As pontuaccedilotildees detodos os rankings satildeo contabilizadas e o candidato com maior pontuaccedilatildeo eacute eleito Deacordo com Lippman variaccedilotildees deste meacutetodo satildeo encontradas em uso na premiaccedilatildeo dediversos esportes como na seleccedilatildeo do MVP(Most Valuable Player) da MLB(principal ligade beisebol dos EUA) e no Trofeacuteu Heisman de futebol americano universitaacuterio

                            251 Exemplo

                            Neste exemplo seratildeo aproveitados os mesmos rankings apresentados na tabela 3 Porserem 4 candidatos o primeiro colocado de cada ranking receberaacute 3 pontos o segundo 2pontos o terceiro 1 e o quarto 0 Assim o nuacutemero maacuteximo de pontos que um candidatopode atingir eacute igual a 300(se ficar na primeira posiccedilatildeo em todos os rankings) e o nuacutemerototal de pontos no sistema eacute 600 O nuacutemero maacuteximo de pontos que um candidato podeatingir eacute calculado com

                            (cminus 1)times e

                            Sendo c igual ao nuacutemero de candidatos e e o nuacutemero de eleitores Por sua vez onuacutemero total de pontos no sistema eacute

                            26

                            (cminus 1)times c2

                            times e

                            A contagem final dos pontos eacute apresentada na tabela 7 abaixo

                            Tabela 7 ndash Resultado BCCandidatos Total de pontos

                            A 146B 181C 126D 147

                            O candidato eleito eacute o B com 181 pontos ou aproximadamente 60 da pontuaccedilatildeomaacutexima

                            252 Vantagens e Desvantagens do BC

                            Em comparaccedilatildeo com os meacutetodos abordados anteriormente que apenas consideramas primeiras opccedilotildees de cada eleitor este meacutetodo regularmente escolhe candidatos comaceitaccedilatildeo mais ampla ao inveacutes de uma preferecircncia direta dos eleitores (Electoral ReformSociety 2017b)

                            Ele tambeacutem encoraja uma abordagem estrateacutegica por parte dos partidos onde seriade seu interesse nomear mais de um candidato para concorrer pois quanto mais candi-datos estatildeo no paacutereo maior eacute a pontuaccedilatildeo dos primeiros colocados Logo a nomeaccedilatildeo decandidatos menos populares pode beneficiar os principais candidatos de um partido

                            253 Voto Uacutetil no BC

                            Existem duas estrateacutegias aplicaacuteveis a esse sistema A primeira denominada compromi-sing de maneira similar a outros meacutetodos de votaccedilatildeo se resume em ranquear em primeirolugar um dos candidatos que estejam liderando as eleiccedilotildees mesmo que este natildeo seja suapreferecircncia real A segunda estrateacutegia burying eacute o oposto esta se baseia em ranquearem uacuteltimo lugar um dos candidatos liacutederes mesmo que este natildeo seja o seu candidato demaior desgosto Ambas estrateacutegias podem ser aplicadas ao mesmo tempo por um eleitor

                            26 SCORE VOTING SYSTEM

                            Score Voting ou Range Voting como tambeacutem eacute conhecido eacute mais um meacutetodo quetenta trazer maior liberdade de expressatildeo aos eleitores Assim como o Borda Counteste sistema funciona baseado na pontuaccedilatildeo dos candidatos no entanto ao inveacutes dessapontuaccedilatildeo ser relativa agrave posiccedilatildeo do candidato no ranking de cada eleitor este por sua veztem completa liberdade de atribuir qualquer quantidade de pontos aos candidatos dentro

                            27

                            de determinada escala Um eleitor pode dar o mesmo nuacutemero de pontos para diferentescandidatos e apoacutes o somatoacuterio de todas as pontuaccedilotildees o candidato com a pontuaccedilatildeo maisalta eacute eleito Incorporado ao escopo poliacutetico o SVS eacute utilizado no Partido Pirata Alematildeobem como em diversas organizaccedilotildees tais como o Fedora Project e Mozilla e tambeacutem emvariados esportes oliacutempicos e reality shows como o American Idol aponta Hamlin (2015)

                            261 Exemplo

                            Neste exemplo temos apresentados na tabela 8 abaixo 4 perfis distintos de eleitorese suas respectivas atribuiccedilotildees de pontos aos 4 candidatos Cada eleitor pode atribuirqualquer pontuaccedilatildeo a um candidato dentro da escala de -10 a 10 O resultado da eleiccedilatildeoapoacutes a soma de todos os pontos por candidato se encontra na tabela 9 onde o candidatoA eacute eleito com um total de 605 pontos

                            Tabela 8 ndash Exemplo SVS

                            Perfil A B C D Ndeg de eleitores1 10 -1 5 2 362 6 9 -3 4 253 2 0 8 4 224 3 3 3 10 17

                            Tabela 9 ndash Resultado SVSCandidatos Total de pontos

                            A 605B 240C 332D 430

                            262 Vantagens e Desvantagens do SVS

                            A grande vantagem do SVS eacute como ele proporciona aos eleitores expressar de maneiramuito proacutexima potencialmente exata suas impressotildees poliacuteticas de cada candidato Eleeacute ainda mais expressivo que o AVS Dessa maneira o spoiler effect tambeacutem se torna nuloao passo que toda intenccedilatildeo de voto eacute precisamente representada neste sistema

                            Assim como outros meacutetodos eleitorais este sofre igualmente dos males produzidos pelovoto taacutetico Sua principal desvantagem eacute discutida na seccedilatildeo abaixo

                            263 Voto Uacutetil no SVS

                            Da mesma maneira que no Approval Voting atraveacutes do bullet voting o SVS tambeacutempode ser convertido em uma eleiccedilatildeo sob o meacutetodo FPTP em um cenaacuterio com um grande

                            28

                            volume de eleitores maliciosos O voto uacutetil sob este sistema se manifesta pontuando-seapenas um candidato com uma nota positiva e todos os outros com as notas mais baixasda escala Se todos os eleitores se aproveitarem dessa abordagem natildeo existiraacute distinccedilatildeoefetiva entre uma eleiccedilatildeo sob SVS e FPTP Essencialmente cada eleitor estaacute votando emapenas um candidato Essa eacute a principal desvantagem do SVS e ela consegue eliminarsua principal vantagem dar ao eleitor um poder maior de expressatildeo

                            27 BLOC VOTE

                            O Bloc Vote eacute um meacutetodo utilizado para a eleiccedilatildeo de candidatos a cargos no governocom mais de uma vacacircncia Pode ser considerado um meio-termo entre o FPTP e oAVS pois os eleitores podem votar em mais de um candidato poreacutem satildeo limitados pelonuacutemero de vagas Em uma eleiccedilatildeo com duas vagas por exemplo cada eleitor selecionaraacutedois candidatos ou menos Sensatamente o candidato mais votado eacute eleito Ele possuialgumas utilizaccedilotildees em eleiccedilotildees locais em algumas partes da Inglaterra (Electoral ReformSociety 2017a)

                            271 Exemplo

                            Neste exemplo dois candidatos seratildeo eleitos logo cada eleitor votaraacute em no maacuteximodois candidatos A distribuiccedilatildeo de votos pode ser conferida na tabela 10 e o resultado dacontagem de votos na tabela 11 abaixo Os candidatos eleitos satildeo o C totalizando 78do maacuteximo de votos possiacuteveis para um candidato e o A com 43

                            Tabela 10 ndash Exemplo BV

                            Aprovaccedilotildees Ndeg de eleitoresAC 20AB 16BC 19BD 6CA 7CD 15DC 17

                            Tabela 11 ndash Resultado BVCandidatos Total de votos

                            A 43B 41C 78D 38

                            29

                            272 Voto Uacutetil no BV

                            Neste sistema eacute possiacutevel que um eleitor evite votar em sua primeira opccedilatildeo quandoeste natildeo tem chances de vitoacuteria e se fazendo isto ele diminuiraacute as chances de algum outrocandidato de seu desgosto ganhar Poreacutem o sistema previne um outro tipo de voto uacutetilEm eleiccedilotildees com mais de uma vaga onde os eleitores soacute podem votar em um candidatose um eleitor sabe que sua primeira opccedilatildeo tambeacutem eacute a primeira opccedilatildeo da maior parteda populaccedilatildeo e portanto muito provavelmente seraacute um dos candidatos eleitos eacute possiacutevelque ele arrisque votar em uma segunda opccedilatildeo sua na esperanccedila de a longo prazo elegersuas duas principais opccedilotildees de voto Com os eleitores podendo votar no nuacutemero exato devagas disponiacuteveis esse tipo de pensamento taacutetico perde o sentido

                            30

                            3 O SIMULADOR

                            Para este trabalho foi implementado um simulador eleitoral na forma de uma aplicaccedilatildeoweb para que a interaccedilatildeo do usuaacuterio fosse facilitada Veremos a seguir como se daacute suautilizaccedilatildeo de forma geral

                            Figura 2 ndash Captura de tela 1

                            Figura 3 ndash Captura de tela 2

                            A primeira opccedilatildeo encontrada pelo usuaacuterio eacute a escolha de quais sistemas de votaccedilatildeo se-ratildeo simulados (Figura 2) Todos eles podem ser selecionados para rodar simultaneamentePoreacutem natildeo eacute permitido rodar uma simulaccedilatildeo do Bloc Vote para uma eleiccedilatildeo onde apenasum candidato eacute eleito aleacutem disso natildeo existe implementaccedilatildeo dos meacutetodos TRS e IRV para

                            31

                            eleiccedilotildees com mais de um candidato eleito jaacute que eles se comportariam exatamente comono FPTP

                            A maioria das linguagens de programaccedilatildeo senatildeo todas possuem um gerador de nuacuteme-ros pseudoaleatoacuterios que fornece a possibilidade de definir uma seed para o gerador Estaseed funciona como um ponto de partida para a geraccedilatildeo dos nuacutemero e portanto todasimulaccedilatildeo que rodar com a mesma seed sempre teraacute os mesmos resultados Se nenhumvalor for fornecido pelo usuaacuterio o tempo atual do sistema eacute utilizado As opccedilotildees subse-quentes satildeo a escolha do nuacutemero de eleitores gerados e o nuacutemero de vagas (Figura 3) Senenhum valor for fornecido o nuacutemero de eleitores padratildeo utilizado eacute 1000 e o nuacutemero devagas igual a 1

                            Figura 4 ndash Captura de tela 3

                            Este simulador possui dois modos para a criaccedilatildeo dos rankings dos eleitores No modoManipulate (Figura 4) primeiramente se define o nuacutemero de candidatos atraveacutes do campode entrada ao lado do tiacutetulo Candidates ou alternativamente pode-se adicionar candida-tos um a um atraveacutes do sinal de mais na parte inferior da paacutegina Para cada candidatoeacute possiacutevel definir a porcentagem de seus eleitores que optaraacute pelo voto taacutetico e pelovoto de minoria Tambeacutem eacute possiacutevel alterar o nome dos candidatos se for do interessedo usuaacuterio

                            32

                            Figura 5 ndash Captura de tela 4

                            Figura 6 ndash Captura de tela 5

                            33

                            Figura 7 ndash Captura de tela 6

                            Apoacutes a criaccedilatildeo dos candidatos o usuaacuterio pode criar perfis de eleitores que definiratildeo demaneira exata como partes da populaccedilatildeo iraacute votar (Figura 5) Em cada perfil se defineo valor em porcentos da populaccedilatildeo votante que o adotaraacute e a nota de cada candidatoTambeacutem eacute possiacutevel nomear cada perfil livremente

                            No modo Generate (Figura 6) eacute onde o gerador de nuacutemeros pseudoaleatoacuterios eacute usadoNesse modo ao inveacutes do usuaacuterio criar perfis de eleitores ele define qual seraacute a distribuiccedilatildeoadotada para a geraccedilatildeo de notas de cada candidato Essas distribuiccedilotildees seratildeo mais bemdetalhadas no Capiacutetulo 5 Da mesma maneira que no modo Manipulate nesse modotambeacutem eacute possiacutevel definir os valores para os dois tipos de voto uacutetil os votos taacuteticos eos votos de minoria No primeiro estatildeo incluiacutedas as estrateacutegias de mudanccedila de votoespeciacuteficas de cada sistema como o bullet voting no AVS e SVS ou quando a preferecircnciade um eleitor claramente natildeo possui chances de vitoacuteria e ele muda seu voto para um doscandidatos que esteja na lideranccedila o que ocorre no FPTP e TRS O voto de minoriase apresenta apenas no FPTP em eleiccedilotildees onde mais de um candidato eacute eleito Se apreferecircncia de um eleitor claramente lidera a eleiccedilatildeo por ser tambeacutem a preferecircncia damaior parte da populaccedilatildeo esse eleitor pode mudar o seu voto para uma segunda opccedilatildeona esperanccedila de eleger dois de seus candidatos favoritos

                            Por fim em ambos os modos o usuaacuterio tem a opccedilatildeo de definir coalizotildees entre oscandidatos se o sistema TRS estiver habilitado pois as coalizotildees apenas se manifestamnesse sistema Essas coalizotildees alteraratildeo as notas dos candidatos dependendo dos outroscandidatos pertencentes a elas (Figura 7)

                            A aplicaccedilatildeo pode ser encontrada na paacutegina httpelectionsimpythonanywherecom

                            34

                            4 CENAacuteRIOS PERTINENTES

                            Para todos os cenaacuterios deste capiacutetulo seraacute usada a seed do simulador igual a 100 e apopulaccedilatildeo de eleitores igual a 1000 para que exista consistecircncia na anaacutelise e tambeacutem paraque possa haver replicaccedilatildeo dos resultados se necessaacuterio

                            41 CENAacuteRIO 1 VOTO TAacuteTICO

                            Neste exemplo teremos quatro candidatos Ana Beto Carla e Diego Ana e Betoseratildeo gerados a partir da distribuiccedilatildeo Neutral (Figura 47) Carla da distribuiccedilatildeo Disliked(Figura 51) e Diego da Hated (Figura 55) Para a simulaccedilatildeo com a seed 100 o melhorcandidato a ser eleito ou seja aquele que maximiza a meacutedia das notas dos eleitores eacute oBeto com uma meacutedia de 0073 Para cada sistema seratildeo comparados os resultados semvoto taacutetico aos com 20 de voto taacutetico a favor da Ana Abaixo se encontram osresultados para o sistema FPTP

                            Figura 8 ndash FPTP - Cenaacuterio 1 sem voto taacutetico

                            Figura 9 ndash TRS segundo turno - Cenaacuterio 1 sem voto taacutetico

                            35

                            Figura 10 ndash IRV primeiro turno - Cenaacuterio 1

                            Figura 11 ndash IRV segundo turno - Cenaacuterio 1

                            Figura 12 ndash IRV terceiro turno - Cenaacuterio 1

                            36

                            Figura 13 ndash AVS - Cenaacuterio 1 sem voto taacutetico

                            Figura 14 ndash BC - Cenaacuterio 1 sem voto taacutetico

                            Figura 15 ndash SVS - Cenaacuterio 1 sem voto taacutetico

                            37

                            Nesse cenaacuterio sem voto taacutetico o uacutenico sistema que natildeo elege o Beto eacute o AVS Todosos outros elegem o melhor candidato Ou seja apesar de Beto ter uma melhor meacutediadas notas dos eleitores existem mais eleitores que ranqueiam Ana com uma nota acimade 0 No entanto apenas 20 dos eleitores de Diego e Carla que preferem a Ana aoinveacutes do Beto satildeo o suficiente para fazer Beto natildeo ser eleito se eles decidirem abandonarsua primeira opccedilatildeo e votar na Ana Considerando a vantagem que os votos taacuteticosproporcionam agrave Ana esta eacute eleita em todos os sistemas menos o TRS e o IRV

                            Figura 16 ndash FPTP - Cenaacuterio 1 - 20 de voto taacutetico na Ana

                            Figura 17 ndash TRS segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                            38

                            Figura 18 ndash IRV primeiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                            Figura 19 ndash IRV segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                            Figura 20 ndash IRV terceiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                            39

                            Figura 21 ndash AVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                            Figura 22 ndash BC - Cenaacuterio 1 20 de voto taacutetico na Ana

                            Figura 23 ndash SVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                            40

                            Eacute claro que se os eleitores que preferem o Beto tambeacutem votassem de maneira estra-teacutegica a situaccedilatildeo se equilibraria e haveria o mesmo niacutevel de concorrecircncia entre os doiscandidatos que ocorre quando natildeo haacute voto taacutetico Poreacutem no Borda Count esse equiliacute-brio pode natildeo acontecer e as estrateacutegias de compromising e burying podem acabar saindopela culatra se uma porcentagem elevada dos eleitores as adotarem Abaixo encontram-seos resultados para esse sistema quando 100 dos eleitores de Carla e Diego se comportammaliciosamente

                            Figura 24 ndash BC - Cenaacuterio 1 100 de voto taacutetico na Ana e Beto

                            Por causa do uso demasiado da estrateacutegia burying Ana e Beto perdem muitos pontose isso abre espaccedilo para uma vitoacuteria da Carla No entanto para porcentagens menores que100 o Beto ainda eacute o vencedor

                            Essas duas estrateacutegias tambeacutem foram implementadas nesse simulador para o sistemaIRV e eacute possiacutevel ver como ele eacute resistente a elas Para que seja possiacutevel mudar os resultadosde uma eleiccedilatildeo sob o IRV eacute necessaacuterio mudar a ordem de eliminaccedilatildeo dos candidatos paraque o seu candidato preferido acabe enfrentando um candidato mais fraco nas rodadasfinais Isso natildeo ocorre com compromising e burying No proacuteximo cenaacuterio seraacute analisadacomo eacute possiacutevel modificar os resultados de uma eleiccedilatildeo sob o IRV

                            Esses resultados podem ser replicados acessando os linksSem votos taacuteticos lthttpelectionsimpythonanywherecomdirect_res1111110

                            --[0021][22Ana2222Beto222022Carla2222Diego22]------100gt

                            Com 20 de voto taacutetico lthttpelectionsimpythonanywherecomdirect_res1111110--[0021][22Ana222022Beto2222Carla2222Diego22]1-[02000]---100gt

                            Com 100 de voto taacuteticona Ana e Beto lthttpelectionsimpythonanywherecomdirect_res0000100--[0021][22Ana222022Beto222022Carla2222Diego22]1-[101000]---100gt

                            41

                            42 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV

                            Neste cenaacuterio teremos Ana Carla e Beto concorrendo e trecircs perfis distintos que apoiamcada candidato As distribuiccedilotildees de notas dos perfis se encontram na tabela abaixo

                            Tabela 12 ndash Distribuiccedilatildeo de notas - Cenaacuterio 2

                            Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                            deeleitores

                            1 10 5 0 422 0 10 5 303 5 0 10 28

                            Com essas distribuiccedilotildees Carla eacute eliminada na primeira rodada e seus 28 de votossatildeo transferidos para a segunda opccedilatildeo de seus eleitores Ana que eacute eleita com 70 dosvotos e uma meacutedia de 56

                            Figura 25 ndash IRV primeiro turno - Cenaacuterio 2

                            Figura 26 ndash IRV segundo turno - Cenaacuterio 2

                            42

                            Cientes desse provaacutevel futuro cenaacuterio onde Ana eacute eleita uma pequena parte dos elei-tores de Beto estrategicamente o abandona e decide apoiar Carla na esperanccedila de leva-laao segundo turno contra Ana As novas distribuiccedilotildees de notas se encontram na tabelaabaixo com essa porccedilatildeo de eleitores representada pelo perfil 4

                            Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2

                            Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                            deeleitores

                            1 10 5 0 422 0 10 5 283 5 0 10 284 0 8 10 2

                            Essa mudanccedila estrateacutegica de voto altera a ordem de eliminaccedilotildees do sistema com Betosendo o primeiro a ser eliminado Com isso seus votos satildeo naturalmente transferidos paraCarla que derrota Ana no segundo turno com 58 dos votos

                            Figura 27 ndash IRV primeiro turno com voto taacutetico - Cenaacuterio 2

                            Figura 28 ndash IRV segundo turno com voto taacutetico - Cenaacuterio 2

                            43

                            Percebendo que a eleiccedilatildeo de Beto natildeo era provaacutevel seus eleitores conseguiram aomenos impedir a eleiccedilatildeo do pior candidato para eles Mas para isso foi necessaacuterio queeles tivessem a informaccedilatildeo de como os outros eleitores votariam Uma aproximaccedilatildeo dessasinformaccedilotildees poderia ser obtida em um cenaacuterio real com poucos candidatos atraveacutes depesquisas eleitorais poreacutem se o nuacutemero de candidatos eacute significativo uma noccedilatildeo completadas distribuiccedilotildees dos rankings dos eleitores se torna muito menos viaacutevel e dificulta aformulaccedilatildeo de estrateacutegias para alterar a ordem em que os candidatos satildeo eliminados

                            Esses resultados podem ser replicados acessando os linksSem voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana22

                            22Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                            Com voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana

                            2222Beto2222Carla22]-----42Voter20Profile2001020520028Voter20Profile2010201020528Voter20Profile202520020102Voter20Profile20302082010100gt

                            43 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE

                            O interessante dos sistemas IRV e TRS eacute que os resultados do cenaacuterio anterior po-deriam ter sido obtidos ao inveacutes do voto taacutetico pela sua natildeo-monotonicidade Seriapossiacutevel que a Carla derrotasse a Ana no segundo turno atraveacutes do proacuteprio aumento depopularidade da Ana Assumindo que essa popularizaccedilatildeo ocorresse entre os candidatosdo perfil 2 onde 3 passasse a apoiar a Ana ao inveacutes do Beto as novas distribuiccedilotildeesseguiriam a tabela abaixo

                            Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                            Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                            deeleitores

                            1 10 5 0 452 0 10 5 273 5 0 10 28

                            Dessa maneira Beto agora com uma porcentagem dos eleitores menor do que a deCarla seraacute eliminado na primeira rodada e como seus eleitores tecircm a Carla como segundaopccedilatildeo ela receberaacute todos os seus votos e seraacute eleita na segunda rodada As rodadas doIRV podem ser vistas nas figuras 29 e 30

                            44

                            Figura 29 ndash IRV primeiro turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                            Figura 30 ndash IRV segundo turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                            Tabela 15 ndash Resultados do Cenaacuterio 3Candidato

                            eleitoMeacutedia das

                            notasAntes da

                            popularizaccedilatildeode Ana

                            Ana 56

                            Apoacutespopularizaccedilatildeo

                            de AnaCarla 415

                            Os efeitos dessa caracteriacutestica se refletem na satisfaccedilatildeo meacutedia da populaccedilatildeo A Ana eacuteclaramente a melhor candidata e mesmo com o seu ganho de popularidade (ou devido aele) a Carla eacute eleita

                            Esses resultados podem ser replicados acessando os linksAntes da popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecom

                            direct_res0010000---[22Ana2222Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                            45

                            Apoacutes popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana2222Beto2222Carla22]-----45Voter20Profile2001020520027Voter20Profile2010201020528Voter20Profile20252002010100gt

                            44 CENAacuteRIO 4 COALIZOtildeES

                            O TRS por ser organizado em dois turnos separados normalmente a semanas dedistacircncia um do outro acaba abrindo brecha agrave mudanccedila de opiniatildeo por parte dos eleitorese o desenvolvimento de novas estrateacutegias por parte dos candidatos tais como a coalizatildeocom candidatos jaacute eliminados Com isso em mente nesse cenaacuterio teremos novamenteos quatro candidatos Ana Beto Carla e Diego Os trecircs primeiros seratildeo gerados dadistribuiccedilatildeo Neutral e Diego da distribuiccedilatildeo Disliked

                            Figura 31 ndash TRS turno 1 - Cenaacuterio 4

                            No TRS normal Ana Beto e Carla possuem com essas distribuiccedilotildees quantidades devotos muito proacuteximas com Beto e Carla indo para o segundo turno Carla estaacute 10 votosatraacutes de Beto e decide aproveitar o espaccedilo de tempo entre os dois turnos para tentaragregar mais votos Com isso Carla se aproxima de Diego e juntos formam uma coalizatildeoNo entanto com sua baixa popularidade Diego acaba ferindo a reputaccedilatildeo de Carla etorna o segundo turno muito mais faacutecil para Beto (Figura 33) Se Carla tivesse buscado osuporte de Ana por outro lado ela se veria vitoriosa no segundo turno e com uma amplavantagem sobre o Beto (Figura 34) Ou ateacute mesmo sem buscar uma coalizatildeo mesmosendo uma corrida apertada Carla teria naturalmente sido eleita (Figura 32)

                            Esses resultados podem ser replicados acessando os linksSem coalizotildees lthttpelectionsimpythonanywherecomdirect_res0100000

                            --[0002][22Ana222022Beto2222Carla2222Diego22]------100gt

                            46

                            Figura 32 ndash TRS turno 2 - Cenaacuterio 4

                            Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4

                            Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4

                            47

                            Coalizatildeo Carla e Diego lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2203Carla20Diego-100gt

                            Coalizatildeo Carla e Ana lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2200Carla20Ana-100gt

                            45 CENAacuteRIO 5 DILEMA DO PRISIONEIRO

                            Neste cenaacuterio temos uma eleiccedilatildeo de uma vaga com trecircs candidatos concorrentes e trecircsperfis distintos de eleitores que seguiratildeo as seguintes distribuiccedilotildees

                            Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5

                            Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                            deeleitores

                            1 10 -10 5 362 -10 10 5 343 -10 -10 5 30

                            Esse contexto nos remete ao notaacutevel dilema do prisioneiro Nele dois prisioneiroscuacutemplices satildeo interrogados individualmente sem poder se comunicar um com o outro ecada um enfrenta o dilema de delatar ou natildeo o seu parceiro Se os dois prisioneirosdecidem se manter calados sobre o crime ambos satildeo sentenciados a um ano de prisatildeo Seapenas um deles dedurar o outro o traidor sai livre enquanto seu parceiro eacute condenadoa trecircs anos Se ambos dedurarem um ao outro eles satildeo condenados juntos a dois anosde prisatildeo Esse dilema eacute uma ideia claacutessica presente no estudo da teoria dos jogos sendooriginalmente elaborada por Merrill Flood e Melvin Dresher em 1950 e mais tarde sendonomeada de dilema dos prisioneiros por Albert W Tucker (POUNDSTONE 1992)

                            O que esse dilema nos mostra eacute a tentaccedilatildeo que o indiviacuteduo deteacutem se sua racionalizaccedilatildeoestiver voltada para seus proacuteprios interesses e somente eles em oposiccedilatildeo a pensar no bemdo grupo como um todo Neste cenaacuterio encontramos dois grupos de eleitores expressiva-mente opostos os perfis 1 e 2 Se qualquer uma das preferecircncias desses perfis fosse eleitaisso significaria uma alta rejeiccedilatildeo de maior parte da populaccedilatildeo No entanto eles possuema segunda opccedilatildeo em comum a Carla que por sua vez eacute a preferecircncia do terceiro perfilPortanto a eleiccedilatildeo da Carla seria logicamente o resultado oacutetimo

                            Mesmo assim a Ana eacute eleita nos dois sistemas acima o que natildeo parece justo poispela tabela 16 eacute evidente que apenas 36 da populaccedilatildeo a aprova enquanto que os outros64 a reprovam ao maacuteximo O sistema IRV se comporta de maneira idecircntica ao TRS

                            48

                            Figura 35 ndash FPTP - Cenaacuterio 5

                            Figura 36 ndash TRS segundo turno - Cenaacuterio 5

                            nesta situaccedilatildeo Com esse resultado a meacutedia das notas eacute -28 No entanto os trecircs sistemasseguintes nos apresentam resultados diferentes

                            Tabela 17 ndash Resultados do Cenaacuterio 5

                            Sistema Candidatoeleito

                            Meacutedia dasnotas

                            FPTP Ana -28TRS Ana -28IRV Ana -28AVS Carla 50BC Carla 50SVS Carla 50

                            49

                            Figura 37 ndash AVS - Cenaacuterio 5

                            Figura 38 ndash BC - Cenaacuterio 5

                            Tanto o AVS quanto o Borda Count e o SVS satildeo sistemas que consideram todasas opiniotildees de cada eleitor ao mesmo tempo e por isso satildeo capazes de eleger o melhorcandidato nesta situaccedilatildeo diferentemente do TRS que natildeo absorve completamente todosentimento do eleitor por todos os candidatos e o IRV que apesar de ser bem expressivoquebra esse processo em inuacutemeras rodadas o que permite a perda de informaccedilatildeo ao longodelas

                            Esses resultados podem ser replicados acessando o linklthttpelectionsimpythonanywherecomdirect_res1111110---[22Ana

                            222022Beto222022Carla22]-----36Voter20Profile2001020-1020534Voter20Profile201-10201020530Voter20Profile202-1020-10205100gt

                            50

                            Figura 39 ndash SVS - Cenaacuterio 5

                            46 CENAacuteRIO 6 VOTO DE MINORIA

                            Neste cenaacuterio temos uma eleiccedilatildeo com quatro candidatos e duas vagas A Ana seraacutea preferecircncia de uma extensa parte da populaccedilatildeo (distribuiccedilatildeo Loved Figura 53) Betoe Carla seratildeo candidatos razoavelmente populares (distribuiccedilatildeo Neutral Figura 47) eDiego seraacute a preferecircncia de apenas um pequeno grupo especiacutefico e rejeitado pela maioria(distribuiccedilatildeo Disliked Figura 51) Eacute intuitivo esperar que os dois candidatos eleitos seratildeoa Ana e ou o Beto ou a Carla e isso eacute exatamente o que ocorre na figura 40 no sistemaFPTP sem voto de minoria

                            Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria

                            Eacute evidente a discrepacircncia da quantidade de votos da Ana para os outros candidatose apesar de Beto e Carla serem mais populares que Diego os trecircs natildeo se encontrammuito afastados Poreacutem se a pequena fraccedilatildeo de candidatos que possuem a Ana como

                            51

                            Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego

                            preferecircncia e Diego como segunda opccedilatildeo optarem pelo voto de minoria a situaccedilatildeo mudacompletamente (Figura 41) Assim apesar de extensamente rejeitado Diego conquistaa segunda vaga e a meacutedia das notas despenca de 2929 para 0505 No entanto aindaexiste um cenaacuterio pior Se os outros grupos de eleitores pensarem da mesma forma eevitarem votar na Ana achando que sua eleiccedilatildeo jaacute estaacute assegurada apenas 80 de votode minoria para esses grupos jaacute eacute o suficiente para eliminaacute-la das eleiccedilotildees (Figura 42)Com a Ana eliminada a meacutedia das notas cai ainda mais para 0058

                            Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego

                            O sistema Bloc Vote eacute uma das soluccedilotildees para o voto de minoria Permitindo queos eleitores votem no mesmo nuacutemero de candidatos que de vagas a serem preenchidasnatildeo existe o iacutempeto a esse tipo de voto estrateacutegico O resultado desse sistema portantoretorna a meacutedia das notas a casa dos 29 (Figura 43) Os sistemas AVS Borda Count eSVS tambeacutem impedem a presenccedila do voto de minoria e atingem resultados semelhantes

                            52

                            Figura 43 ndash BV - Cenaacuterio 6

                            Tabela 18 ndash Resultados do Cenaacuterio 6

                            Sistema Candidatoseleitos

                            Meacutedia dasnotas

                            FPTP sem voto de minoriaAna eBeto 2929

                            FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

                            FPTP com 80 de voto de minoriaBeto eCarla 0058

                            Bloc VoteAna eCarla 2913

                            Esses resultados podem ser replicados acessando os links

                            Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

                            100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

                            80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

                            53

                            5 COMO FUNCIONA O SIMULADOR

                            O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

                            51 CLASSE ELECTIONS

                            Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

                            bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

                            Figura 44 ndash estrutura candidates

                            bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

                            bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

                            Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

                            Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

                            54

                            Figura 45 ndash estrutura voters

                            Figura 46 ndash estrutura votes

                            daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

                            Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

                            55

                            Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

                            Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

                            na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

                            56

                            Figura 49 ndash PDF - Distribuiccedilatildeo Liked

                            Figura 50 ndash CDF - Distribuiccedilatildeo Liked

                            (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

                            Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

                            57

                            Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

                            Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

                            candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

                            Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

                            58

                            Figura 53 ndash PDF - Distribuiccedilatildeo Loved

                            Figura 54 ndash CDF - Distribuiccedilatildeo Loved

                            funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

                            59

                            Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                            Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                            Meacutedia das Notas sumei

                            sumvj nij

                            etimes v

                            Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                            Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                            60

                            Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                            Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                            52 CLASSE FIRSTPASTTHEPOST

                            Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                            Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                            61

                            Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                            Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                            mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                            62

                            53 CLASSE TWOROUNDSYSTEM

                            A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                            54 CLASSE INSTANTRUNOFFVOTING

                            A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                            Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                            63

                            cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                            55 CLASSE APPROVALVOTING

                            Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                            56 CLASSE BORDACOUNT

                            Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                            57 CLASSE SCOREVOTING

                            De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                            64

                            58 CLASSE BLOCVOTE

                            O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                            59 TECNOLOGIAS UTILIZADAS

                            A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                            Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                            O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                            Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                            65

                            6 CONCLUSAtildeO

                            Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                            Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                            Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                            Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                            Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                            66

                            REFEREcircNCIAS

                            AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                            Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                            Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                            Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                            HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                            LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                            ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                            Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                            POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                            The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                            67

                            APEcircNDICES

                            APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                            Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                            if(not len(selfvoter_profiles))

                            for voter in range(selfN_VOTERS)

                            candidates_rank = dict()

                            for candidate in reversed(range(selfN_CANDIDATES))

                            if(selfBIAS_VECTOR[candidate]==4)

                            candidates_rank[candidate] = self_sortear(selfloved)

                            elif(selfBIAS_VECTOR[candidate]==3)

                            candidates_rank[candidate] = self_sortear(selfliked)

                            elif(selfBIAS_VECTOR[candidate]==2)

                            candidates_rank[candidate] = self_sortear(selfdisliked)

                            elif(selfBIAS_VECTOR[candidate]==1)

                            candidates_rank[candidate] = self_sortear(selfhated)

                            elif(selfBIAS_VECTOR[candidate]==-1)

                            candidates_rank[candidate] = self_sortear(selfpolarizer

                            )

                            elif(selfBIAS_VECTOR[candidate]==-2)

                            candidates_rank[candidate] = self_sortear(self

                            more_polarizer)

                            else

                            candidates_rank[candidate] = self_sortear(selfneutral)

                            selfvotersappend(candidates_rank)

                            else

                            ranges = []

                            ranks = []

                            for prof in selfvoter_profiles

                            rangesappend(int(prof[pop_percentage]))

                            rank =

                            for index score in enumerate(prof[scores])

                            rank[index] = score

                            ranksappend(rank)

                            for index _range in enumerate(ranges)

                            for _ in range(int(selfN_VOTERS(_range100)))

                            selfvotersappend(ranks[index])

                            68

                            APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                            Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                            for i in range(selfN_CANDIDATES)

                            selfcandidates[i] = 0

                            selfvotes[i] = set()

                            APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                            Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                            for candidate in range(selfN_CANDIDATES)

                            rating_sum = 0

                            for voter in selfvoters

                            rating_sum += voter[candidate]

                            selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                            APEcircNDICE D ndash MEacuteTODO GET_MEAN

                            Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                            if len(winners) gt 1 or selfN_CANDIDATES gt 10

                            return selfcalculate_mean(winners)

                            else

                            chose_best = True if winners[0] == selfbest_candidate else

                            False

                            return selfstats[rsquomeansrsquo][winners[0]] chose_best

                            69

                            APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                            Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                            rating_sum = 0

                            for voter in selfvoters

                            for candidate in winners

                            rating_sum += voter[candidate]

                            return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                            APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                            Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                            for i in range(1 selfN_VACANCIES + 2)

                            selfleading_candidatesappend(selfsorted_candidates[-i][self

                            CANDIDATE_INDEX])

                            APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                            Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                            for leader in selfelecrounds[-1]

                            selfleading_candidatesappend(leader[0])

                            70

                            APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                            Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                            self_account_for_coalitions()

                            for voter in selfvoters

                            selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                            (1)))

                            temp = []

                            for voter in selfsorted_voters

                            new_dict = defaultdict(list)

                            for k in voter

                            new_dict[k[1]]append(k[0])

                            tempappend(new_dict)

                            selfsorted_voters = []

                            for voter_index current_voter in enumerate(temp)

                            new_voter = []

                            for rating candidate_indexes in current_voteritems()

                            if len(current_voter[rating]) gt 1

                            shuffle(current_voter[rating])

                            for e in candidate_indexes

                            new_voterappend((e rating))

                            else

                            new_voterappend((candidate_indexes[0] rating))

                            selfsorted_votersappend(new_voter)

                            selfcandidates[new_voter[-1][0]] += 1

                            selfvotes[new_voter[-1][0]]add(voter_index)

                            71

                            APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                            Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                            for candidate in selfvotes_copy

                            if candidate not in selfelecleading_candidates

                            for voter_index in selfvotes_copy[candidate]

                            for index _candidate in enumerate(reversed(selfelec

                            sorted_voters[voter_index]))

                            if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                            leading_candidates

                            if randomrandom() lt selfelec

                            tactical_vote_percentages[_candidate[selfelec

                            CANDIDATE_INDEX]]

                            selfrankings_changed[voter_index] = copy

                            deepcopy(selfelecsorted_voters[voter_index])

                            selfrankings_changed[voter_index][-(index + 1)]

                            selfrankings_changed[voter_index][-1] = self

                            rankings_changed[voter_index][-1] self

                            rankings_changed[voter_index][-(index + 1)]

                            selfcandidates[candidate] -= 1

                            selfcandidates[_candidate[selfelec

                            CANDIDATE_INDEX]] += 1

                            selfvotes[candidate]remove(voter_index)

                            selfvotes[_candidate[selfelecCANDIDATE_INDEX

                            ]]add(voter_index)

                            break

                            break

                            72

                            APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                            Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                            half_vacancies = mathfloor(selfelecN_VACANCIES2)

                            for candidate in selfelecleading_candidates

                            if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                            continue

                            for voter_index in selfvotes_copy[candidate]

                            if voter_index in selfrankings_changed

                            ranking = selfrankings_changed[voter_index]

                            else

                            ranking = copydeepcopy(selfelecsorted_voters[voter_index

                            ])

                            for index _candidate in enumerate(reversed(ranking))

                            if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                            leading_candidates or (_candidate[selfelec

                            CANDIDATE_INDEX] in selfelecleading_candidates and

                            selfelecleading_candidatesindex(_candidate[selfelec

                            CANDIDATE_INDEX]) gt= half_vacancies)

                            if _candidate[selfelecCANDIDATE_RANK] gt= 0

                            if randomrandom() lt selfelec

                            minority_vote_percentages[_candidate[selfelec

                            CANDIDATE_INDEX]]

                            selfcandidates[candidate] -= 1

                            selfcandidates[_candidate[selfelec

                            CANDIDATE_INDEX]] += 1

                            break

                            break

                            break

                            73

                            APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                            Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                            self_account_for_coalitions()

                            for candidate in selfvotes

                            if candidate = selfwinner and candidate = selfsecond_place

                            for voter_index in selfvotes[candidate]

                            if voter_index in selfrankings_changed

                            ranking = selfrankings_changed[voter_index]

                            else

                            ranking = copydeepcopy(selfelecsorted_voters[

                            voter_index])

                            for index2 candidate in enumerate(reversed(ranking))

                            if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                            selfcandidates[selfwinner] += 1

                            selfvotes[selfwinner]add(voter_index)

                            break

                            elif candidate[selfelecCANDIDATE_INDEX] == self

                            second_place

                            selfcandidates[selfsecond_place] += 1

                            selfvotes[selfsecond_place]add(voter_index)

                            break

                            selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                            winners = []

                            vacancies = selfelecN_VACANCIES

                            for candidate in reversed(selfsorted_candidates)

                            if vacancies == 0

                            break

                            winnersappend(candidate[0])

                            vacancies -= 1

                            mean chose_best = selfelecget_mean(winners = winners)

                            74

                            APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                            Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                            for voter_index voter in enumerate(selfelecsorted_voters)

                            voter_dict = dict()

                            og_voter_dict = dict()

                            for tup in voter

                            voter_dict[tup[0]] = tup[1]

                            og_voter_dict[tup[0]] = tup[1]

                            for coalition in selfeleccoalitions

                            for candidate in coalition

                            add_to_score = 0

                            for candidate2 in coalition

                            if candidate == candidate2

                            continue

                            half = og_voter_dict[candidate2[rsquovaluersquo]]2

                            if half lt 0

                            add_to_score += mathceil(half)

                            else

                            add_to_score += mathfloor(half)

                            if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                            voter_dict[candidate[rsquovaluersquo]] = 10

                            elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                            voter_dict[candidate[rsquovaluersquo]] = -10

                            else

                            voter_dict[candidate[rsquovaluersquo]] += add_to_score

                            selfrankings_changed[voter_index] = []

                            for candidate in voter_dict

                            selfrankings_changed[voter_index]append((candidate voter_dict[

                            candidate]))

                            selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                            voter_index] key=lambda x x[1])

                            75

                            APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                            Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                            selfelecroundsappend(selfsorted_candidates[_round])

                            if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                            N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                            N_VACANCIES - 1)

                            return 2

                            elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                            N_VOTERS gt 05)

                            return 1

                            else

                            selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                            CANDIDATE_INDEX])

                            for voter_index in selfvotes[selfsorted_candidates[_round][self

                            elecCANDIDATE_INDEX]]

                            if voter_index in selfrankings_changed

                            for candidate in reversed(selfrankings_changed[voter_index

                            ])

                            if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                            excluded

                            selfcandidates[candidate[selfelecCANDIDATE_INDEX

                            ]] += 1

                            selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                            add(voter_index)

                            break

                            else

                            continue

                            else

                            for candidate in reversed(selfelecsorted_voters[

                            voter_index])

                            if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                            excluded

                            selfcandidates[candidate[selfelecCANDIDATE_INDEX

                            ]] += 1

                            selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                            add(voter_index)

                            break

                            else

                            continue

                            selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                            return 0

                            76

                            APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                            Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                            for index in range(selfelecN_CANDIDATES)

                            selfcandidates[index] = 0

                            for voter in selfelecsorted_voters

                            for candidate in reversed(voter)

                            if candidate[selfelecCANDIDATE_SCORE] gt 0

                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                            else

                            break

                            APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                            Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                            for index in range(selfelecN_CANDIDATES)

                            selfcandidates[index] = 0

                            for voter in selfelecsorted_voters

                            if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                            elecCANDIDATE_INDEX]]

                            selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                            else

                            for candidate in reversed(voter)

                            if candidate[selfelecCANDIDATE_SCORE] gt 0

                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                            else

                            break

                            77

                            APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                            Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                            pos = set()

                            for index perc in enumerate(selfelectactical_vote_percentages)

                            if perc gt 0

                            posadd(index)

                            for candidate in selfeleccandidates

                            if candidate not in selfleading_candidates

                            for voter_index in selfvotes[candidate]

                            raised = None

                            for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                            ])

                            if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                            leading_candidates

                            if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                            if randomrandom() lt selfelectactical_vote_percentages[

                            candidate_tuple[selfelecCANDIDATE_INDEX]]

                            ranking = [None]selfelecN_CANDIDATES

                            ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                            selfelecvoters[voter_index][candidate_tuple[selfelec

                            CANDIDATE_INDEX]])

                            raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                            break

                            break

                            break

                            if raised = None

                            for _candidate in selfleading_candidates

                            if _candidate = ranking[-1][0]

                            ranking[0] = (_candidate selfelecvoters[voter_index][

                            _candidate])

                            buried = _candidate

                            break

                            i = 1

                            for candidate_tuple in selfelecsorted_voters[voter_index]

                            if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                            buried]

                            continue

                            else

                            ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                            selfelecvoters[voter_index][candidate_tuple[selfelec

                            CANDIDATE_INDEX]])

                            i += 1

                            selfrankings_changed[voter_index] = ranking

                            78

                            APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                            Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                            for voter_index in selfvotes[candidate]

                            if randomrandom() lt selfelectactical_vote_percentages[candidate

                            ]

                            for _candidate in selfleading_candidates

                            if _candidate = candidate

                            ranking = [None]selfelecN_CANDIDATES

                            ranking[0] = (_candidate selfelecvoters[voter_index][

                            _candidate])

                            buried = _candidate

                            break

                            i = 1

                            for candidate_tuple in selfelecsorted_voters[voter_index]

                            if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                            continue

                            else

                            ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                            selfelecvoters[voter_index][candidate_tuple[selfelec

                            CANDIDATE_INDEX]])

                            i += 1

                            selfrankings_changed[voter_index] = ranking

                            79

                            APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                            Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                            for index in range(selfelecN_CANDIDATES)

                            selfcandidates[index] = 0

                            for voter_index voter in enumerate(selfelecsorted_voters)

                            score = 0

                            if voter_index in selfrankings_changed

                            for candidate in selfrankings_changed[voter_index]

                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                            score += 1

                            else

                            for candidate in voter

                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                            score += 1

                            APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                            Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                            for voter_index voter in enumerate(selfelecsorted_voters)

                            if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                            elecCANDIDATE_INDEX]]

                            selfrankings_changed[voter_index] = copydeepcopy(selfelec

                            sorted_voters[voter_index])

                            for candidate_index candidate in enumerate(reversed(voter))

                            if candidate_index == 0

                            selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                            voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                            else

                            selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                            voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                            80

                            APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                            Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                            for index in range(selfelecN_CANDIDATES)

                            selfcandidates[index] = 0

                            for voter_index voter in enumerate(selfelecsorted_voters)

                            if voter_index in selfrankings_changed

                            for candidate in selfrankings_changed[voter_index]

                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                            selfelecCANDIDATE_RANK]

                            else

                            for candidate in voter

                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                            selfelecCANDIDATE_RANK]

                            APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                            Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                            for index in range(selfelecN_CANDIDATES)

                            selfcandidates[index] = 0

                            for voter in selfelecsorted_voters

                            votes = selfelecN_VACANCIES

                            for candidate in reversed(voter)

                            if votes == 0

                            break

                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                            votes -= 1

                            • Folha de aprovaccedilatildeo
                            • Agradecimentos
                            • Epiacutegrafe
                            • Resumo
                            • Abstract
                            • Lista de ilustraccedilotildees
                            • Lista de Coacutedigos
                            • Lista de tabelas
                            • Lista de abreviaturas e siglas
                            • Sumaacuterio
                            • INTRODUCcedilAtildeO
                              • MOTIVACcedilAtildeO E OBJETIVO
                              • MEacuteTODO
                              • ESTRUTURA
                                • SISTEMAS ELEITORAIS
                                  • FISRT PAST THE POST
                                    • Exemplo
                                    • Vantagens e Desvantagens do FPTP
                                    • Voto Uacutetil no FPTP
                                      • TWO-ROUND SYSTEM
                                        • Exemplo
                                        • Vantagens e Desvantagens do TRS
                                        • Voto Uacutetil no TRS
                                          • INSTANT-RUNOFF VOTING
                                            • Exemplo
                                            • Vantagens e Desvantagens do IRV
                                            • Voto Uacutetil no IRV
                                              • APPROVAL VOTING SYSTEM
                                                • Exemplo
                                                • Vantagens e Desvantagens do AVS
                                                • Voto Uacutetil no AVS
                                                  • THE BORDA COUNT
                                                    • Exemplo
                                                    • Vantagens e Desvantagens do BC
                                                    • Voto Uacutetil no BC
                                                      • SCORE VOTING SYSTEM
                                                        • Exemplo
                                                        • Vantagens e Desvantagens do SVS
                                                        • Voto Uacutetil no SVS
                                                          • BLOC VOTE
                                                            • Exemplo
                                                            • Voto Uacutetil no BV
                                                                • O SIMULADOR
                                                                • CENAacuteRIOS PERTINENTES
                                                                  • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                  • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                  • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                  • CENAacuteRIO 4 COALIZOtildeES
                                                                  • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                  • CENAacuteRIO 6 VOTO DE MINORIA
                                                                    • COMO FUNCIONA O SIMULADOR
                                                                      • CLASSE Elections
                                                                      • CLASSE FirstPastThePost
                                                                      • CLASSE TwoRoundSystem
                                                                      • CLASSE InstantRunoffVoting
                                                                      • CLASSE ApprovalVoting
                                                                      • CLASSE BordaCount
                                                                      • CLASSE ScoreVoting
                                                                      • CLASSE BlocVote
                                                                      • TECNOLOGIAS UTILIZADAS
                                                                        • CONCLUSAtildeO
                                                                        • Referecircncias
                                                                        • Meacutetodo create_voters
                                                                        • Meacutetodo create_candidates
                                                                        • Meacutetodo calculate_means
                                                                        • Meacutetodo get_mean
                                                                        • Meacutetodo calculate_mean
                                                                        • Meacutetodo set_leading_candidates
                                                                        • Meacutetodo irv_set_leading_candidates
                                                                        • Meacutetodo sort_ranks
                                                                        • Meacutetodo fptp_count_tactical_votes
                                                                        • Meacutetodo fptp_count_minority_votes
                                                                        • Meacutetodo trs_second_round
                                                                        • Meacutetodo trs_account_for_coalitions
                                                                        • Meacutetodo irv_count_votes
                                                                        • Meacutetodo avs_count_votes
                                                                        • Meacutetodo avs_count_votes_with_tactical
                                                                        • Meacutetodo irv_apply_tactical_votes
                                                                        • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                        • Meacutetodo bc_sum_candidates_scores
                                                                        • Meacutetodo svs_apply_tactical_votes
                                                                        • Meacutetodo svs_sum_candidates_scores
                                                                        • Meacutetodo bv_count_votes

                              15

                              1 INTRODUCcedilAtildeO

                              Em toda eleiccedilatildeo existe pelo menos um grupo de indiviacuteduos que sai completamentedesfavorecido e insatisfeito com o resultado O contentamento completo de uma populaccedilatildeoeacute certamente improvaacutevel e muitas vezes impossiacutevel considerando a gama de candidatosque se dispotildee a concorrer Em todo caso o miacutenimo que pode ser feito eacute escolher demaneira eficiente o melhor candidato ao cargo dentre as opccedilotildees disponiacuteveis Diante dissoeacute necessaacuterio avaliar como essa escolha eacute feita e quais meacutetodos satildeo capazes de tornaacute-larealidade

                              11 MOTIVACcedilAtildeO E OBJETIVO

                              Em conformidade com o extenso nuacutemero de sistemas eleitorais pelo mundo este tra-balho tem como objetivo testar uma porccedilatildeo desses sistemas sob a simulaccedilatildeo de diferentescenaacuterios especiacuteficos a fim de determinar quais deles podem ser considerados como os maisjustos perante a taxa de satisfaccedilatildeo meacutedia da populaccedilatildeo

                              12 MEacuteTODO

                              Para que essa anaacutelise seja possiacutevel foi desenvolvido um programa que permite a criaccedilatildeoe configuraccedilatildeo de diferentes cenaacuterios onde os sistemas eleitorais seratildeo simulados Nele eacutepossiacutevel definir o nuacutemero total de eleitores e candidatos como esses eleitores iratildeo votar eo niacutevel de popularidade de cada candidato Aleacutem disso eacute possiacutevel formar coalizotildees entreos candidatos e escolher a porcentagem dos eleitores que optaratildeo pelo voto uacutetil Dessamaneira seraacute possiacutevel elaborar cenaacuterios que buscam expor os pontos fortes e fracos decada sistema

                              13 ESTRUTURA

                              Este trabalho eacute relatado ao longo de seis capiacutetulos No Capiacutetulo 2 seratildeo apresentados ossistemas eleitorais implementados no simulador suas vantagens e desvantagens conhecidase outras caracteriacutesticas especiacuteficas de cada um A intenccedilatildeo do capiacutetulo eacute tornar o textomais autocontido trazendo conceitos jaacute estudados que ajudaratildeo na melhor compreensatildeodos capiacutetulos seguintes por isso grande parte de sua composiccedilatildeo eacute oriunda de diferentesfontes consultadas

                              O Capiacutetulo 3 eacute uma apresentaccedilatildeo das funcionalidades que o simulador possui Seratildeoexplicados todos os campos de entrada e os dois modos distintos nos quais o programaopera

                              16

                              No Capiacutetulo 4 os sistemas seratildeo colocados em teste Todos seratildeo simulados em cenaacuteriosespeciacuteficos a fim de fazer sobressair aqueles com as maiores taxas de satisfaccedilatildeo meacutedia

                              A estrutura e implementaccedilatildeo do simulador seratildeo abordadas em detalhes no Capiacutetulo5 assim como uma breve descriccedilatildeo da stack utilizada Todos os meacutetodos relevantes aofuncionamento das simulaccedilotildees seratildeo explicados passo a passo

                              No Capiacutetulo 6 seratildeo apresentadas as conclusotildees referentes agrave anaacutelise dos resultadosobtidos no Capiacutetulo 4 e as consideraccedilotildees finais do projeto como um todo

                              17

                              2 SISTEMAS ELEITORAIS

                              Atualmente mais e mais paiacuteses estatildeo adotando sistemas democraacuteticos de governoCerca de 6 em 10 governos no mundo satildeo democracias (Pew Research Center 2017) o quepode ser observado na Figura 1 abaixo Em um sistema democraacutetico a populaccedilatildeo escolheseus liacutederes atraveacutes de seu sistema eleitoral Existem diversos sistemas eleitorais em usono mundo muitos dos quais satildeo usados em conjunto para eleger um uacutenico candidato Emvaacuterios paiacuteses mais de um sistema eleitoral pode ser utilizado tambeacutem em diferentes niacuteveisde governo tanto presidencial quanto estadual ou municipal Natildeo apenas imersos nomeio poliacutetico eles tambeacutem podem ser usados em escopos menores como em esportes oucompeticcedilotildees artiacutesticas poreacutem sempre com a finalidade de alocar um ou mais indiviacuteduosa determinado cargo ou tiacutetulo

                              Figura 1 ndash de paiacuteses de cada tipo de regime 1946-2016

                              Fonte Center of Systemic Peacersquos Polity IV Project

                              Os proacuteximos trecircs toacutepicos discutidos neste capiacutetulo referentes aos meacutetodos First Pastthe Post Two-Round System e Instant Runoff Voting possuem seus conceitos e infor-maccedilotildees relevantes com exceccedilatildeo dos exemplos traduzidos livremente do livro Behind theBallot Box A Citizenrsquos Guide to Voting Systems (AMY 2000)

                              21 FISRT PAST THE POST

                              O meacutetodo First Past the Post tambeacutem conhecido como Plurality Voting ou WinnerTakes All eacute o meacutetodo mais simples e direto e provavelmente o primeiro meacutetodo que sepensa quando se fala de eleiccedilotildees Os eleitores escolhem apenas um candidato e apoacutes a

                              18

                              contagem dos votos o candidato com o maior nuacutemero de votos eacute eleito O vencedor natildeonecessita da aprovaccedilatildeo de mais de 50 dos eleitores ele apenas precisa de uma pluralidadedos votos ou seja apenas possuir mais votos que os outros candidatos

                              Esse sistema eacute utilizado em escala nos Estados Unidos para a maior parte das eleiccedilotildeesvoltadas a eleger apenas um candidato como prefeitos e governadores aleacutem de ser usadana disputa presidencial Dentre outros paiacuteses que empregam o sistema em suas corridaspresidenciais estatildeo listados o Meacutexico as Filipinas a Coreia do Sul e a Venezuela

                              211 Exemplo

                              Tabela 1 ndash Exemplo FPTP

                              Candidatos VotosA 36B 25C 22D 17

                              Neste exemplo o candidato A possui uma pluralidade dos votos com 36 e ele eacute ocandidato eleito mesmo natildeo tendo uma maioria

                              212 Vantagens e Desvantagens do FPTP

                              A vantagem do FPTP eacute a sua simplicidade Natildeo eacute difiacutecil para um eleitor comumcompreender o seu funcionamento eles apenas precisam se decidir por um candidato Eletambeacutem eacute muito simples e direto na sua contagem e seleccedilatildeo do vencedor

                              Esse meacutetodo tambeacutem tende a criar listas de candidatos concorrentes mais curtasCandidatos independentes ou de partidos menores frequentemente acabam se sentindodesencorajados a concorrer devido agraves suas baixas chances de vitoacuteria Isso normalmentefornece aos eleitores uma faacutecil decisatildeo entre um ou dois candidatos dos maiores partidosao mesmo tempo poreacutem limitando suas opccedilotildees

                              No entanto sua essecircncia eacute sua principal desvantagem a pluralidade O fato do can-didato eleito natildeo necessitar de uma maioridade dos votos da populaccedilatildeo parece violaros princiacutepios baacutesicos da democracia Democracia eacute em sua origem o poder(kratos) nopovo(demos) poreacutem na pluralidade o poder de eleger um candidato pode residir emapenas uma fraccedilatildeo relativamente pequena do povo Em um cenaacuterio hipoteacutetico comapenas trecircs candidatos um deles apenas poderia necessitar de natildeo mais do que 34 dosvotos para ser eleito o que significa que no pior dos casos 66 da populaccedilatildeo rejeitao candidato eleito O cenaacuterio soacute piora com mais e mais candidatos concorrendo Paraquatro candidatos satildeo necessaacuterios 26 dos votos no pior dos casos para cinco satildeo 21 eassim por diante

                              19

                              213 Voto Uacutetil no FPTP

                              No FPTP tambeacutem existe a possibilidade de os eleitores evitarem votar em sua prefe-recircncia verdadeira No caso de sua preferecircncia natildeo aparentar ter boas chances de vitoacuteriamuitas vezes opta-se por uma segunda opccedilatildeo que esteja mais bem colocada nas eleiccedilotildeesO motivo disso eacute que nessas situaccedilotildees votar em sua preferecircncia pode parecer um des-perdiacutecio do seu voto e no pior dos cenaacuterios optar por natildeo transferir seu voto para umasegunda opccedilatildeo pode acabar resultando na eleiccedilatildeo de um candidato de seu desgosto As-sim votar de maneira verdadeira muitas vezes pode acabar prejudicando o eleitor que sevecirc forccedilado a abandonar seus interesses poliacuteticos mais imediatos e escolher o menor entredois(ou mais) males Os candidatos de partidos menores satildeo os que mais sofrem com essetipo de voto estrateacutegico por natildeo conseguirem agregar as maiores quantidades de votos

                              Entretanto ao mesmo tempo que partidos maiores roubam votos de partidos meno-res com os votos taacuteticos partidos menores tambeacutem tem a oportunidade de ganhar algunsvotos com o denominado spoiler effect Ao entrarem na eleiccedilatildeo candidatos de partidosmenores podem adquirir votos de candidatos mais populares que possuem inclinaccedilatildeo po-liacutetica semelhante Logo eacute possiacutevel que haja certo equiliacutebrio ao se contrapor as mudanccedilasde voto devido aos votos uacuteteis agraves mudanccedilas oriundas do spoiler effect

                              Poreacutem o spoiler effect natildeo necessariamente ocorre apenas entre partidos maiores emenores mas pode prejudicar candidatos de popularidades proacuteximas Por exemplo entretrecircs candidatos A B e C onde A representa determinada posiccedilatildeo no espectro poliacuteticoenquanto B e C possuem posiccedilotildees parecidas o que pode acontecer eacute B e C se prejudicaremmutuamente jaacute que ambos dividem os eleitores de um mesmo espectro poliacutetico Se esseespectro tem a maioria com 60 por exemplo com B e C compartilhando cada um 30dos votos o candidato A sairia vencedor com 40 mesmo que todos os eleitores de Bprefiram C e todos os eleitores de C prefiram B Esse exemplo demonstra claramente oproblema com os sistemas de pluralidade

                              22 TWO-ROUND SYSTEM

                              Uma das primeiras tentativas de lidar com a desvantagem dos sistemas por pluralidadeo Two-round System eacute usado desde o seacuteculo XIX no ocidente e atualmente ainda eacute utilizadoem corridas presidecircncias de paiacuteses como o Brasil Bulgaacuteria Chile Colocircmbia FinlacircndiaPolocircnia Portugal Ruacutessia e em inuacutemeras eleiccedilotildees locais nos Estados Unidos

                              O principal objetivo do TRS eacute garantir que o vencedor tenha conseguido uma maioriados votos Para isso as eleiccedilotildees satildeo estruturadas em duas rodadas de votaccedilatildeo Na primeirarodada os eleitores se dirigem agraves urnas e votam no candidato de sua preferecircncia Apoacutesa contagem se a quantidade de votos do candidato mais votado superar a proporccedilatildeo de50 natildeo haacute a necessidade de uma segunda rodada e este candidato eacute eleito No entantose este natildeo for o caso haveraacute uma segunda rodada com apenas os dois candidatos mais

                              20

                              votados Nesta rodada os eleitores retornam as urnas para escolher uma das duas opccedilotildeessendo eleito o candidato mais votado agora definitivamente com uma maioria dos votos

                              221 Exemplo

                              Utilizando a mesma distribuiccedilatildeo de votos descrita na tabela 1 Neste caso como ocandidato A natildeo possui uma maioria dos votos ele e o candidato B iratildeo concorrer em umsegundo turno Digamos que as distribuiccedilotildees dos votos dos eleitores dos candidatos C eD em relaccedilatildeo aos candidatos A e B satildeo as seguintes

                              Tabela 2 ndash 2deg turno do TRS

                              Candidatos Votos dos eleitoresde C

                              Votos dos eleitoresde D

                              Votos do 1degturno

                              A 7 5 36B 15 12 25

                              O candidato B agora eacute eleito com uma maioria dos votos 52 contra 48 do candidatoA

                              222 Vantagens e Desvantagens do TRS

                              Por ser parecido com o FPTP esse sistema tambeacutem eacute de faacutecil compreensatildeo do eleitorcomum poreacutem a maior vantagem do TRS eacute a garantia de que o candidato vencedor teraacute oapoio da maioria dos eleitores no segundo turno eliminando a pluralidade Argumenta-seque isso daacute maior legitimidade poliacutetica ao mandato do candidato eleito

                              O TRS tende a abrigar uma lista maior de candidatos sendo mais convidativo acandidatos de partidos menores mesmo que suas chances natildeo sejam maiores quandocomparadas agraves eleiccedilotildees sob o FPTP Mesmo assim essa listagem mais abrangente eacute umavantagem do sistema pois daacute aos eleitores uma variedade maior de opccedilotildees de voto

                              Em relaccedilatildeo agraves suas desvantagens o TRS possui duas principais A primeira satildeo oscustos elevados do sistema decorrentes da necessidade da organizaccedilatildeo de um segundoturno de votaccedilotildees A segunda eacute o aumento no iacutendice de ausecircncias dos eleitores agraves urnasEssa ampliaccedilatildeo no natildeo comparecimento dos eleitores se daacute tambeacutem devido ao segundoturno por pura fatiga eleitoral bem como consequecircncia da desistecircncia de eleitores queapoiam candidatos que jaacute foram eliminados

                              Outro ponto negativo do TRS eacute a sua natildeo-monotonicidade Isso significa que umcandidato pode ser prejudicado com um aumento em sua popularidade e suporte e domesmo modo um candidato pode se beneficiar com a perda de popularidade e suporteSe os candidatos A e B satildeo os esperados para ir ao segundo turno onde A eacute mais fortedo que B um aumento no suporte pelo candidato A pode resultar na sua derrota quandoesse aumento causa uma alteraccedilatildeo nos candidatos que satildeo selecionados para ir ao segundoturno Se esse aumento na popularidade de A resultar na eliminaccedilatildeo preacutevia de B um

                              21

                              terceiro candidato C pode ser vitorioso sobre A no segundo turno caso os eleitores de Bprefiram C ao candidato A Se natildeo houvesse esse crescimento de popularidade A teriaderrotado B no segundo turno Essa situaccedilatildeo seraacute vista em melhores detalhes na seccedilatildeo 43

                              223 Voto Uacutetil no TRS

                              Esse sistema minimiza os efeitos do voto uacutetil em relaccedilatildeo ao FPTP pois um eleitorqualquer pode tranquilamente votar em sua preferecircncia sem se preocupar em desperdiccedilaacute-lo mesmo que seu candidato natildeo tenha chances de vitoacuteria Se este natildeo for eleito aindapoderaacute escolher a sua preferecircncia dentre os dois candidatos que prosseguirem para osegundo turno

                              Apesar disso ainda existe um cenaacuterio em que o eleitor pode ser tentado a natildeo votar emsua preferecircncia Eacute possiacutevel que ele opte pela sua segunda opccedilatildeo se souber que sua primeiraopccedilatildeo possui miacutenimas chances de ir ao segundo turno ou ateacute mesmo por saber que issodiminuiraacute as chances de algum outro candidato ser eleito Mesmo assim eacute evidente queo TRS natildeo proporciona o mesmo apelo ao voto taacutetico que o FPTP

                              Outra caracteriacutestica do TRS eacute o incentivo a formaccedilatildeo de coalizotildees entre candidatosde partidos mais populares com candidatos de partidos menos populares As coalizotildeesfornecem benefiacutecios agrave ambas as partes onde os candidatos classificados para o segundoturno em geral se juntam a candidatos jaacute eliminados com a intenccedilatildeo de agregar maisvotos enquanto os candidatos jaacute eliminados apoiam um dos dois classificados na esperanccedilade inserir propostas proacuteprias ou modificaccedilotildees agrave chapa deles

                              23 INSTANT-RUNOFF VOTING

                              Instant Runoff Voting foi uma alternativa aos meacutetodos FPTP e TRS desenvolvidanos anos 70 por um professor do Instituto de Tecnologia de Massachusetts(MIT) O IRVelimina as principais desvantagens desses outros dois sistemas a pluralidade do FPTP e anecessidade de mais de uma rodada de votaccedilatildeo do TRS Este meacutetodo tambeacutem opera emmais de uma rodada poreacutem como o proacuteprio nome sugere essas rodadas satildeo instantacircneasnatildeo sendo necessaacuterio o retorno dos eleitores agraves urnas Atualmente ele eacute utilizado naIrlanda nas eleiccedilotildees presidenciais em Londres na eleiccedilatildeo de seu prefeito e em distritosindividuais na Austraacutelia para eleger membros de sua cacircmara baixa do parlamento OIRV tambeacutem eacute usado por vaacuterias organizaccedilotildees privadas nos Estados Unidos incluindoa American Political Science Association e a American Psychological Association paraeleger seus funcionaacuterios

                              Nesse sistema os eleitores natildeo satildeo solicitados a votar em um uacutenico candidato aoinveacutes disso eles listam todos os candidatos concorrentes na ordem de sua preferecircnciaA partir dessas listas as primeiras opccedilotildees de cada eleitor recebem o seu voto e apoacutes acontagem se um candidato obtiver 50 dos votos mais um este candidato eacute eleito Se

                              22

                              isso natildeo ocorrer o candidato menos votado eacute eliminado das eleiccedilotildees e seus votos satildeotransferidos para a segunda opccedilatildeo de cada um de seus eleitores Esse procedimento serepete eliminando o candidato menos votado a cada rodada ateacute que algum dos candidatospossuam a maioridade dos votos

                              231 Exemplo

                              Na tabela 3 pode-se verificar a distribuiccedilatildeo de votos por perfil de eleitor e na tabela4 vecirc-se o desenvolvimento do IRV para essas distribuiccedilotildees O candidato D eacute o menosvotado e por consequecircncia eacute o primeiro a ser eliminado A segunda opccedilatildeo de todos oseleitores que votaram no candidato D eacute o candidato C por isso este recebe todos os votosdistribuiacutedos na segunda rodada Com isso o candidato B eacute eliminado com 25 dos votos eos candidatos A e C concorrem na uacuteltima rodada Mesmo com o candidato C na lideranccedilana segunda rodada a maior parte dos eleitores do B tem como preferecircncia o candidatoA por isso A eacute eleito com 55 dos votos contra 45 do C

                              Tabela 3 ndash Exemplo IRV

                              Rankings Ndeg de eleitoresABCD 20ABDC 16BDAC 19BDCA 6CABD 7CDBA 15DCAB 5DCBA 12

                              Tabela 4 ndash Desenvolvimento do IRVTurnos D C B A

                              1 17 22 25 362 eliminado 39 25 363 eliminado 45 eliminado 55

                              232 Vantagens e Desvantagens do IRV

                              Assim como no TRS a pluralidade eacute irrelevante no IRV e um candidato soacute eacute eleitocom a maioridade dos votos dando maior legitimidade ao mandato deste No entantopode-se argumentar que o IRV faz isso com mais eficiecircncia pois natildeo requer a execuccedilatildeode mais de uma rodada de votaccedilotildees Isso diminui os custos das eleiccedilotildees como um todoao mesmo tempo que proporciona um nuacutemero menor de isenccedilotildees por parte dos eleitoresdevido ao desgaste de todo o processo eleitoral

                              23

                              Aleacutem disso candidatos de partidos menores tendem a receber mais votos do queno FPTP e portanto satildeo mais encorajados a se candidatar Com uma lista maior decandidatos eleitores desfrutam de uma variedade maior de opccedilotildees de voto Contudomesmo com mais candidatos menos populares o spoiler effect mencionado anteriormentetambeacutem natildeo possui espaccedilo nesse sistema de votaccedilatildeo Partidos menores natildeo tem comoroubar votos de partidos maiores visto que esses votos eventualmente seratildeo transferidosde volta a eles durante o desenvolvimento das rodadas do IRV

                              Em virtude de sua estrutura acredita-se que esse meacutetodo tende a encorajar os can-didatos tambeacutem a elaborar suas campanhas de forma mais abrangente ampliando suainfluecircncia para mais do que apenas um grupo especiacutefico de maneira que ele consiga agre-gar votos de segunda ou terceira opccedilatildeo aleacutem dos votos de seus eleitores principais

                              A principal desvantagem do IRV eacute o fato de ele ainda natildeo ser amplamente utilizado aoredor do mundo Essa falta de familiaridade do sistema pode causar confusatildeo ao eleitorcomum em suas primeiras ocorrecircncias No entanto nos paiacuteses em que este eacute utilizadonatildeo parece haver confusatildeo entre os eleitores Aleacutem disso na maioria dos casos haveraacute umcusto potencialmente alto da substituiccedilatildeo ou alteraccedilatildeo dos sistemas das urnas eletrocircnicaspara que seja possiacutevel haver a implementaccedilatildeo do meacutetodo

                              Aleacutem disso assim como o TRS este sistema tambeacutem possui natildeo-monotonicidade ouseja um candidato pode ser prejudicado ao ser ranqueado mais alto enquanto que outropode se beneficiar sendo ranqueado mais baixo pelos eleitores (ORNSTEIN 2018) issopode ocorrer quando esse ranqueamento causa alteraccedilotildees na ordem em que os candidatossatildeo eliminados Essa caracteriacutestica se manifesta em fenocircmenos complexos e especiacuteficos epor isso um exemplo de sua ocorrecircncia seraacute abordada em detalhes na seccedilatildeo 43

                              233 Voto Uacutetil no IRV

                              Como os sistemas de votaccedilatildeo anteriores o IRV natildeo eacute completamente imune ao vototaacutetico No entanto este meacutetodo se mostra bem resistente a eles quando comparado aoutros meacutetodos como o FPTP e o Borda Count (Bartholdi John J III and Orlin JamesB 1990) Distintivamente o IRV requer um maior esforccedilo do eleitor para elaborar umaestrateacutegia que melhor ajuste os resultados da eleiccedilatildeo de acordo com a sua preferecircnciaAleacutem disso eacute necessaacuterio que ele tenha informaccedilatildeo suficiente sobre os rankings de outroseleitores naturalmente obtida atraveacutes de pesquisas eleitorais

                              Existe tambeacutem a possibilidade de ocorrer uma exaustatildeo dos votos quando natildeo haacuteo completo preenchimento do ranking por parte dos eleitores Nessas ocasiotildees o votonatildeo pode continuar a ser transferido a outros candidatos e ele eacute descartado Isso afetaa legitimidade do mandato do candidato eleito pois o resultado final natildeo representaraacute100 da populaccedilatildeo votante Essas ocorrecircncias no entanto podem ser minimizadas comuma melhor educaccedilatildeo eleitoral ou como foi implementado na Austraacutelia requerer que osrankings incluam uma totalidade dos candidatos concorrentes

                              24

                              24 APPROVAL VOTING SYSTEM

                              No meacutetodo Approval Voting os eleitores natildeo satildeo limitados pelo nuacutemero de candidatosem que podem votar por isso approval cada eleitor pode votar em todos os candidatos osquais ele aprova Apoacutes as votaccedilotildees o candidato com a maior quantidade de votos eacute eleitoSegundo Hamlin (2015) a cidade de Fargo na Dakota do Norte se tornou a primeiracidade nos EUA a colocar em praacutetica este sistema em suas eleiccedilotildees gerais em novembrode 2018 AVS tambeacutem eacute utilizado para eleger o secretaacuterio-geral das Naccedilotildees Unidas e emdiversas outras organizaccedilotildees

                              241 Exemplo

                              Na tabela 5 abaixo pode-se encontrar 8 perfis de eleitores com seus candidatos apro-vados e quantidade de eleitores que se encaixam no perfil Na tabela 6 temos o resultadoda contabilizaccedilatildeo dos votos destes perfis O candidato mais popular eacute o B que se encontraaprovado em 5 perfis distintos totalizando 60 votos ou aproximadamente 32

                              Tabela 5 ndash Exemplo AVS

                              Aprovaccedilotildees Ndeg de eleitoresA 20AB 16B 19

                              BDC 6CAB 7CD 15DC 5DCB 12

                              Tabela 6 ndash Resultado AVSCandidatos Total de votos

                              A 43B 60C 45D 38

                              242 Vantagens e Desvantagens do AVS

                              Aleacutem de simples este meacutetodo permite um niacutevel maior de expressividade aos eleitoresOnde no FPTP e TRS eles satildeo limitados pelo seu uacutenico voto aqui os eleitores tecircm aliberdade de demonstrar exatamente quais candidatos consideram aptos ou aceitaacuteveis aocargo

                              25

                              Outro efeito dessa liberdade trazida pelo AVS eacute a dizimaccedilatildeo do spoiler effect Can-didatos de partidos menores natildeo tem como roubar votos de partidos maiores nessesistema ambos os candidatos contabilizariam o voto

                              243 Voto Uacutetil no AVS

                              O tipo de voto uacutetil no AVS eacute denominado bullet voting Segundo The Center forElection Science (2015) esta taacutetica envolve simplesmente ignorar a possibilidade de votarem mais de um candidato e votar apenas em sua primeira opccedilatildeo Um eleitor pode serlevado a adotar essa estrateacutegia quando percebe que sua preferecircncia pode ser prejudicadacom o voto em alguma segunda opccedilatildeo sua Em um cenaacuterio extremo onde 100 doseleitores adotam esta estrateacutegia as eleiccedilotildees satildeo convertidas a um simples First Past ThePost

                              25 THE BORDA COUNT

                              Este meacutetodo carrega o nome em homenagem a seu criador Jean-Charles de Bordaque o desenvolveu em 1770 (LIPPMAN 2012) A contagem de Borda utiliza a abordagemde ranqueamento dos candidatos poreacutem de maneira diferente ao IRV Este eacute um sistemaque atribui uma pontuaccedilatildeo aos candidatos com base nestes rankings O candidato na basedo ranking natildeo recebe pontos o candidato imediatamente acima deste recebe 1 pontoo proacuteximo recebe 2 pontos e assim por diante ateacute o topo do ranking As pontuaccedilotildees detodos os rankings satildeo contabilizadas e o candidato com maior pontuaccedilatildeo eacute eleito Deacordo com Lippman variaccedilotildees deste meacutetodo satildeo encontradas em uso na premiaccedilatildeo dediversos esportes como na seleccedilatildeo do MVP(Most Valuable Player) da MLB(principal ligade beisebol dos EUA) e no Trofeacuteu Heisman de futebol americano universitaacuterio

                              251 Exemplo

                              Neste exemplo seratildeo aproveitados os mesmos rankings apresentados na tabela 3 Porserem 4 candidatos o primeiro colocado de cada ranking receberaacute 3 pontos o segundo 2pontos o terceiro 1 e o quarto 0 Assim o nuacutemero maacuteximo de pontos que um candidatopode atingir eacute igual a 300(se ficar na primeira posiccedilatildeo em todos os rankings) e o nuacutemerototal de pontos no sistema eacute 600 O nuacutemero maacuteximo de pontos que um candidato podeatingir eacute calculado com

                              (cminus 1)times e

                              Sendo c igual ao nuacutemero de candidatos e e o nuacutemero de eleitores Por sua vez onuacutemero total de pontos no sistema eacute

                              26

                              (cminus 1)times c2

                              times e

                              A contagem final dos pontos eacute apresentada na tabela 7 abaixo

                              Tabela 7 ndash Resultado BCCandidatos Total de pontos

                              A 146B 181C 126D 147

                              O candidato eleito eacute o B com 181 pontos ou aproximadamente 60 da pontuaccedilatildeomaacutexima

                              252 Vantagens e Desvantagens do BC

                              Em comparaccedilatildeo com os meacutetodos abordados anteriormente que apenas consideramas primeiras opccedilotildees de cada eleitor este meacutetodo regularmente escolhe candidatos comaceitaccedilatildeo mais ampla ao inveacutes de uma preferecircncia direta dos eleitores (Electoral ReformSociety 2017b)

                              Ele tambeacutem encoraja uma abordagem estrateacutegica por parte dos partidos onde seriade seu interesse nomear mais de um candidato para concorrer pois quanto mais candi-datos estatildeo no paacutereo maior eacute a pontuaccedilatildeo dos primeiros colocados Logo a nomeaccedilatildeo decandidatos menos populares pode beneficiar os principais candidatos de um partido

                              253 Voto Uacutetil no BC

                              Existem duas estrateacutegias aplicaacuteveis a esse sistema A primeira denominada compromi-sing de maneira similar a outros meacutetodos de votaccedilatildeo se resume em ranquear em primeirolugar um dos candidatos que estejam liderando as eleiccedilotildees mesmo que este natildeo seja suapreferecircncia real A segunda estrateacutegia burying eacute o oposto esta se baseia em ranquearem uacuteltimo lugar um dos candidatos liacutederes mesmo que este natildeo seja o seu candidato demaior desgosto Ambas estrateacutegias podem ser aplicadas ao mesmo tempo por um eleitor

                              26 SCORE VOTING SYSTEM

                              Score Voting ou Range Voting como tambeacutem eacute conhecido eacute mais um meacutetodo quetenta trazer maior liberdade de expressatildeo aos eleitores Assim como o Borda Counteste sistema funciona baseado na pontuaccedilatildeo dos candidatos no entanto ao inveacutes dessapontuaccedilatildeo ser relativa agrave posiccedilatildeo do candidato no ranking de cada eleitor este por sua veztem completa liberdade de atribuir qualquer quantidade de pontos aos candidatos dentro

                              27

                              de determinada escala Um eleitor pode dar o mesmo nuacutemero de pontos para diferentescandidatos e apoacutes o somatoacuterio de todas as pontuaccedilotildees o candidato com a pontuaccedilatildeo maisalta eacute eleito Incorporado ao escopo poliacutetico o SVS eacute utilizado no Partido Pirata Alematildeobem como em diversas organizaccedilotildees tais como o Fedora Project e Mozilla e tambeacutem emvariados esportes oliacutempicos e reality shows como o American Idol aponta Hamlin (2015)

                              261 Exemplo

                              Neste exemplo temos apresentados na tabela 8 abaixo 4 perfis distintos de eleitorese suas respectivas atribuiccedilotildees de pontos aos 4 candidatos Cada eleitor pode atribuirqualquer pontuaccedilatildeo a um candidato dentro da escala de -10 a 10 O resultado da eleiccedilatildeoapoacutes a soma de todos os pontos por candidato se encontra na tabela 9 onde o candidatoA eacute eleito com um total de 605 pontos

                              Tabela 8 ndash Exemplo SVS

                              Perfil A B C D Ndeg de eleitores1 10 -1 5 2 362 6 9 -3 4 253 2 0 8 4 224 3 3 3 10 17

                              Tabela 9 ndash Resultado SVSCandidatos Total de pontos

                              A 605B 240C 332D 430

                              262 Vantagens e Desvantagens do SVS

                              A grande vantagem do SVS eacute como ele proporciona aos eleitores expressar de maneiramuito proacutexima potencialmente exata suas impressotildees poliacuteticas de cada candidato Eleeacute ainda mais expressivo que o AVS Dessa maneira o spoiler effect tambeacutem se torna nuloao passo que toda intenccedilatildeo de voto eacute precisamente representada neste sistema

                              Assim como outros meacutetodos eleitorais este sofre igualmente dos males produzidos pelovoto taacutetico Sua principal desvantagem eacute discutida na seccedilatildeo abaixo

                              263 Voto Uacutetil no SVS

                              Da mesma maneira que no Approval Voting atraveacutes do bullet voting o SVS tambeacutempode ser convertido em uma eleiccedilatildeo sob o meacutetodo FPTP em um cenaacuterio com um grande

                              28

                              volume de eleitores maliciosos O voto uacutetil sob este sistema se manifesta pontuando-seapenas um candidato com uma nota positiva e todos os outros com as notas mais baixasda escala Se todos os eleitores se aproveitarem dessa abordagem natildeo existiraacute distinccedilatildeoefetiva entre uma eleiccedilatildeo sob SVS e FPTP Essencialmente cada eleitor estaacute votando emapenas um candidato Essa eacute a principal desvantagem do SVS e ela consegue eliminarsua principal vantagem dar ao eleitor um poder maior de expressatildeo

                              27 BLOC VOTE

                              O Bloc Vote eacute um meacutetodo utilizado para a eleiccedilatildeo de candidatos a cargos no governocom mais de uma vacacircncia Pode ser considerado um meio-termo entre o FPTP e oAVS pois os eleitores podem votar em mais de um candidato poreacutem satildeo limitados pelonuacutemero de vagas Em uma eleiccedilatildeo com duas vagas por exemplo cada eleitor selecionaraacutedois candidatos ou menos Sensatamente o candidato mais votado eacute eleito Ele possuialgumas utilizaccedilotildees em eleiccedilotildees locais em algumas partes da Inglaterra (Electoral ReformSociety 2017a)

                              271 Exemplo

                              Neste exemplo dois candidatos seratildeo eleitos logo cada eleitor votaraacute em no maacuteximodois candidatos A distribuiccedilatildeo de votos pode ser conferida na tabela 10 e o resultado dacontagem de votos na tabela 11 abaixo Os candidatos eleitos satildeo o C totalizando 78do maacuteximo de votos possiacuteveis para um candidato e o A com 43

                              Tabela 10 ndash Exemplo BV

                              Aprovaccedilotildees Ndeg de eleitoresAC 20AB 16BC 19BD 6CA 7CD 15DC 17

                              Tabela 11 ndash Resultado BVCandidatos Total de votos

                              A 43B 41C 78D 38

                              29

                              272 Voto Uacutetil no BV

                              Neste sistema eacute possiacutevel que um eleitor evite votar em sua primeira opccedilatildeo quandoeste natildeo tem chances de vitoacuteria e se fazendo isto ele diminuiraacute as chances de algum outrocandidato de seu desgosto ganhar Poreacutem o sistema previne um outro tipo de voto uacutetilEm eleiccedilotildees com mais de uma vaga onde os eleitores soacute podem votar em um candidatose um eleitor sabe que sua primeira opccedilatildeo tambeacutem eacute a primeira opccedilatildeo da maior parteda populaccedilatildeo e portanto muito provavelmente seraacute um dos candidatos eleitos eacute possiacutevelque ele arrisque votar em uma segunda opccedilatildeo sua na esperanccedila de a longo prazo elegersuas duas principais opccedilotildees de voto Com os eleitores podendo votar no nuacutemero exato devagas disponiacuteveis esse tipo de pensamento taacutetico perde o sentido

                              30

                              3 O SIMULADOR

                              Para este trabalho foi implementado um simulador eleitoral na forma de uma aplicaccedilatildeoweb para que a interaccedilatildeo do usuaacuterio fosse facilitada Veremos a seguir como se daacute suautilizaccedilatildeo de forma geral

                              Figura 2 ndash Captura de tela 1

                              Figura 3 ndash Captura de tela 2

                              A primeira opccedilatildeo encontrada pelo usuaacuterio eacute a escolha de quais sistemas de votaccedilatildeo se-ratildeo simulados (Figura 2) Todos eles podem ser selecionados para rodar simultaneamentePoreacutem natildeo eacute permitido rodar uma simulaccedilatildeo do Bloc Vote para uma eleiccedilatildeo onde apenasum candidato eacute eleito aleacutem disso natildeo existe implementaccedilatildeo dos meacutetodos TRS e IRV para

                              31

                              eleiccedilotildees com mais de um candidato eleito jaacute que eles se comportariam exatamente comono FPTP

                              A maioria das linguagens de programaccedilatildeo senatildeo todas possuem um gerador de nuacuteme-ros pseudoaleatoacuterios que fornece a possibilidade de definir uma seed para o gerador Estaseed funciona como um ponto de partida para a geraccedilatildeo dos nuacutemero e portanto todasimulaccedilatildeo que rodar com a mesma seed sempre teraacute os mesmos resultados Se nenhumvalor for fornecido pelo usuaacuterio o tempo atual do sistema eacute utilizado As opccedilotildees subse-quentes satildeo a escolha do nuacutemero de eleitores gerados e o nuacutemero de vagas (Figura 3) Senenhum valor for fornecido o nuacutemero de eleitores padratildeo utilizado eacute 1000 e o nuacutemero devagas igual a 1

                              Figura 4 ndash Captura de tela 3

                              Este simulador possui dois modos para a criaccedilatildeo dos rankings dos eleitores No modoManipulate (Figura 4) primeiramente se define o nuacutemero de candidatos atraveacutes do campode entrada ao lado do tiacutetulo Candidates ou alternativamente pode-se adicionar candida-tos um a um atraveacutes do sinal de mais na parte inferior da paacutegina Para cada candidatoeacute possiacutevel definir a porcentagem de seus eleitores que optaraacute pelo voto taacutetico e pelovoto de minoria Tambeacutem eacute possiacutevel alterar o nome dos candidatos se for do interessedo usuaacuterio

                              32

                              Figura 5 ndash Captura de tela 4

                              Figura 6 ndash Captura de tela 5

                              33

                              Figura 7 ndash Captura de tela 6

                              Apoacutes a criaccedilatildeo dos candidatos o usuaacuterio pode criar perfis de eleitores que definiratildeo demaneira exata como partes da populaccedilatildeo iraacute votar (Figura 5) Em cada perfil se defineo valor em porcentos da populaccedilatildeo votante que o adotaraacute e a nota de cada candidatoTambeacutem eacute possiacutevel nomear cada perfil livremente

                              No modo Generate (Figura 6) eacute onde o gerador de nuacutemeros pseudoaleatoacuterios eacute usadoNesse modo ao inveacutes do usuaacuterio criar perfis de eleitores ele define qual seraacute a distribuiccedilatildeoadotada para a geraccedilatildeo de notas de cada candidato Essas distribuiccedilotildees seratildeo mais bemdetalhadas no Capiacutetulo 5 Da mesma maneira que no modo Manipulate nesse modotambeacutem eacute possiacutevel definir os valores para os dois tipos de voto uacutetil os votos taacuteticos eos votos de minoria No primeiro estatildeo incluiacutedas as estrateacutegias de mudanccedila de votoespeciacuteficas de cada sistema como o bullet voting no AVS e SVS ou quando a preferecircnciade um eleitor claramente natildeo possui chances de vitoacuteria e ele muda seu voto para um doscandidatos que esteja na lideranccedila o que ocorre no FPTP e TRS O voto de minoriase apresenta apenas no FPTP em eleiccedilotildees onde mais de um candidato eacute eleito Se apreferecircncia de um eleitor claramente lidera a eleiccedilatildeo por ser tambeacutem a preferecircncia damaior parte da populaccedilatildeo esse eleitor pode mudar o seu voto para uma segunda opccedilatildeona esperanccedila de eleger dois de seus candidatos favoritos

                              Por fim em ambos os modos o usuaacuterio tem a opccedilatildeo de definir coalizotildees entre oscandidatos se o sistema TRS estiver habilitado pois as coalizotildees apenas se manifestamnesse sistema Essas coalizotildees alteraratildeo as notas dos candidatos dependendo dos outroscandidatos pertencentes a elas (Figura 7)

                              A aplicaccedilatildeo pode ser encontrada na paacutegina httpelectionsimpythonanywherecom

                              34

                              4 CENAacuteRIOS PERTINENTES

                              Para todos os cenaacuterios deste capiacutetulo seraacute usada a seed do simulador igual a 100 e apopulaccedilatildeo de eleitores igual a 1000 para que exista consistecircncia na anaacutelise e tambeacutem paraque possa haver replicaccedilatildeo dos resultados se necessaacuterio

                              41 CENAacuteRIO 1 VOTO TAacuteTICO

                              Neste exemplo teremos quatro candidatos Ana Beto Carla e Diego Ana e Betoseratildeo gerados a partir da distribuiccedilatildeo Neutral (Figura 47) Carla da distribuiccedilatildeo Disliked(Figura 51) e Diego da Hated (Figura 55) Para a simulaccedilatildeo com a seed 100 o melhorcandidato a ser eleito ou seja aquele que maximiza a meacutedia das notas dos eleitores eacute oBeto com uma meacutedia de 0073 Para cada sistema seratildeo comparados os resultados semvoto taacutetico aos com 20 de voto taacutetico a favor da Ana Abaixo se encontram osresultados para o sistema FPTP

                              Figura 8 ndash FPTP - Cenaacuterio 1 sem voto taacutetico

                              Figura 9 ndash TRS segundo turno - Cenaacuterio 1 sem voto taacutetico

                              35

                              Figura 10 ndash IRV primeiro turno - Cenaacuterio 1

                              Figura 11 ndash IRV segundo turno - Cenaacuterio 1

                              Figura 12 ndash IRV terceiro turno - Cenaacuterio 1

                              36

                              Figura 13 ndash AVS - Cenaacuterio 1 sem voto taacutetico

                              Figura 14 ndash BC - Cenaacuterio 1 sem voto taacutetico

                              Figura 15 ndash SVS - Cenaacuterio 1 sem voto taacutetico

                              37

                              Nesse cenaacuterio sem voto taacutetico o uacutenico sistema que natildeo elege o Beto eacute o AVS Todosos outros elegem o melhor candidato Ou seja apesar de Beto ter uma melhor meacutediadas notas dos eleitores existem mais eleitores que ranqueiam Ana com uma nota acimade 0 No entanto apenas 20 dos eleitores de Diego e Carla que preferem a Ana aoinveacutes do Beto satildeo o suficiente para fazer Beto natildeo ser eleito se eles decidirem abandonarsua primeira opccedilatildeo e votar na Ana Considerando a vantagem que os votos taacuteticosproporcionam agrave Ana esta eacute eleita em todos os sistemas menos o TRS e o IRV

                              Figura 16 ndash FPTP - Cenaacuterio 1 - 20 de voto taacutetico na Ana

                              Figura 17 ndash TRS segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                              38

                              Figura 18 ndash IRV primeiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                              Figura 19 ndash IRV segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                              Figura 20 ndash IRV terceiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                              39

                              Figura 21 ndash AVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                              Figura 22 ndash BC - Cenaacuterio 1 20 de voto taacutetico na Ana

                              Figura 23 ndash SVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                              40

                              Eacute claro que se os eleitores que preferem o Beto tambeacutem votassem de maneira estra-teacutegica a situaccedilatildeo se equilibraria e haveria o mesmo niacutevel de concorrecircncia entre os doiscandidatos que ocorre quando natildeo haacute voto taacutetico Poreacutem no Borda Count esse equiliacute-brio pode natildeo acontecer e as estrateacutegias de compromising e burying podem acabar saindopela culatra se uma porcentagem elevada dos eleitores as adotarem Abaixo encontram-seos resultados para esse sistema quando 100 dos eleitores de Carla e Diego se comportammaliciosamente

                              Figura 24 ndash BC - Cenaacuterio 1 100 de voto taacutetico na Ana e Beto

                              Por causa do uso demasiado da estrateacutegia burying Ana e Beto perdem muitos pontose isso abre espaccedilo para uma vitoacuteria da Carla No entanto para porcentagens menores que100 o Beto ainda eacute o vencedor

                              Essas duas estrateacutegias tambeacutem foram implementadas nesse simulador para o sistemaIRV e eacute possiacutevel ver como ele eacute resistente a elas Para que seja possiacutevel mudar os resultadosde uma eleiccedilatildeo sob o IRV eacute necessaacuterio mudar a ordem de eliminaccedilatildeo dos candidatos paraque o seu candidato preferido acabe enfrentando um candidato mais fraco nas rodadasfinais Isso natildeo ocorre com compromising e burying No proacuteximo cenaacuterio seraacute analisadacomo eacute possiacutevel modificar os resultados de uma eleiccedilatildeo sob o IRV

                              Esses resultados podem ser replicados acessando os linksSem votos taacuteticos lthttpelectionsimpythonanywherecomdirect_res1111110

                              --[0021][22Ana2222Beto222022Carla2222Diego22]------100gt

                              Com 20 de voto taacutetico lthttpelectionsimpythonanywherecomdirect_res1111110--[0021][22Ana222022Beto2222Carla2222Diego22]1-[02000]---100gt

                              Com 100 de voto taacuteticona Ana e Beto lthttpelectionsimpythonanywherecomdirect_res0000100--[0021][22Ana222022Beto222022Carla2222Diego22]1-[101000]---100gt

                              41

                              42 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV

                              Neste cenaacuterio teremos Ana Carla e Beto concorrendo e trecircs perfis distintos que apoiamcada candidato As distribuiccedilotildees de notas dos perfis se encontram na tabela abaixo

                              Tabela 12 ndash Distribuiccedilatildeo de notas - Cenaacuterio 2

                              Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                              deeleitores

                              1 10 5 0 422 0 10 5 303 5 0 10 28

                              Com essas distribuiccedilotildees Carla eacute eliminada na primeira rodada e seus 28 de votossatildeo transferidos para a segunda opccedilatildeo de seus eleitores Ana que eacute eleita com 70 dosvotos e uma meacutedia de 56

                              Figura 25 ndash IRV primeiro turno - Cenaacuterio 2

                              Figura 26 ndash IRV segundo turno - Cenaacuterio 2

                              42

                              Cientes desse provaacutevel futuro cenaacuterio onde Ana eacute eleita uma pequena parte dos elei-tores de Beto estrategicamente o abandona e decide apoiar Carla na esperanccedila de leva-laao segundo turno contra Ana As novas distribuiccedilotildees de notas se encontram na tabelaabaixo com essa porccedilatildeo de eleitores representada pelo perfil 4

                              Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2

                              Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                              deeleitores

                              1 10 5 0 422 0 10 5 283 5 0 10 284 0 8 10 2

                              Essa mudanccedila estrateacutegica de voto altera a ordem de eliminaccedilotildees do sistema com Betosendo o primeiro a ser eliminado Com isso seus votos satildeo naturalmente transferidos paraCarla que derrota Ana no segundo turno com 58 dos votos

                              Figura 27 ndash IRV primeiro turno com voto taacutetico - Cenaacuterio 2

                              Figura 28 ndash IRV segundo turno com voto taacutetico - Cenaacuterio 2

                              43

                              Percebendo que a eleiccedilatildeo de Beto natildeo era provaacutevel seus eleitores conseguiram aomenos impedir a eleiccedilatildeo do pior candidato para eles Mas para isso foi necessaacuterio queeles tivessem a informaccedilatildeo de como os outros eleitores votariam Uma aproximaccedilatildeo dessasinformaccedilotildees poderia ser obtida em um cenaacuterio real com poucos candidatos atraveacutes depesquisas eleitorais poreacutem se o nuacutemero de candidatos eacute significativo uma noccedilatildeo completadas distribuiccedilotildees dos rankings dos eleitores se torna muito menos viaacutevel e dificulta aformulaccedilatildeo de estrateacutegias para alterar a ordem em que os candidatos satildeo eliminados

                              Esses resultados podem ser replicados acessando os linksSem voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana22

                              22Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                              Com voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana

                              2222Beto2222Carla22]-----42Voter20Profile2001020520028Voter20Profile2010201020528Voter20Profile202520020102Voter20Profile20302082010100gt

                              43 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE

                              O interessante dos sistemas IRV e TRS eacute que os resultados do cenaacuterio anterior po-deriam ter sido obtidos ao inveacutes do voto taacutetico pela sua natildeo-monotonicidade Seriapossiacutevel que a Carla derrotasse a Ana no segundo turno atraveacutes do proacuteprio aumento depopularidade da Ana Assumindo que essa popularizaccedilatildeo ocorresse entre os candidatosdo perfil 2 onde 3 passasse a apoiar a Ana ao inveacutes do Beto as novas distribuiccedilotildeesseguiriam a tabela abaixo

                              Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                              Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                              deeleitores

                              1 10 5 0 452 0 10 5 273 5 0 10 28

                              Dessa maneira Beto agora com uma porcentagem dos eleitores menor do que a deCarla seraacute eliminado na primeira rodada e como seus eleitores tecircm a Carla como segundaopccedilatildeo ela receberaacute todos os seus votos e seraacute eleita na segunda rodada As rodadas doIRV podem ser vistas nas figuras 29 e 30

                              44

                              Figura 29 ndash IRV primeiro turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                              Figura 30 ndash IRV segundo turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                              Tabela 15 ndash Resultados do Cenaacuterio 3Candidato

                              eleitoMeacutedia das

                              notasAntes da

                              popularizaccedilatildeode Ana

                              Ana 56

                              Apoacutespopularizaccedilatildeo

                              de AnaCarla 415

                              Os efeitos dessa caracteriacutestica se refletem na satisfaccedilatildeo meacutedia da populaccedilatildeo A Ana eacuteclaramente a melhor candidata e mesmo com o seu ganho de popularidade (ou devido aele) a Carla eacute eleita

                              Esses resultados podem ser replicados acessando os linksAntes da popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecom

                              direct_res0010000---[22Ana2222Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                              45

                              Apoacutes popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana2222Beto2222Carla22]-----45Voter20Profile2001020520027Voter20Profile2010201020528Voter20Profile20252002010100gt

                              44 CENAacuteRIO 4 COALIZOtildeES

                              O TRS por ser organizado em dois turnos separados normalmente a semanas dedistacircncia um do outro acaba abrindo brecha agrave mudanccedila de opiniatildeo por parte dos eleitorese o desenvolvimento de novas estrateacutegias por parte dos candidatos tais como a coalizatildeocom candidatos jaacute eliminados Com isso em mente nesse cenaacuterio teremos novamenteos quatro candidatos Ana Beto Carla e Diego Os trecircs primeiros seratildeo gerados dadistribuiccedilatildeo Neutral e Diego da distribuiccedilatildeo Disliked

                              Figura 31 ndash TRS turno 1 - Cenaacuterio 4

                              No TRS normal Ana Beto e Carla possuem com essas distribuiccedilotildees quantidades devotos muito proacuteximas com Beto e Carla indo para o segundo turno Carla estaacute 10 votosatraacutes de Beto e decide aproveitar o espaccedilo de tempo entre os dois turnos para tentaragregar mais votos Com isso Carla se aproxima de Diego e juntos formam uma coalizatildeoNo entanto com sua baixa popularidade Diego acaba ferindo a reputaccedilatildeo de Carla etorna o segundo turno muito mais faacutecil para Beto (Figura 33) Se Carla tivesse buscado osuporte de Ana por outro lado ela se veria vitoriosa no segundo turno e com uma amplavantagem sobre o Beto (Figura 34) Ou ateacute mesmo sem buscar uma coalizatildeo mesmosendo uma corrida apertada Carla teria naturalmente sido eleita (Figura 32)

                              Esses resultados podem ser replicados acessando os linksSem coalizotildees lthttpelectionsimpythonanywherecomdirect_res0100000

                              --[0002][22Ana222022Beto2222Carla2222Diego22]------100gt

                              46

                              Figura 32 ndash TRS turno 2 - Cenaacuterio 4

                              Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4

                              Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4

                              47

                              Coalizatildeo Carla e Diego lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2203Carla20Diego-100gt

                              Coalizatildeo Carla e Ana lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2200Carla20Ana-100gt

                              45 CENAacuteRIO 5 DILEMA DO PRISIONEIRO

                              Neste cenaacuterio temos uma eleiccedilatildeo de uma vaga com trecircs candidatos concorrentes e trecircsperfis distintos de eleitores que seguiratildeo as seguintes distribuiccedilotildees

                              Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5

                              Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                              deeleitores

                              1 10 -10 5 362 -10 10 5 343 -10 -10 5 30

                              Esse contexto nos remete ao notaacutevel dilema do prisioneiro Nele dois prisioneiroscuacutemplices satildeo interrogados individualmente sem poder se comunicar um com o outro ecada um enfrenta o dilema de delatar ou natildeo o seu parceiro Se os dois prisioneirosdecidem se manter calados sobre o crime ambos satildeo sentenciados a um ano de prisatildeo Seapenas um deles dedurar o outro o traidor sai livre enquanto seu parceiro eacute condenadoa trecircs anos Se ambos dedurarem um ao outro eles satildeo condenados juntos a dois anosde prisatildeo Esse dilema eacute uma ideia claacutessica presente no estudo da teoria dos jogos sendooriginalmente elaborada por Merrill Flood e Melvin Dresher em 1950 e mais tarde sendonomeada de dilema dos prisioneiros por Albert W Tucker (POUNDSTONE 1992)

                              O que esse dilema nos mostra eacute a tentaccedilatildeo que o indiviacuteduo deteacutem se sua racionalizaccedilatildeoestiver voltada para seus proacuteprios interesses e somente eles em oposiccedilatildeo a pensar no bemdo grupo como um todo Neste cenaacuterio encontramos dois grupos de eleitores expressiva-mente opostos os perfis 1 e 2 Se qualquer uma das preferecircncias desses perfis fosse eleitaisso significaria uma alta rejeiccedilatildeo de maior parte da populaccedilatildeo No entanto eles possuema segunda opccedilatildeo em comum a Carla que por sua vez eacute a preferecircncia do terceiro perfilPortanto a eleiccedilatildeo da Carla seria logicamente o resultado oacutetimo

                              Mesmo assim a Ana eacute eleita nos dois sistemas acima o que natildeo parece justo poispela tabela 16 eacute evidente que apenas 36 da populaccedilatildeo a aprova enquanto que os outros64 a reprovam ao maacuteximo O sistema IRV se comporta de maneira idecircntica ao TRS

                              48

                              Figura 35 ndash FPTP - Cenaacuterio 5

                              Figura 36 ndash TRS segundo turno - Cenaacuterio 5

                              nesta situaccedilatildeo Com esse resultado a meacutedia das notas eacute -28 No entanto os trecircs sistemasseguintes nos apresentam resultados diferentes

                              Tabela 17 ndash Resultados do Cenaacuterio 5

                              Sistema Candidatoeleito

                              Meacutedia dasnotas

                              FPTP Ana -28TRS Ana -28IRV Ana -28AVS Carla 50BC Carla 50SVS Carla 50

                              49

                              Figura 37 ndash AVS - Cenaacuterio 5

                              Figura 38 ndash BC - Cenaacuterio 5

                              Tanto o AVS quanto o Borda Count e o SVS satildeo sistemas que consideram todasas opiniotildees de cada eleitor ao mesmo tempo e por isso satildeo capazes de eleger o melhorcandidato nesta situaccedilatildeo diferentemente do TRS que natildeo absorve completamente todosentimento do eleitor por todos os candidatos e o IRV que apesar de ser bem expressivoquebra esse processo em inuacutemeras rodadas o que permite a perda de informaccedilatildeo ao longodelas

                              Esses resultados podem ser replicados acessando o linklthttpelectionsimpythonanywherecomdirect_res1111110---[22Ana

                              222022Beto222022Carla22]-----36Voter20Profile2001020-1020534Voter20Profile201-10201020530Voter20Profile202-1020-10205100gt

                              50

                              Figura 39 ndash SVS - Cenaacuterio 5

                              46 CENAacuteRIO 6 VOTO DE MINORIA

                              Neste cenaacuterio temos uma eleiccedilatildeo com quatro candidatos e duas vagas A Ana seraacutea preferecircncia de uma extensa parte da populaccedilatildeo (distribuiccedilatildeo Loved Figura 53) Betoe Carla seratildeo candidatos razoavelmente populares (distribuiccedilatildeo Neutral Figura 47) eDiego seraacute a preferecircncia de apenas um pequeno grupo especiacutefico e rejeitado pela maioria(distribuiccedilatildeo Disliked Figura 51) Eacute intuitivo esperar que os dois candidatos eleitos seratildeoa Ana e ou o Beto ou a Carla e isso eacute exatamente o que ocorre na figura 40 no sistemaFPTP sem voto de minoria

                              Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria

                              Eacute evidente a discrepacircncia da quantidade de votos da Ana para os outros candidatose apesar de Beto e Carla serem mais populares que Diego os trecircs natildeo se encontrammuito afastados Poreacutem se a pequena fraccedilatildeo de candidatos que possuem a Ana como

                              51

                              Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego

                              preferecircncia e Diego como segunda opccedilatildeo optarem pelo voto de minoria a situaccedilatildeo mudacompletamente (Figura 41) Assim apesar de extensamente rejeitado Diego conquistaa segunda vaga e a meacutedia das notas despenca de 2929 para 0505 No entanto aindaexiste um cenaacuterio pior Se os outros grupos de eleitores pensarem da mesma forma eevitarem votar na Ana achando que sua eleiccedilatildeo jaacute estaacute assegurada apenas 80 de votode minoria para esses grupos jaacute eacute o suficiente para eliminaacute-la das eleiccedilotildees (Figura 42)Com a Ana eliminada a meacutedia das notas cai ainda mais para 0058

                              Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego

                              O sistema Bloc Vote eacute uma das soluccedilotildees para o voto de minoria Permitindo queos eleitores votem no mesmo nuacutemero de candidatos que de vagas a serem preenchidasnatildeo existe o iacutempeto a esse tipo de voto estrateacutegico O resultado desse sistema portantoretorna a meacutedia das notas a casa dos 29 (Figura 43) Os sistemas AVS Borda Count eSVS tambeacutem impedem a presenccedila do voto de minoria e atingem resultados semelhantes

                              52

                              Figura 43 ndash BV - Cenaacuterio 6

                              Tabela 18 ndash Resultados do Cenaacuterio 6

                              Sistema Candidatoseleitos

                              Meacutedia dasnotas

                              FPTP sem voto de minoriaAna eBeto 2929

                              FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

                              FPTP com 80 de voto de minoriaBeto eCarla 0058

                              Bloc VoteAna eCarla 2913

                              Esses resultados podem ser replicados acessando os links

                              Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

                              100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

                              80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

                              53

                              5 COMO FUNCIONA O SIMULADOR

                              O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

                              51 CLASSE ELECTIONS

                              Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

                              bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

                              Figura 44 ndash estrutura candidates

                              bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

                              bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

                              Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

                              Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

                              54

                              Figura 45 ndash estrutura voters

                              Figura 46 ndash estrutura votes

                              daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

                              Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

                              55

                              Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

                              Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

                              na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

                              56

                              Figura 49 ndash PDF - Distribuiccedilatildeo Liked

                              Figura 50 ndash CDF - Distribuiccedilatildeo Liked

                              (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

                              Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

                              57

                              Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

                              Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

                              candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

                              Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

                              58

                              Figura 53 ndash PDF - Distribuiccedilatildeo Loved

                              Figura 54 ndash CDF - Distribuiccedilatildeo Loved

                              funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

                              59

                              Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                              Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                              Meacutedia das Notas sumei

                              sumvj nij

                              etimes v

                              Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                              Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                              60

                              Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                              Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                              52 CLASSE FIRSTPASTTHEPOST

                              Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                              Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                              61

                              Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                              Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                              mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                              62

                              53 CLASSE TWOROUNDSYSTEM

                              A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                              54 CLASSE INSTANTRUNOFFVOTING

                              A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                              Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                              63

                              cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                              55 CLASSE APPROVALVOTING

                              Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                              56 CLASSE BORDACOUNT

                              Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                              57 CLASSE SCOREVOTING

                              De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                              64

                              58 CLASSE BLOCVOTE

                              O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                              59 TECNOLOGIAS UTILIZADAS

                              A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                              Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                              O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                              Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                              65

                              6 CONCLUSAtildeO

                              Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                              Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                              Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                              Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                              Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                              66

                              REFEREcircNCIAS

                              AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                              Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                              Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                              Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                              HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                              LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                              ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                              Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                              POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                              The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                              67

                              APEcircNDICES

                              APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                              Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                              if(not len(selfvoter_profiles))

                              for voter in range(selfN_VOTERS)

                              candidates_rank = dict()

                              for candidate in reversed(range(selfN_CANDIDATES))

                              if(selfBIAS_VECTOR[candidate]==4)

                              candidates_rank[candidate] = self_sortear(selfloved)

                              elif(selfBIAS_VECTOR[candidate]==3)

                              candidates_rank[candidate] = self_sortear(selfliked)

                              elif(selfBIAS_VECTOR[candidate]==2)

                              candidates_rank[candidate] = self_sortear(selfdisliked)

                              elif(selfBIAS_VECTOR[candidate]==1)

                              candidates_rank[candidate] = self_sortear(selfhated)

                              elif(selfBIAS_VECTOR[candidate]==-1)

                              candidates_rank[candidate] = self_sortear(selfpolarizer

                              )

                              elif(selfBIAS_VECTOR[candidate]==-2)

                              candidates_rank[candidate] = self_sortear(self

                              more_polarizer)

                              else

                              candidates_rank[candidate] = self_sortear(selfneutral)

                              selfvotersappend(candidates_rank)

                              else

                              ranges = []

                              ranks = []

                              for prof in selfvoter_profiles

                              rangesappend(int(prof[pop_percentage]))

                              rank =

                              for index score in enumerate(prof[scores])

                              rank[index] = score

                              ranksappend(rank)

                              for index _range in enumerate(ranges)

                              for _ in range(int(selfN_VOTERS(_range100)))

                              selfvotersappend(ranks[index])

                              68

                              APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                              Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                              for i in range(selfN_CANDIDATES)

                              selfcandidates[i] = 0

                              selfvotes[i] = set()

                              APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                              Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                              for candidate in range(selfN_CANDIDATES)

                              rating_sum = 0

                              for voter in selfvoters

                              rating_sum += voter[candidate]

                              selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                              APEcircNDICE D ndash MEacuteTODO GET_MEAN

                              Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                              if len(winners) gt 1 or selfN_CANDIDATES gt 10

                              return selfcalculate_mean(winners)

                              else

                              chose_best = True if winners[0] == selfbest_candidate else

                              False

                              return selfstats[rsquomeansrsquo][winners[0]] chose_best

                              69

                              APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                              Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                              rating_sum = 0

                              for voter in selfvoters

                              for candidate in winners

                              rating_sum += voter[candidate]

                              return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                              APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                              Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                              for i in range(1 selfN_VACANCIES + 2)

                              selfleading_candidatesappend(selfsorted_candidates[-i][self

                              CANDIDATE_INDEX])

                              APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                              Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                              for leader in selfelecrounds[-1]

                              selfleading_candidatesappend(leader[0])

                              70

                              APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                              Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                              self_account_for_coalitions()

                              for voter in selfvoters

                              selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                              (1)))

                              temp = []

                              for voter in selfsorted_voters

                              new_dict = defaultdict(list)

                              for k in voter

                              new_dict[k[1]]append(k[0])

                              tempappend(new_dict)

                              selfsorted_voters = []

                              for voter_index current_voter in enumerate(temp)

                              new_voter = []

                              for rating candidate_indexes in current_voteritems()

                              if len(current_voter[rating]) gt 1

                              shuffle(current_voter[rating])

                              for e in candidate_indexes

                              new_voterappend((e rating))

                              else

                              new_voterappend((candidate_indexes[0] rating))

                              selfsorted_votersappend(new_voter)

                              selfcandidates[new_voter[-1][0]] += 1

                              selfvotes[new_voter[-1][0]]add(voter_index)

                              71

                              APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                              Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                              for candidate in selfvotes_copy

                              if candidate not in selfelecleading_candidates

                              for voter_index in selfvotes_copy[candidate]

                              for index _candidate in enumerate(reversed(selfelec

                              sorted_voters[voter_index]))

                              if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                              leading_candidates

                              if randomrandom() lt selfelec

                              tactical_vote_percentages[_candidate[selfelec

                              CANDIDATE_INDEX]]

                              selfrankings_changed[voter_index] = copy

                              deepcopy(selfelecsorted_voters[voter_index])

                              selfrankings_changed[voter_index][-(index + 1)]

                              selfrankings_changed[voter_index][-1] = self

                              rankings_changed[voter_index][-1] self

                              rankings_changed[voter_index][-(index + 1)]

                              selfcandidates[candidate] -= 1

                              selfcandidates[_candidate[selfelec

                              CANDIDATE_INDEX]] += 1

                              selfvotes[candidate]remove(voter_index)

                              selfvotes[_candidate[selfelecCANDIDATE_INDEX

                              ]]add(voter_index)

                              break

                              break

                              72

                              APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                              Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                              half_vacancies = mathfloor(selfelecN_VACANCIES2)

                              for candidate in selfelecleading_candidates

                              if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                              continue

                              for voter_index in selfvotes_copy[candidate]

                              if voter_index in selfrankings_changed

                              ranking = selfrankings_changed[voter_index]

                              else

                              ranking = copydeepcopy(selfelecsorted_voters[voter_index

                              ])

                              for index _candidate in enumerate(reversed(ranking))

                              if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                              leading_candidates or (_candidate[selfelec

                              CANDIDATE_INDEX] in selfelecleading_candidates and

                              selfelecleading_candidatesindex(_candidate[selfelec

                              CANDIDATE_INDEX]) gt= half_vacancies)

                              if _candidate[selfelecCANDIDATE_RANK] gt= 0

                              if randomrandom() lt selfelec

                              minority_vote_percentages[_candidate[selfelec

                              CANDIDATE_INDEX]]

                              selfcandidates[candidate] -= 1

                              selfcandidates[_candidate[selfelec

                              CANDIDATE_INDEX]] += 1

                              break

                              break

                              break

                              73

                              APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                              Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                              self_account_for_coalitions()

                              for candidate in selfvotes

                              if candidate = selfwinner and candidate = selfsecond_place

                              for voter_index in selfvotes[candidate]

                              if voter_index in selfrankings_changed

                              ranking = selfrankings_changed[voter_index]

                              else

                              ranking = copydeepcopy(selfelecsorted_voters[

                              voter_index])

                              for index2 candidate in enumerate(reversed(ranking))

                              if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                              selfcandidates[selfwinner] += 1

                              selfvotes[selfwinner]add(voter_index)

                              break

                              elif candidate[selfelecCANDIDATE_INDEX] == self

                              second_place

                              selfcandidates[selfsecond_place] += 1

                              selfvotes[selfsecond_place]add(voter_index)

                              break

                              selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                              winners = []

                              vacancies = selfelecN_VACANCIES

                              for candidate in reversed(selfsorted_candidates)

                              if vacancies == 0

                              break

                              winnersappend(candidate[0])

                              vacancies -= 1

                              mean chose_best = selfelecget_mean(winners = winners)

                              74

                              APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                              Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                              for voter_index voter in enumerate(selfelecsorted_voters)

                              voter_dict = dict()

                              og_voter_dict = dict()

                              for tup in voter

                              voter_dict[tup[0]] = tup[1]

                              og_voter_dict[tup[0]] = tup[1]

                              for coalition in selfeleccoalitions

                              for candidate in coalition

                              add_to_score = 0

                              for candidate2 in coalition

                              if candidate == candidate2

                              continue

                              half = og_voter_dict[candidate2[rsquovaluersquo]]2

                              if half lt 0

                              add_to_score += mathceil(half)

                              else

                              add_to_score += mathfloor(half)

                              if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                              voter_dict[candidate[rsquovaluersquo]] = 10

                              elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                              voter_dict[candidate[rsquovaluersquo]] = -10

                              else

                              voter_dict[candidate[rsquovaluersquo]] += add_to_score

                              selfrankings_changed[voter_index] = []

                              for candidate in voter_dict

                              selfrankings_changed[voter_index]append((candidate voter_dict[

                              candidate]))

                              selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                              voter_index] key=lambda x x[1])

                              75

                              APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                              Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                              selfelecroundsappend(selfsorted_candidates[_round])

                              if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                              N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                              N_VACANCIES - 1)

                              return 2

                              elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                              N_VOTERS gt 05)

                              return 1

                              else

                              selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                              CANDIDATE_INDEX])

                              for voter_index in selfvotes[selfsorted_candidates[_round][self

                              elecCANDIDATE_INDEX]]

                              if voter_index in selfrankings_changed

                              for candidate in reversed(selfrankings_changed[voter_index

                              ])

                              if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                              excluded

                              selfcandidates[candidate[selfelecCANDIDATE_INDEX

                              ]] += 1

                              selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                              add(voter_index)

                              break

                              else

                              continue

                              else

                              for candidate in reversed(selfelecsorted_voters[

                              voter_index])

                              if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                              excluded

                              selfcandidates[candidate[selfelecCANDIDATE_INDEX

                              ]] += 1

                              selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                              add(voter_index)

                              break

                              else

                              continue

                              selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                              return 0

                              76

                              APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                              Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                              for index in range(selfelecN_CANDIDATES)

                              selfcandidates[index] = 0

                              for voter in selfelecsorted_voters

                              for candidate in reversed(voter)

                              if candidate[selfelecCANDIDATE_SCORE] gt 0

                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                              else

                              break

                              APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                              Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                              for index in range(selfelecN_CANDIDATES)

                              selfcandidates[index] = 0

                              for voter in selfelecsorted_voters

                              if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                              elecCANDIDATE_INDEX]]

                              selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                              else

                              for candidate in reversed(voter)

                              if candidate[selfelecCANDIDATE_SCORE] gt 0

                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                              else

                              break

                              77

                              APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                              Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                              pos = set()

                              for index perc in enumerate(selfelectactical_vote_percentages)

                              if perc gt 0

                              posadd(index)

                              for candidate in selfeleccandidates

                              if candidate not in selfleading_candidates

                              for voter_index in selfvotes[candidate]

                              raised = None

                              for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                              ])

                              if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                              leading_candidates

                              if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                              if randomrandom() lt selfelectactical_vote_percentages[

                              candidate_tuple[selfelecCANDIDATE_INDEX]]

                              ranking = [None]selfelecN_CANDIDATES

                              ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                              selfelecvoters[voter_index][candidate_tuple[selfelec

                              CANDIDATE_INDEX]])

                              raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                              break

                              break

                              break

                              if raised = None

                              for _candidate in selfleading_candidates

                              if _candidate = ranking[-1][0]

                              ranking[0] = (_candidate selfelecvoters[voter_index][

                              _candidate])

                              buried = _candidate

                              break

                              i = 1

                              for candidate_tuple in selfelecsorted_voters[voter_index]

                              if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                              buried]

                              continue

                              else

                              ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                              selfelecvoters[voter_index][candidate_tuple[selfelec

                              CANDIDATE_INDEX]])

                              i += 1

                              selfrankings_changed[voter_index] = ranking

                              78

                              APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                              Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                              for voter_index in selfvotes[candidate]

                              if randomrandom() lt selfelectactical_vote_percentages[candidate

                              ]

                              for _candidate in selfleading_candidates

                              if _candidate = candidate

                              ranking = [None]selfelecN_CANDIDATES

                              ranking[0] = (_candidate selfelecvoters[voter_index][

                              _candidate])

                              buried = _candidate

                              break

                              i = 1

                              for candidate_tuple in selfelecsorted_voters[voter_index]

                              if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                              continue

                              else

                              ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                              selfelecvoters[voter_index][candidate_tuple[selfelec

                              CANDIDATE_INDEX]])

                              i += 1

                              selfrankings_changed[voter_index] = ranking

                              79

                              APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                              Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                              for index in range(selfelecN_CANDIDATES)

                              selfcandidates[index] = 0

                              for voter_index voter in enumerate(selfelecsorted_voters)

                              score = 0

                              if voter_index in selfrankings_changed

                              for candidate in selfrankings_changed[voter_index]

                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                              score += 1

                              else

                              for candidate in voter

                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                              score += 1

                              APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                              Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                              for voter_index voter in enumerate(selfelecsorted_voters)

                              if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                              elecCANDIDATE_INDEX]]

                              selfrankings_changed[voter_index] = copydeepcopy(selfelec

                              sorted_voters[voter_index])

                              for candidate_index candidate in enumerate(reversed(voter))

                              if candidate_index == 0

                              selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                              voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                              else

                              selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                              voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                              80

                              APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                              Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                              for index in range(selfelecN_CANDIDATES)

                              selfcandidates[index] = 0

                              for voter_index voter in enumerate(selfelecsorted_voters)

                              if voter_index in selfrankings_changed

                              for candidate in selfrankings_changed[voter_index]

                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                              selfelecCANDIDATE_RANK]

                              else

                              for candidate in voter

                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                              selfelecCANDIDATE_RANK]

                              APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                              Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                              for index in range(selfelecN_CANDIDATES)

                              selfcandidates[index] = 0

                              for voter in selfelecsorted_voters

                              votes = selfelecN_VACANCIES

                              for candidate in reversed(voter)

                              if votes == 0

                              break

                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                              votes -= 1

                              • Folha de aprovaccedilatildeo
                              • Agradecimentos
                              • Epiacutegrafe
                              • Resumo
                              • Abstract
                              • Lista de ilustraccedilotildees
                              • Lista de Coacutedigos
                              • Lista de tabelas
                              • Lista de abreviaturas e siglas
                              • Sumaacuterio
                              • INTRODUCcedilAtildeO
                                • MOTIVACcedilAtildeO E OBJETIVO
                                • MEacuteTODO
                                • ESTRUTURA
                                  • SISTEMAS ELEITORAIS
                                    • FISRT PAST THE POST
                                      • Exemplo
                                      • Vantagens e Desvantagens do FPTP
                                      • Voto Uacutetil no FPTP
                                        • TWO-ROUND SYSTEM
                                          • Exemplo
                                          • Vantagens e Desvantagens do TRS
                                          • Voto Uacutetil no TRS
                                            • INSTANT-RUNOFF VOTING
                                              • Exemplo
                                              • Vantagens e Desvantagens do IRV
                                              • Voto Uacutetil no IRV
                                                • APPROVAL VOTING SYSTEM
                                                  • Exemplo
                                                  • Vantagens e Desvantagens do AVS
                                                  • Voto Uacutetil no AVS
                                                    • THE BORDA COUNT
                                                      • Exemplo
                                                      • Vantagens e Desvantagens do BC
                                                      • Voto Uacutetil no BC
                                                        • SCORE VOTING SYSTEM
                                                          • Exemplo
                                                          • Vantagens e Desvantagens do SVS
                                                          • Voto Uacutetil no SVS
                                                            • BLOC VOTE
                                                              • Exemplo
                                                              • Voto Uacutetil no BV
                                                                  • O SIMULADOR
                                                                  • CENAacuteRIOS PERTINENTES
                                                                    • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                    • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                    • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                    • CENAacuteRIO 4 COALIZOtildeES
                                                                    • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                    • CENAacuteRIO 6 VOTO DE MINORIA
                                                                      • COMO FUNCIONA O SIMULADOR
                                                                        • CLASSE Elections
                                                                        • CLASSE FirstPastThePost
                                                                        • CLASSE TwoRoundSystem
                                                                        • CLASSE InstantRunoffVoting
                                                                        • CLASSE ApprovalVoting
                                                                        • CLASSE BordaCount
                                                                        • CLASSE ScoreVoting
                                                                        • CLASSE BlocVote
                                                                        • TECNOLOGIAS UTILIZADAS
                                                                          • CONCLUSAtildeO
                                                                          • Referecircncias
                                                                          • Meacutetodo create_voters
                                                                          • Meacutetodo create_candidates
                                                                          • Meacutetodo calculate_means
                                                                          • Meacutetodo get_mean
                                                                          • Meacutetodo calculate_mean
                                                                          • Meacutetodo set_leading_candidates
                                                                          • Meacutetodo irv_set_leading_candidates
                                                                          • Meacutetodo sort_ranks
                                                                          • Meacutetodo fptp_count_tactical_votes
                                                                          • Meacutetodo fptp_count_minority_votes
                                                                          • Meacutetodo trs_second_round
                                                                          • Meacutetodo trs_account_for_coalitions
                                                                          • Meacutetodo irv_count_votes
                                                                          • Meacutetodo avs_count_votes
                                                                          • Meacutetodo avs_count_votes_with_tactical
                                                                          • Meacutetodo irv_apply_tactical_votes
                                                                          • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                          • Meacutetodo bc_sum_candidates_scores
                                                                          • Meacutetodo svs_apply_tactical_votes
                                                                          • Meacutetodo svs_sum_candidates_scores
                                                                          • Meacutetodo bv_count_votes

                                16

                                No Capiacutetulo 4 os sistemas seratildeo colocados em teste Todos seratildeo simulados em cenaacuteriosespeciacuteficos a fim de fazer sobressair aqueles com as maiores taxas de satisfaccedilatildeo meacutedia

                                A estrutura e implementaccedilatildeo do simulador seratildeo abordadas em detalhes no Capiacutetulo5 assim como uma breve descriccedilatildeo da stack utilizada Todos os meacutetodos relevantes aofuncionamento das simulaccedilotildees seratildeo explicados passo a passo

                                No Capiacutetulo 6 seratildeo apresentadas as conclusotildees referentes agrave anaacutelise dos resultadosobtidos no Capiacutetulo 4 e as consideraccedilotildees finais do projeto como um todo

                                17

                                2 SISTEMAS ELEITORAIS

                                Atualmente mais e mais paiacuteses estatildeo adotando sistemas democraacuteticos de governoCerca de 6 em 10 governos no mundo satildeo democracias (Pew Research Center 2017) o quepode ser observado na Figura 1 abaixo Em um sistema democraacutetico a populaccedilatildeo escolheseus liacutederes atraveacutes de seu sistema eleitoral Existem diversos sistemas eleitorais em usono mundo muitos dos quais satildeo usados em conjunto para eleger um uacutenico candidato Emvaacuterios paiacuteses mais de um sistema eleitoral pode ser utilizado tambeacutem em diferentes niacuteveisde governo tanto presidencial quanto estadual ou municipal Natildeo apenas imersos nomeio poliacutetico eles tambeacutem podem ser usados em escopos menores como em esportes oucompeticcedilotildees artiacutesticas poreacutem sempre com a finalidade de alocar um ou mais indiviacuteduosa determinado cargo ou tiacutetulo

                                Figura 1 ndash de paiacuteses de cada tipo de regime 1946-2016

                                Fonte Center of Systemic Peacersquos Polity IV Project

                                Os proacuteximos trecircs toacutepicos discutidos neste capiacutetulo referentes aos meacutetodos First Pastthe Post Two-Round System e Instant Runoff Voting possuem seus conceitos e infor-maccedilotildees relevantes com exceccedilatildeo dos exemplos traduzidos livremente do livro Behind theBallot Box A Citizenrsquos Guide to Voting Systems (AMY 2000)

                                21 FISRT PAST THE POST

                                O meacutetodo First Past the Post tambeacutem conhecido como Plurality Voting ou WinnerTakes All eacute o meacutetodo mais simples e direto e provavelmente o primeiro meacutetodo que sepensa quando se fala de eleiccedilotildees Os eleitores escolhem apenas um candidato e apoacutes a

                                18

                                contagem dos votos o candidato com o maior nuacutemero de votos eacute eleito O vencedor natildeonecessita da aprovaccedilatildeo de mais de 50 dos eleitores ele apenas precisa de uma pluralidadedos votos ou seja apenas possuir mais votos que os outros candidatos

                                Esse sistema eacute utilizado em escala nos Estados Unidos para a maior parte das eleiccedilotildeesvoltadas a eleger apenas um candidato como prefeitos e governadores aleacutem de ser usadana disputa presidencial Dentre outros paiacuteses que empregam o sistema em suas corridaspresidenciais estatildeo listados o Meacutexico as Filipinas a Coreia do Sul e a Venezuela

                                211 Exemplo

                                Tabela 1 ndash Exemplo FPTP

                                Candidatos VotosA 36B 25C 22D 17

                                Neste exemplo o candidato A possui uma pluralidade dos votos com 36 e ele eacute ocandidato eleito mesmo natildeo tendo uma maioria

                                212 Vantagens e Desvantagens do FPTP

                                A vantagem do FPTP eacute a sua simplicidade Natildeo eacute difiacutecil para um eleitor comumcompreender o seu funcionamento eles apenas precisam se decidir por um candidato Eletambeacutem eacute muito simples e direto na sua contagem e seleccedilatildeo do vencedor

                                Esse meacutetodo tambeacutem tende a criar listas de candidatos concorrentes mais curtasCandidatos independentes ou de partidos menores frequentemente acabam se sentindodesencorajados a concorrer devido agraves suas baixas chances de vitoacuteria Isso normalmentefornece aos eleitores uma faacutecil decisatildeo entre um ou dois candidatos dos maiores partidosao mesmo tempo poreacutem limitando suas opccedilotildees

                                No entanto sua essecircncia eacute sua principal desvantagem a pluralidade O fato do can-didato eleito natildeo necessitar de uma maioridade dos votos da populaccedilatildeo parece violaros princiacutepios baacutesicos da democracia Democracia eacute em sua origem o poder(kratos) nopovo(demos) poreacutem na pluralidade o poder de eleger um candidato pode residir emapenas uma fraccedilatildeo relativamente pequena do povo Em um cenaacuterio hipoteacutetico comapenas trecircs candidatos um deles apenas poderia necessitar de natildeo mais do que 34 dosvotos para ser eleito o que significa que no pior dos casos 66 da populaccedilatildeo rejeitao candidato eleito O cenaacuterio soacute piora com mais e mais candidatos concorrendo Paraquatro candidatos satildeo necessaacuterios 26 dos votos no pior dos casos para cinco satildeo 21 eassim por diante

                                19

                                213 Voto Uacutetil no FPTP

                                No FPTP tambeacutem existe a possibilidade de os eleitores evitarem votar em sua prefe-recircncia verdadeira No caso de sua preferecircncia natildeo aparentar ter boas chances de vitoacuteriamuitas vezes opta-se por uma segunda opccedilatildeo que esteja mais bem colocada nas eleiccedilotildeesO motivo disso eacute que nessas situaccedilotildees votar em sua preferecircncia pode parecer um des-perdiacutecio do seu voto e no pior dos cenaacuterios optar por natildeo transferir seu voto para umasegunda opccedilatildeo pode acabar resultando na eleiccedilatildeo de um candidato de seu desgosto As-sim votar de maneira verdadeira muitas vezes pode acabar prejudicando o eleitor que sevecirc forccedilado a abandonar seus interesses poliacuteticos mais imediatos e escolher o menor entredois(ou mais) males Os candidatos de partidos menores satildeo os que mais sofrem com essetipo de voto estrateacutegico por natildeo conseguirem agregar as maiores quantidades de votos

                                Entretanto ao mesmo tempo que partidos maiores roubam votos de partidos meno-res com os votos taacuteticos partidos menores tambeacutem tem a oportunidade de ganhar algunsvotos com o denominado spoiler effect Ao entrarem na eleiccedilatildeo candidatos de partidosmenores podem adquirir votos de candidatos mais populares que possuem inclinaccedilatildeo po-liacutetica semelhante Logo eacute possiacutevel que haja certo equiliacutebrio ao se contrapor as mudanccedilasde voto devido aos votos uacuteteis agraves mudanccedilas oriundas do spoiler effect

                                Poreacutem o spoiler effect natildeo necessariamente ocorre apenas entre partidos maiores emenores mas pode prejudicar candidatos de popularidades proacuteximas Por exemplo entretrecircs candidatos A B e C onde A representa determinada posiccedilatildeo no espectro poliacuteticoenquanto B e C possuem posiccedilotildees parecidas o que pode acontecer eacute B e C se prejudicaremmutuamente jaacute que ambos dividem os eleitores de um mesmo espectro poliacutetico Se esseespectro tem a maioria com 60 por exemplo com B e C compartilhando cada um 30dos votos o candidato A sairia vencedor com 40 mesmo que todos os eleitores de Bprefiram C e todos os eleitores de C prefiram B Esse exemplo demonstra claramente oproblema com os sistemas de pluralidade

                                22 TWO-ROUND SYSTEM

                                Uma das primeiras tentativas de lidar com a desvantagem dos sistemas por pluralidadeo Two-round System eacute usado desde o seacuteculo XIX no ocidente e atualmente ainda eacute utilizadoem corridas presidecircncias de paiacuteses como o Brasil Bulgaacuteria Chile Colocircmbia FinlacircndiaPolocircnia Portugal Ruacutessia e em inuacutemeras eleiccedilotildees locais nos Estados Unidos

                                O principal objetivo do TRS eacute garantir que o vencedor tenha conseguido uma maioriados votos Para isso as eleiccedilotildees satildeo estruturadas em duas rodadas de votaccedilatildeo Na primeirarodada os eleitores se dirigem agraves urnas e votam no candidato de sua preferecircncia Apoacutesa contagem se a quantidade de votos do candidato mais votado superar a proporccedilatildeo de50 natildeo haacute a necessidade de uma segunda rodada e este candidato eacute eleito No entantose este natildeo for o caso haveraacute uma segunda rodada com apenas os dois candidatos mais

                                20

                                votados Nesta rodada os eleitores retornam as urnas para escolher uma das duas opccedilotildeessendo eleito o candidato mais votado agora definitivamente com uma maioria dos votos

                                221 Exemplo

                                Utilizando a mesma distribuiccedilatildeo de votos descrita na tabela 1 Neste caso como ocandidato A natildeo possui uma maioria dos votos ele e o candidato B iratildeo concorrer em umsegundo turno Digamos que as distribuiccedilotildees dos votos dos eleitores dos candidatos C eD em relaccedilatildeo aos candidatos A e B satildeo as seguintes

                                Tabela 2 ndash 2deg turno do TRS

                                Candidatos Votos dos eleitoresde C

                                Votos dos eleitoresde D

                                Votos do 1degturno

                                A 7 5 36B 15 12 25

                                O candidato B agora eacute eleito com uma maioria dos votos 52 contra 48 do candidatoA

                                222 Vantagens e Desvantagens do TRS

                                Por ser parecido com o FPTP esse sistema tambeacutem eacute de faacutecil compreensatildeo do eleitorcomum poreacutem a maior vantagem do TRS eacute a garantia de que o candidato vencedor teraacute oapoio da maioria dos eleitores no segundo turno eliminando a pluralidade Argumenta-seque isso daacute maior legitimidade poliacutetica ao mandato do candidato eleito

                                O TRS tende a abrigar uma lista maior de candidatos sendo mais convidativo acandidatos de partidos menores mesmo que suas chances natildeo sejam maiores quandocomparadas agraves eleiccedilotildees sob o FPTP Mesmo assim essa listagem mais abrangente eacute umavantagem do sistema pois daacute aos eleitores uma variedade maior de opccedilotildees de voto

                                Em relaccedilatildeo agraves suas desvantagens o TRS possui duas principais A primeira satildeo oscustos elevados do sistema decorrentes da necessidade da organizaccedilatildeo de um segundoturno de votaccedilotildees A segunda eacute o aumento no iacutendice de ausecircncias dos eleitores agraves urnasEssa ampliaccedilatildeo no natildeo comparecimento dos eleitores se daacute tambeacutem devido ao segundoturno por pura fatiga eleitoral bem como consequecircncia da desistecircncia de eleitores queapoiam candidatos que jaacute foram eliminados

                                Outro ponto negativo do TRS eacute a sua natildeo-monotonicidade Isso significa que umcandidato pode ser prejudicado com um aumento em sua popularidade e suporte e domesmo modo um candidato pode se beneficiar com a perda de popularidade e suporteSe os candidatos A e B satildeo os esperados para ir ao segundo turno onde A eacute mais fortedo que B um aumento no suporte pelo candidato A pode resultar na sua derrota quandoesse aumento causa uma alteraccedilatildeo nos candidatos que satildeo selecionados para ir ao segundoturno Se esse aumento na popularidade de A resultar na eliminaccedilatildeo preacutevia de B um

                                21

                                terceiro candidato C pode ser vitorioso sobre A no segundo turno caso os eleitores de Bprefiram C ao candidato A Se natildeo houvesse esse crescimento de popularidade A teriaderrotado B no segundo turno Essa situaccedilatildeo seraacute vista em melhores detalhes na seccedilatildeo 43

                                223 Voto Uacutetil no TRS

                                Esse sistema minimiza os efeitos do voto uacutetil em relaccedilatildeo ao FPTP pois um eleitorqualquer pode tranquilamente votar em sua preferecircncia sem se preocupar em desperdiccedilaacute-lo mesmo que seu candidato natildeo tenha chances de vitoacuteria Se este natildeo for eleito aindapoderaacute escolher a sua preferecircncia dentre os dois candidatos que prosseguirem para osegundo turno

                                Apesar disso ainda existe um cenaacuterio em que o eleitor pode ser tentado a natildeo votar emsua preferecircncia Eacute possiacutevel que ele opte pela sua segunda opccedilatildeo se souber que sua primeiraopccedilatildeo possui miacutenimas chances de ir ao segundo turno ou ateacute mesmo por saber que issodiminuiraacute as chances de algum outro candidato ser eleito Mesmo assim eacute evidente queo TRS natildeo proporciona o mesmo apelo ao voto taacutetico que o FPTP

                                Outra caracteriacutestica do TRS eacute o incentivo a formaccedilatildeo de coalizotildees entre candidatosde partidos mais populares com candidatos de partidos menos populares As coalizotildeesfornecem benefiacutecios agrave ambas as partes onde os candidatos classificados para o segundoturno em geral se juntam a candidatos jaacute eliminados com a intenccedilatildeo de agregar maisvotos enquanto os candidatos jaacute eliminados apoiam um dos dois classificados na esperanccedilade inserir propostas proacuteprias ou modificaccedilotildees agrave chapa deles

                                23 INSTANT-RUNOFF VOTING

                                Instant Runoff Voting foi uma alternativa aos meacutetodos FPTP e TRS desenvolvidanos anos 70 por um professor do Instituto de Tecnologia de Massachusetts(MIT) O IRVelimina as principais desvantagens desses outros dois sistemas a pluralidade do FPTP e anecessidade de mais de uma rodada de votaccedilatildeo do TRS Este meacutetodo tambeacutem opera emmais de uma rodada poreacutem como o proacuteprio nome sugere essas rodadas satildeo instantacircneasnatildeo sendo necessaacuterio o retorno dos eleitores agraves urnas Atualmente ele eacute utilizado naIrlanda nas eleiccedilotildees presidenciais em Londres na eleiccedilatildeo de seu prefeito e em distritosindividuais na Austraacutelia para eleger membros de sua cacircmara baixa do parlamento OIRV tambeacutem eacute usado por vaacuterias organizaccedilotildees privadas nos Estados Unidos incluindoa American Political Science Association e a American Psychological Association paraeleger seus funcionaacuterios

                                Nesse sistema os eleitores natildeo satildeo solicitados a votar em um uacutenico candidato aoinveacutes disso eles listam todos os candidatos concorrentes na ordem de sua preferecircnciaA partir dessas listas as primeiras opccedilotildees de cada eleitor recebem o seu voto e apoacutes acontagem se um candidato obtiver 50 dos votos mais um este candidato eacute eleito Se

                                22

                                isso natildeo ocorrer o candidato menos votado eacute eliminado das eleiccedilotildees e seus votos satildeotransferidos para a segunda opccedilatildeo de cada um de seus eleitores Esse procedimento serepete eliminando o candidato menos votado a cada rodada ateacute que algum dos candidatospossuam a maioridade dos votos

                                231 Exemplo

                                Na tabela 3 pode-se verificar a distribuiccedilatildeo de votos por perfil de eleitor e na tabela4 vecirc-se o desenvolvimento do IRV para essas distribuiccedilotildees O candidato D eacute o menosvotado e por consequecircncia eacute o primeiro a ser eliminado A segunda opccedilatildeo de todos oseleitores que votaram no candidato D eacute o candidato C por isso este recebe todos os votosdistribuiacutedos na segunda rodada Com isso o candidato B eacute eliminado com 25 dos votos eos candidatos A e C concorrem na uacuteltima rodada Mesmo com o candidato C na lideranccedilana segunda rodada a maior parte dos eleitores do B tem como preferecircncia o candidatoA por isso A eacute eleito com 55 dos votos contra 45 do C

                                Tabela 3 ndash Exemplo IRV

                                Rankings Ndeg de eleitoresABCD 20ABDC 16BDAC 19BDCA 6CABD 7CDBA 15DCAB 5DCBA 12

                                Tabela 4 ndash Desenvolvimento do IRVTurnos D C B A

                                1 17 22 25 362 eliminado 39 25 363 eliminado 45 eliminado 55

                                232 Vantagens e Desvantagens do IRV

                                Assim como no TRS a pluralidade eacute irrelevante no IRV e um candidato soacute eacute eleitocom a maioridade dos votos dando maior legitimidade ao mandato deste No entantopode-se argumentar que o IRV faz isso com mais eficiecircncia pois natildeo requer a execuccedilatildeode mais de uma rodada de votaccedilotildees Isso diminui os custos das eleiccedilotildees como um todoao mesmo tempo que proporciona um nuacutemero menor de isenccedilotildees por parte dos eleitoresdevido ao desgaste de todo o processo eleitoral

                                23

                                Aleacutem disso candidatos de partidos menores tendem a receber mais votos do queno FPTP e portanto satildeo mais encorajados a se candidatar Com uma lista maior decandidatos eleitores desfrutam de uma variedade maior de opccedilotildees de voto Contudomesmo com mais candidatos menos populares o spoiler effect mencionado anteriormentetambeacutem natildeo possui espaccedilo nesse sistema de votaccedilatildeo Partidos menores natildeo tem comoroubar votos de partidos maiores visto que esses votos eventualmente seratildeo transferidosde volta a eles durante o desenvolvimento das rodadas do IRV

                                Em virtude de sua estrutura acredita-se que esse meacutetodo tende a encorajar os can-didatos tambeacutem a elaborar suas campanhas de forma mais abrangente ampliando suainfluecircncia para mais do que apenas um grupo especiacutefico de maneira que ele consiga agre-gar votos de segunda ou terceira opccedilatildeo aleacutem dos votos de seus eleitores principais

                                A principal desvantagem do IRV eacute o fato de ele ainda natildeo ser amplamente utilizado aoredor do mundo Essa falta de familiaridade do sistema pode causar confusatildeo ao eleitorcomum em suas primeiras ocorrecircncias No entanto nos paiacuteses em que este eacute utilizadonatildeo parece haver confusatildeo entre os eleitores Aleacutem disso na maioria dos casos haveraacute umcusto potencialmente alto da substituiccedilatildeo ou alteraccedilatildeo dos sistemas das urnas eletrocircnicaspara que seja possiacutevel haver a implementaccedilatildeo do meacutetodo

                                Aleacutem disso assim como o TRS este sistema tambeacutem possui natildeo-monotonicidade ouseja um candidato pode ser prejudicado ao ser ranqueado mais alto enquanto que outropode se beneficiar sendo ranqueado mais baixo pelos eleitores (ORNSTEIN 2018) issopode ocorrer quando esse ranqueamento causa alteraccedilotildees na ordem em que os candidatossatildeo eliminados Essa caracteriacutestica se manifesta em fenocircmenos complexos e especiacuteficos epor isso um exemplo de sua ocorrecircncia seraacute abordada em detalhes na seccedilatildeo 43

                                233 Voto Uacutetil no IRV

                                Como os sistemas de votaccedilatildeo anteriores o IRV natildeo eacute completamente imune ao vototaacutetico No entanto este meacutetodo se mostra bem resistente a eles quando comparado aoutros meacutetodos como o FPTP e o Borda Count (Bartholdi John J III and Orlin JamesB 1990) Distintivamente o IRV requer um maior esforccedilo do eleitor para elaborar umaestrateacutegia que melhor ajuste os resultados da eleiccedilatildeo de acordo com a sua preferecircnciaAleacutem disso eacute necessaacuterio que ele tenha informaccedilatildeo suficiente sobre os rankings de outroseleitores naturalmente obtida atraveacutes de pesquisas eleitorais

                                Existe tambeacutem a possibilidade de ocorrer uma exaustatildeo dos votos quando natildeo haacuteo completo preenchimento do ranking por parte dos eleitores Nessas ocasiotildees o votonatildeo pode continuar a ser transferido a outros candidatos e ele eacute descartado Isso afetaa legitimidade do mandato do candidato eleito pois o resultado final natildeo representaraacute100 da populaccedilatildeo votante Essas ocorrecircncias no entanto podem ser minimizadas comuma melhor educaccedilatildeo eleitoral ou como foi implementado na Austraacutelia requerer que osrankings incluam uma totalidade dos candidatos concorrentes

                                24

                                24 APPROVAL VOTING SYSTEM

                                No meacutetodo Approval Voting os eleitores natildeo satildeo limitados pelo nuacutemero de candidatosem que podem votar por isso approval cada eleitor pode votar em todos os candidatos osquais ele aprova Apoacutes as votaccedilotildees o candidato com a maior quantidade de votos eacute eleitoSegundo Hamlin (2015) a cidade de Fargo na Dakota do Norte se tornou a primeiracidade nos EUA a colocar em praacutetica este sistema em suas eleiccedilotildees gerais em novembrode 2018 AVS tambeacutem eacute utilizado para eleger o secretaacuterio-geral das Naccedilotildees Unidas e emdiversas outras organizaccedilotildees

                                241 Exemplo

                                Na tabela 5 abaixo pode-se encontrar 8 perfis de eleitores com seus candidatos apro-vados e quantidade de eleitores que se encaixam no perfil Na tabela 6 temos o resultadoda contabilizaccedilatildeo dos votos destes perfis O candidato mais popular eacute o B que se encontraaprovado em 5 perfis distintos totalizando 60 votos ou aproximadamente 32

                                Tabela 5 ndash Exemplo AVS

                                Aprovaccedilotildees Ndeg de eleitoresA 20AB 16B 19

                                BDC 6CAB 7CD 15DC 5DCB 12

                                Tabela 6 ndash Resultado AVSCandidatos Total de votos

                                A 43B 60C 45D 38

                                242 Vantagens e Desvantagens do AVS

                                Aleacutem de simples este meacutetodo permite um niacutevel maior de expressividade aos eleitoresOnde no FPTP e TRS eles satildeo limitados pelo seu uacutenico voto aqui os eleitores tecircm aliberdade de demonstrar exatamente quais candidatos consideram aptos ou aceitaacuteveis aocargo

                                25

                                Outro efeito dessa liberdade trazida pelo AVS eacute a dizimaccedilatildeo do spoiler effect Can-didatos de partidos menores natildeo tem como roubar votos de partidos maiores nessesistema ambos os candidatos contabilizariam o voto

                                243 Voto Uacutetil no AVS

                                O tipo de voto uacutetil no AVS eacute denominado bullet voting Segundo The Center forElection Science (2015) esta taacutetica envolve simplesmente ignorar a possibilidade de votarem mais de um candidato e votar apenas em sua primeira opccedilatildeo Um eleitor pode serlevado a adotar essa estrateacutegia quando percebe que sua preferecircncia pode ser prejudicadacom o voto em alguma segunda opccedilatildeo sua Em um cenaacuterio extremo onde 100 doseleitores adotam esta estrateacutegia as eleiccedilotildees satildeo convertidas a um simples First Past ThePost

                                25 THE BORDA COUNT

                                Este meacutetodo carrega o nome em homenagem a seu criador Jean-Charles de Bordaque o desenvolveu em 1770 (LIPPMAN 2012) A contagem de Borda utiliza a abordagemde ranqueamento dos candidatos poreacutem de maneira diferente ao IRV Este eacute um sistemaque atribui uma pontuaccedilatildeo aos candidatos com base nestes rankings O candidato na basedo ranking natildeo recebe pontos o candidato imediatamente acima deste recebe 1 pontoo proacuteximo recebe 2 pontos e assim por diante ateacute o topo do ranking As pontuaccedilotildees detodos os rankings satildeo contabilizadas e o candidato com maior pontuaccedilatildeo eacute eleito Deacordo com Lippman variaccedilotildees deste meacutetodo satildeo encontradas em uso na premiaccedilatildeo dediversos esportes como na seleccedilatildeo do MVP(Most Valuable Player) da MLB(principal ligade beisebol dos EUA) e no Trofeacuteu Heisman de futebol americano universitaacuterio

                                251 Exemplo

                                Neste exemplo seratildeo aproveitados os mesmos rankings apresentados na tabela 3 Porserem 4 candidatos o primeiro colocado de cada ranking receberaacute 3 pontos o segundo 2pontos o terceiro 1 e o quarto 0 Assim o nuacutemero maacuteximo de pontos que um candidatopode atingir eacute igual a 300(se ficar na primeira posiccedilatildeo em todos os rankings) e o nuacutemerototal de pontos no sistema eacute 600 O nuacutemero maacuteximo de pontos que um candidato podeatingir eacute calculado com

                                (cminus 1)times e

                                Sendo c igual ao nuacutemero de candidatos e e o nuacutemero de eleitores Por sua vez onuacutemero total de pontos no sistema eacute

                                26

                                (cminus 1)times c2

                                times e

                                A contagem final dos pontos eacute apresentada na tabela 7 abaixo

                                Tabela 7 ndash Resultado BCCandidatos Total de pontos

                                A 146B 181C 126D 147

                                O candidato eleito eacute o B com 181 pontos ou aproximadamente 60 da pontuaccedilatildeomaacutexima

                                252 Vantagens e Desvantagens do BC

                                Em comparaccedilatildeo com os meacutetodos abordados anteriormente que apenas consideramas primeiras opccedilotildees de cada eleitor este meacutetodo regularmente escolhe candidatos comaceitaccedilatildeo mais ampla ao inveacutes de uma preferecircncia direta dos eleitores (Electoral ReformSociety 2017b)

                                Ele tambeacutem encoraja uma abordagem estrateacutegica por parte dos partidos onde seriade seu interesse nomear mais de um candidato para concorrer pois quanto mais candi-datos estatildeo no paacutereo maior eacute a pontuaccedilatildeo dos primeiros colocados Logo a nomeaccedilatildeo decandidatos menos populares pode beneficiar os principais candidatos de um partido

                                253 Voto Uacutetil no BC

                                Existem duas estrateacutegias aplicaacuteveis a esse sistema A primeira denominada compromi-sing de maneira similar a outros meacutetodos de votaccedilatildeo se resume em ranquear em primeirolugar um dos candidatos que estejam liderando as eleiccedilotildees mesmo que este natildeo seja suapreferecircncia real A segunda estrateacutegia burying eacute o oposto esta se baseia em ranquearem uacuteltimo lugar um dos candidatos liacutederes mesmo que este natildeo seja o seu candidato demaior desgosto Ambas estrateacutegias podem ser aplicadas ao mesmo tempo por um eleitor

                                26 SCORE VOTING SYSTEM

                                Score Voting ou Range Voting como tambeacutem eacute conhecido eacute mais um meacutetodo quetenta trazer maior liberdade de expressatildeo aos eleitores Assim como o Borda Counteste sistema funciona baseado na pontuaccedilatildeo dos candidatos no entanto ao inveacutes dessapontuaccedilatildeo ser relativa agrave posiccedilatildeo do candidato no ranking de cada eleitor este por sua veztem completa liberdade de atribuir qualquer quantidade de pontos aos candidatos dentro

                                27

                                de determinada escala Um eleitor pode dar o mesmo nuacutemero de pontos para diferentescandidatos e apoacutes o somatoacuterio de todas as pontuaccedilotildees o candidato com a pontuaccedilatildeo maisalta eacute eleito Incorporado ao escopo poliacutetico o SVS eacute utilizado no Partido Pirata Alematildeobem como em diversas organizaccedilotildees tais como o Fedora Project e Mozilla e tambeacutem emvariados esportes oliacutempicos e reality shows como o American Idol aponta Hamlin (2015)

                                261 Exemplo

                                Neste exemplo temos apresentados na tabela 8 abaixo 4 perfis distintos de eleitorese suas respectivas atribuiccedilotildees de pontos aos 4 candidatos Cada eleitor pode atribuirqualquer pontuaccedilatildeo a um candidato dentro da escala de -10 a 10 O resultado da eleiccedilatildeoapoacutes a soma de todos os pontos por candidato se encontra na tabela 9 onde o candidatoA eacute eleito com um total de 605 pontos

                                Tabela 8 ndash Exemplo SVS

                                Perfil A B C D Ndeg de eleitores1 10 -1 5 2 362 6 9 -3 4 253 2 0 8 4 224 3 3 3 10 17

                                Tabela 9 ndash Resultado SVSCandidatos Total de pontos

                                A 605B 240C 332D 430

                                262 Vantagens e Desvantagens do SVS

                                A grande vantagem do SVS eacute como ele proporciona aos eleitores expressar de maneiramuito proacutexima potencialmente exata suas impressotildees poliacuteticas de cada candidato Eleeacute ainda mais expressivo que o AVS Dessa maneira o spoiler effect tambeacutem se torna nuloao passo que toda intenccedilatildeo de voto eacute precisamente representada neste sistema

                                Assim como outros meacutetodos eleitorais este sofre igualmente dos males produzidos pelovoto taacutetico Sua principal desvantagem eacute discutida na seccedilatildeo abaixo

                                263 Voto Uacutetil no SVS

                                Da mesma maneira que no Approval Voting atraveacutes do bullet voting o SVS tambeacutempode ser convertido em uma eleiccedilatildeo sob o meacutetodo FPTP em um cenaacuterio com um grande

                                28

                                volume de eleitores maliciosos O voto uacutetil sob este sistema se manifesta pontuando-seapenas um candidato com uma nota positiva e todos os outros com as notas mais baixasda escala Se todos os eleitores se aproveitarem dessa abordagem natildeo existiraacute distinccedilatildeoefetiva entre uma eleiccedilatildeo sob SVS e FPTP Essencialmente cada eleitor estaacute votando emapenas um candidato Essa eacute a principal desvantagem do SVS e ela consegue eliminarsua principal vantagem dar ao eleitor um poder maior de expressatildeo

                                27 BLOC VOTE

                                O Bloc Vote eacute um meacutetodo utilizado para a eleiccedilatildeo de candidatos a cargos no governocom mais de uma vacacircncia Pode ser considerado um meio-termo entre o FPTP e oAVS pois os eleitores podem votar em mais de um candidato poreacutem satildeo limitados pelonuacutemero de vagas Em uma eleiccedilatildeo com duas vagas por exemplo cada eleitor selecionaraacutedois candidatos ou menos Sensatamente o candidato mais votado eacute eleito Ele possuialgumas utilizaccedilotildees em eleiccedilotildees locais em algumas partes da Inglaterra (Electoral ReformSociety 2017a)

                                271 Exemplo

                                Neste exemplo dois candidatos seratildeo eleitos logo cada eleitor votaraacute em no maacuteximodois candidatos A distribuiccedilatildeo de votos pode ser conferida na tabela 10 e o resultado dacontagem de votos na tabela 11 abaixo Os candidatos eleitos satildeo o C totalizando 78do maacuteximo de votos possiacuteveis para um candidato e o A com 43

                                Tabela 10 ndash Exemplo BV

                                Aprovaccedilotildees Ndeg de eleitoresAC 20AB 16BC 19BD 6CA 7CD 15DC 17

                                Tabela 11 ndash Resultado BVCandidatos Total de votos

                                A 43B 41C 78D 38

                                29

                                272 Voto Uacutetil no BV

                                Neste sistema eacute possiacutevel que um eleitor evite votar em sua primeira opccedilatildeo quandoeste natildeo tem chances de vitoacuteria e se fazendo isto ele diminuiraacute as chances de algum outrocandidato de seu desgosto ganhar Poreacutem o sistema previne um outro tipo de voto uacutetilEm eleiccedilotildees com mais de uma vaga onde os eleitores soacute podem votar em um candidatose um eleitor sabe que sua primeira opccedilatildeo tambeacutem eacute a primeira opccedilatildeo da maior parteda populaccedilatildeo e portanto muito provavelmente seraacute um dos candidatos eleitos eacute possiacutevelque ele arrisque votar em uma segunda opccedilatildeo sua na esperanccedila de a longo prazo elegersuas duas principais opccedilotildees de voto Com os eleitores podendo votar no nuacutemero exato devagas disponiacuteveis esse tipo de pensamento taacutetico perde o sentido

                                30

                                3 O SIMULADOR

                                Para este trabalho foi implementado um simulador eleitoral na forma de uma aplicaccedilatildeoweb para que a interaccedilatildeo do usuaacuterio fosse facilitada Veremos a seguir como se daacute suautilizaccedilatildeo de forma geral

                                Figura 2 ndash Captura de tela 1

                                Figura 3 ndash Captura de tela 2

                                A primeira opccedilatildeo encontrada pelo usuaacuterio eacute a escolha de quais sistemas de votaccedilatildeo se-ratildeo simulados (Figura 2) Todos eles podem ser selecionados para rodar simultaneamentePoreacutem natildeo eacute permitido rodar uma simulaccedilatildeo do Bloc Vote para uma eleiccedilatildeo onde apenasum candidato eacute eleito aleacutem disso natildeo existe implementaccedilatildeo dos meacutetodos TRS e IRV para

                                31

                                eleiccedilotildees com mais de um candidato eleito jaacute que eles se comportariam exatamente comono FPTP

                                A maioria das linguagens de programaccedilatildeo senatildeo todas possuem um gerador de nuacuteme-ros pseudoaleatoacuterios que fornece a possibilidade de definir uma seed para o gerador Estaseed funciona como um ponto de partida para a geraccedilatildeo dos nuacutemero e portanto todasimulaccedilatildeo que rodar com a mesma seed sempre teraacute os mesmos resultados Se nenhumvalor for fornecido pelo usuaacuterio o tempo atual do sistema eacute utilizado As opccedilotildees subse-quentes satildeo a escolha do nuacutemero de eleitores gerados e o nuacutemero de vagas (Figura 3) Senenhum valor for fornecido o nuacutemero de eleitores padratildeo utilizado eacute 1000 e o nuacutemero devagas igual a 1

                                Figura 4 ndash Captura de tela 3

                                Este simulador possui dois modos para a criaccedilatildeo dos rankings dos eleitores No modoManipulate (Figura 4) primeiramente se define o nuacutemero de candidatos atraveacutes do campode entrada ao lado do tiacutetulo Candidates ou alternativamente pode-se adicionar candida-tos um a um atraveacutes do sinal de mais na parte inferior da paacutegina Para cada candidatoeacute possiacutevel definir a porcentagem de seus eleitores que optaraacute pelo voto taacutetico e pelovoto de minoria Tambeacutem eacute possiacutevel alterar o nome dos candidatos se for do interessedo usuaacuterio

                                32

                                Figura 5 ndash Captura de tela 4

                                Figura 6 ndash Captura de tela 5

                                33

                                Figura 7 ndash Captura de tela 6

                                Apoacutes a criaccedilatildeo dos candidatos o usuaacuterio pode criar perfis de eleitores que definiratildeo demaneira exata como partes da populaccedilatildeo iraacute votar (Figura 5) Em cada perfil se defineo valor em porcentos da populaccedilatildeo votante que o adotaraacute e a nota de cada candidatoTambeacutem eacute possiacutevel nomear cada perfil livremente

                                No modo Generate (Figura 6) eacute onde o gerador de nuacutemeros pseudoaleatoacuterios eacute usadoNesse modo ao inveacutes do usuaacuterio criar perfis de eleitores ele define qual seraacute a distribuiccedilatildeoadotada para a geraccedilatildeo de notas de cada candidato Essas distribuiccedilotildees seratildeo mais bemdetalhadas no Capiacutetulo 5 Da mesma maneira que no modo Manipulate nesse modotambeacutem eacute possiacutevel definir os valores para os dois tipos de voto uacutetil os votos taacuteticos eos votos de minoria No primeiro estatildeo incluiacutedas as estrateacutegias de mudanccedila de votoespeciacuteficas de cada sistema como o bullet voting no AVS e SVS ou quando a preferecircnciade um eleitor claramente natildeo possui chances de vitoacuteria e ele muda seu voto para um doscandidatos que esteja na lideranccedila o que ocorre no FPTP e TRS O voto de minoriase apresenta apenas no FPTP em eleiccedilotildees onde mais de um candidato eacute eleito Se apreferecircncia de um eleitor claramente lidera a eleiccedilatildeo por ser tambeacutem a preferecircncia damaior parte da populaccedilatildeo esse eleitor pode mudar o seu voto para uma segunda opccedilatildeona esperanccedila de eleger dois de seus candidatos favoritos

                                Por fim em ambos os modos o usuaacuterio tem a opccedilatildeo de definir coalizotildees entre oscandidatos se o sistema TRS estiver habilitado pois as coalizotildees apenas se manifestamnesse sistema Essas coalizotildees alteraratildeo as notas dos candidatos dependendo dos outroscandidatos pertencentes a elas (Figura 7)

                                A aplicaccedilatildeo pode ser encontrada na paacutegina httpelectionsimpythonanywherecom

                                34

                                4 CENAacuteRIOS PERTINENTES

                                Para todos os cenaacuterios deste capiacutetulo seraacute usada a seed do simulador igual a 100 e apopulaccedilatildeo de eleitores igual a 1000 para que exista consistecircncia na anaacutelise e tambeacutem paraque possa haver replicaccedilatildeo dos resultados se necessaacuterio

                                41 CENAacuteRIO 1 VOTO TAacuteTICO

                                Neste exemplo teremos quatro candidatos Ana Beto Carla e Diego Ana e Betoseratildeo gerados a partir da distribuiccedilatildeo Neutral (Figura 47) Carla da distribuiccedilatildeo Disliked(Figura 51) e Diego da Hated (Figura 55) Para a simulaccedilatildeo com a seed 100 o melhorcandidato a ser eleito ou seja aquele que maximiza a meacutedia das notas dos eleitores eacute oBeto com uma meacutedia de 0073 Para cada sistema seratildeo comparados os resultados semvoto taacutetico aos com 20 de voto taacutetico a favor da Ana Abaixo se encontram osresultados para o sistema FPTP

                                Figura 8 ndash FPTP - Cenaacuterio 1 sem voto taacutetico

                                Figura 9 ndash TRS segundo turno - Cenaacuterio 1 sem voto taacutetico

                                35

                                Figura 10 ndash IRV primeiro turno - Cenaacuterio 1

                                Figura 11 ndash IRV segundo turno - Cenaacuterio 1

                                Figura 12 ndash IRV terceiro turno - Cenaacuterio 1

                                36

                                Figura 13 ndash AVS - Cenaacuterio 1 sem voto taacutetico

                                Figura 14 ndash BC - Cenaacuterio 1 sem voto taacutetico

                                Figura 15 ndash SVS - Cenaacuterio 1 sem voto taacutetico

                                37

                                Nesse cenaacuterio sem voto taacutetico o uacutenico sistema que natildeo elege o Beto eacute o AVS Todosos outros elegem o melhor candidato Ou seja apesar de Beto ter uma melhor meacutediadas notas dos eleitores existem mais eleitores que ranqueiam Ana com uma nota acimade 0 No entanto apenas 20 dos eleitores de Diego e Carla que preferem a Ana aoinveacutes do Beto satildeo o suficiente para fazer Beto natildeo ser eleito se eles decidirem abandonarsua primeira opccedilatildeo e votar na Ana Considerando a vantagem que os votos taacuteticosproporcionam agrave Ana esta eacute eleita em todos os sistemas menos o TRS e o IRV

                                Figura 16 ndash FPTP - Cenaacuterio 1 - 20 de voto taacutetico na Ana

                                Figura 17 ndash TRS segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                38

                                Figura 18 ndash IRV primeiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                Figura 19 ndash IRV segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                Figura 20 ndash IRV terceiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                39

                                Figura 21 ndash AVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                                Figura 22 ndash BC - Cenaacuterio 1 20 de voto taacutetico na Ana

                                Figura 23 ndash SVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                                40

                                Eacute claro que se os eleitores que preferem o Beto tambeacutem votassem de maneira estra-teacutegica a situaccedilatildeo se equilibraria e haveria o mesmo niacutevel de concorrecircncia entre os doiscandidatos que ocorre quando natildeo haacute voto taacutetico Poreacutem no Borda Count esse equiliacute-brio pode natildeo acontecer e as estrateacutegias de compromising e burying podem acabar saindopela culatra se uma porcentagem elevada dos eleitores as adotarem Abaixo encontram-seos resultados para esse sistema quando 100 dos eleitores de Carla e Diego se comportammaliciosamente

                                Figura 24 ndash BC - Cenaacuterio 1 100 de voto taacutetico na Ana e Beto

                                Por causa do uso demasiado da estrateacutegia burying Ana e Beto perdem muitos pontose isso abre espaccedilo para uma vitoacuteria da Carla No entanto para porcentagens menores que100 o Beto ainda eacute o vencedor

                                Essas duas estrateacutegias tambeacutem foram implementadas nesse simulador para o sistemaIRV e eacute possiacutevel ver como ele eacute resistente a elas Para que seja possiacutevel mudar os resultadosde uma eleiccedilatildeo sob o IRV eacute necessaacuterio mudar a ordem de eliminaccedilatildeo dos candidatos paraque o seu candidato preferido acabe enfrentando um candidato mais fraco nas rodadasfinais Isso natildeo ocorre com compromising e burying No proacuteximo cenaacuterio seraacute analisadacomo eacute possiacutevel modificar os resultados de uma eleiccedilatildeo sob o IRV

                                Esses resultados podem ser replicados acessando os linksSem votos taacuteticos lthttpelectionsimpythonanywherecomdirect_res1111110

                                --[0021][22Ana2222Beto222022Carla2222Diego22]------100gt

                                Com 20 de voto taacutetico lthttpelectionsimpythonanywherecomdirect_res1111110--[0021][22Ana222022Beto2222Carla2222Diego22]1-[02000]---100gt

                                Com 100 de voto taacuteticona Ana e Beto lthttpelectionsimpythonanywherecomdirect_res0000100--[0021][22Ana222022Beto222022Carla2222Diego22]1-[101000]---100gt

                                41

                                42 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV

                                Neste cenaacuterio teremos Ana Carla e Beto concorrendo e trecircs perfis distintos que apoiamcada candidato As distribuiccedilotildees de notas dos perfis se encontram na tabela abaixo

                                Tabela 12 ndash Distribuiccedilatildeo de notas - Cenaacuterio 2

                                Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                deeleitores

                                1 10 5 0 422 0 10 5 303 5 0 10 28

                                Com essas distribuiccedilotildees Carla eacute eliminada na primeira rodada e seus 28 de votossatildeo transferidos para a segunda opccedilatildeo de seus eleitores Ana que eacute eleita com 70 dosvotos e uma meacutedia de 56

                                Figura 25 ndash IRV primeiro turno - Cenaacuterio 2

                                Figura 26 ndash IRV segundo turno - Cenaacuterio 2

                                42

                                Cientes desse provaacutevel futuro cenaacuterio onde Ana eacute eleita uma pequena parte dos elei-tores de Beto estrategicamente o abandona e decide apoiar Carla na esperanccedila de leva-laao segundo turno contra Ana As novas distribuiccedilotildees de notas se encontram na tabelaabaixo com essa porccedilatildeo de eleitores representada pelo perfil 4

                                Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2

                                Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                deeleitores

                                1 10 5 0 422 0 10 5 283 5 0 10 284 0 8 10 2

                                Essa mudanccedila estrateacutegica de voto altera a ordem de eliminaccedilotildees do sistema com Betosendo o primeiro a ser eliminado Com isso seus votos satildeo naturalmente transferidos paraCarla que derrota Ana no segundo turno com 58 dos votos

                                Figura 27 ndash IRV primeiro turno com voto taacutetico - Cenaacuterio 2

                                Figura 28 ndash IRV segundo turno com voto taacutetico - Cenaacuterio 2

                                43

                                Percebendo que a eleiccedilatildeo de Beto natildeo era provaacutevel seus eleitores conseguiram aomenos impedir a eleiccedilatildeo do pior candidato para eles Mas para isso foi necessaacuterio queeles tivessem a informaccedilatildeo de como os outros eleitores votariam Uma aproximaccedilatildeo dessasinformaccedilotildees poderia ser obtida em um cenaacuterio real com poucos candidatos atraveacutes depesquisas eleitorais poreacutem se o nuacutemero de candidatos eacute significativo uma noccedilatildeo completadas distribuiccedilotildees dos rankings dos eleitores se torna muito menos viaacutevel e dificulta aformulaccedilatildeo de estrateacutegias para alterar a ordem em que os candidatos satildeo eliminados

                                Esses resultados podem ser replicados acessando os linksSem voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana22

                                22Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                Com voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana

                                2222Beto2222Carla22]-----42Voter20Profile2001020520028Voter20Profile2010201020528Voter20Profile202520020102Voter20Profile20302082010100gt

                                43 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE

                                O interessante dos sistemas IRV e TRS eacute que os resultados do cenaacuterio anterior po-deriam ter sido obtidos ao inveacutes do voto taacutetico pela sua natildeo-monotonicidade Seriapossiacutevel que a Carla derrotasse a Ana no segundo turno atraveacutes do proacuteprio aumento depopularidade da Ana Assumindo que essa popularizaccedilatildeo ocorresse entre os candidatosdo perfil 2 onde 3 passasse a apoiar a Ana ao inveacutes do Beto as novas distribuiccedilotildeesseguiriam a tabela abaixo

                                Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                deeleitores

                                1 10 5 0 452 0 10 5 273 5 0 10 28

                                Dessa maneira Beto agora com uma porcentagem dos eleitores menor do que a deCarla seraacute eliminado na primeira rodada e como seus eleitores tecircm a Carla como segundaopccedilatildeo ela receberaacute todos os seus votos e seraacute eleita na segunda rodada As rodadas doIRV podem ser vistas nas figuras 29 e 30

                                44

                                Figura 29 ndash IRV primeiro turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                Figura 30 ndash IRV segundo turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                Tabela 15 ndash Resultados do Cenaacuterio 3Candidato

                                eleitoMeacutedia das

                                notasAntes da

                                popularizaccedilatildeode Ana

                                Ana 56

                                Apoacutespopularizaccedilatildeo

                                de AnaCarla 415

                                Os efeitos dessa caracteriacutestica se refletem na satisfaccedilatildeo meacutedia da populaccedilatildeo A Ana eacuteclaramente a melhor candidata e mesmo com o seu ganho de popularidade (ou devido aele) a Carla eacute eleita

                                Esses resultados podem ser replicados acessando os linksAntes da popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecom

                                direct_res0010000---[22Ana2222Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                45

                                Apoacutes popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana2222Beto2222Carla22]-----45Voter20Profile2001020520027Voter20Profile2010201020528Voter20Profile20252002010100gt

                                44 CENAacuteRIO 4 COALIZOtildeES

                                O TRS por ser organizado em dois turnos separados normalmente a semanas dedistacircncia um do outro acaba abrindo brecha agrave mudanccedila de opiniatildeo por parte dos eleitorese o desenvolvimento de novas estrateacutegias por parte dos candidatos tais como a coalizatildeocom candidatos jaacute eliminados Com isso em mente nesse cenaacuterio teremos novamenteos quatro candidatos Ana Beto Carla e Diego Os trecircs primeiros seratildeo gerados dadistribuiccedilatildeo Neutral e Diego da distribuiccedilatildeo Disliked

                                Figura 31 ndash TRS turno 1 - Cenaacuterio 4

                                No TRS normal Ana Beto e Carla possuem com essas distribuiccedilotildees quantidades devotos muito proacuteximas com Beto e Carla indo para o segundo turno Carla estaacute 10 votosatraacutes de Beto e decide aproveitar o espaccedilo de tempo entre os dois turnos para tentaragregar mais votos Com isso Carla se aproxima de Diego e juntos formam uma coalizatildeoNo entanto com sua baixa popularidade Diego acaba ferindo a reputaccedilatildeo de Carla etorna o segundo turno muito mais faacutecil para Beto (Figura 33) Se Carla tivesse buscado osuporte de Ana por outro lado ela se veria vitoriosa no segundo turno e com uma amplavantagem sobre o Beto (Figura 34) Ou ateacute mesmo sem buscar uma coalizatildeo mesmosendo uma corrida apertada Carla teria naturalmente sido eleita (Figura 32)

                                Esses resultados podem ser replicados acessando os linksSem coalizotildees lthttpelectionsimpythonanywherecomdirect_res0100000

                                --[0002][22Ana222022Beto2222Carla2222Diego22]------100gt

                                46

                                Figura 32 ndash TRS turno 2 - Cenaacuterio 4

                                Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4

                                Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4

                                47

                                Coalizatildeo Carla e Diego lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2203Carla20Diego-100gt

                                Coalizatildeo Carla e Ana lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2200Carla20Ana-100gt

                                45 CENAacuteRIO 5 DILEMA DO PRISIONEIRO

                                Neste cenaacuterio temos uma eleiccedilatildeo de uma vaga com trecircs candidatos concorrentes e trecircsperfis distintos de eleitores que seguiratildeo as seguintes distribuiccedilotildees

                                Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5

                                Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                deeleitores

                                1 10 -10 5 362 -10 10 5 343 -10 -10 5 30

                                Esse contexto nos remete ao notaacutevel dilema do prisioneiro Nele dois prisioneiroscuacutemplices satildeo interrogados individualmente sem poder se comunicar um com o outro ecada um enfrenta o dilema de delatar ou natildeo o seu parceiro Se os dois prisioneirosdecidem se manter calados sobre o crime ambos satildeo sentenciados a um ano de prisatildeo Seapenas um deles dedurar o outro o traidor sai livre enquanto seu parceiro eacute condenadoa trecircs anos Se ambos dedurarem um ao outro eles satildeo condenados juntos a dois anosde prisatildeo Esse dilema eacute uma ideia claacutessica presente no estudo da teoria dos jogos sendooriginalmente elaborada por Merrill Flood e Melvin Dresher em 1950 e mais tarde sendonomeada de dilema dos prisioneiros por Albert W Tucker (POUNDSTONE 1992)

                                O que esse dilema nos mostra eacute a tentaccedilatildeo que o indiviacuteduo deteacutem se sua racionalizaccedilatildeoestiver voltada para seus proacuteprios interesses e somente eles em oposiccedilatildeo a pensar no bemdo grupo como um todo Neste cenaacuterio encontramos dois grupos de eleitores expressiva-mente opostos os perfis 1 e 2 Se qualquer uma das preferecircncias desses perfis fosse eleitaisso significaria uma alta rejeiccedilatildeo de maior parte da populaccedilatildeo No entanto eles possuema segunda opccedilatildeo em comum a Carla que por sua vez eacute a preferecircncia do terceiro perfilPortanto a eleiccedilatildeo da Carla seria logicamente o resultado oacutetimo

                                Mesmo assim a Ana eacute eleita nos dois sistemas acima o que natildeo parece justo poispela tabela 16 eacute evidente que apenas 36 da populaccedilatildeo a aprova enquanto que os outros64 a reprovam ao maacuteximo O sistema IRV se comporta de maneira idecircntica ao TRS

                                48

                                Figura 35 ndash FPTP - Cenaacuterio 5

                                Figura 36 ndash TRS segundo turno - Cenaacuterio 5

                                nesta situaccedilatildeo Com esse resultado a meacutedia das notas eacute -28 No entanto os trecircs sistemasseguintes nos apresentam resultados diferentes

                                Tabela 17 ndash Resultados do Cenaacuterio 5

                                Sistema Candidatoeleito

                                Meacutedia dasnotas

                                FPTP Ana -28TRS Ana -28IRV Ana -28AVS Carla 50BC Carla 50SVS Carla 50

                                49

                                Figura 37 ndash AVS - Cenaacuterio 5

                                Figura 38 ndash BC - Cenaacuterio 5

                                Tanto o AVS quanto o Borda Count e o SVS satildeo sistemas que consideram todasas opiniotildees de cada eleitor ao mesmo tempo e por isso satildeo capazes de eleger o melhorcandidato nesta situaccedilatildeo diferentemente do TRS que natildeo absorve completamente todosentimento do eleitor por todos os candidatos e o IRV que apesar de ser bem expressivoquebra esse processo em inuacutemeras rodadas o que permite a perda de informaccedilatildeo ao longodelas

                                Esses resultados podem ser replicados acessando o linklthttpelectionsimpythonanywherecomdirect_res1111110---[22Ana

                                222022Beto222022Carla22]-----36Voter20Profile2001020-1020534Voter20Profile201-10201020530Voter20Profile202-1020-10205100gt

                                50

                                Figura 39 ndash SVS - Cenaacuterio 5

                                46 CENAacuteRIO 6 VOTO DE MINORIA

                                Neste cenaacuterio temos uma eleiccedilatildeo com quatro candidatos e duas vagas A Ana seraacutea preferecircncia de uma extensa parte da populaccedilatildeo (distribuiccedilatildeo Loved Figura 53) Betoe Carla seratildeo candidatos razoavelmente populares (distribuiccedilatildeo Neutral Figura 47) eDiego seraacute a preferecircncia de apenas um pequeno grupo especiacutefico e rejeitado pela maioria(distribuiccedilatildeo Disliked Figura 51) Eacute intuitivo esperar que os dois candidatos eleitos seratildeoa Ana e ou o Beto ou a Carla e isso eacute exatamente o que ocorre na figura 40 no sistemaFPTP sem voto de minoria

                                Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria

                                Eacute evidente a discrepacircncia da quantidade de votos da Ana para os outros candidatose apesar de Beto e Carla serem mais populares que Diego os trecircs natildeo se encontrammuito afastados Poreacutem se a pequena fraccedilatildeo de candidatos que possuem a Ana como

                                51

                                Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego

                                preferecircncia e Diego como segunda opccedilatildeo optarem pelo voto de minoria a situaccedilatildeo mudacompletamente (Figura 41) Assim apesar de extensamente rejeitado Diego conquistaa segunda vaga e a meacutedia das notas despenca de 2929 para 0505 No entanto aindaexiste um cenaacuterio pior Se os outros grupos de eleitores pensarem da mesma forma eevitarem votar na Ana achando que sua eleiccedilatildeo jaacute estaacute assegurada apenas 80 de votode minoria para esses grupos jaacute eacute o suficiente para eliminaacute-la das eleiccedilotildees (Figura 42)Com a Ana eliminada a meacutedia das notas cai ainda mais para 0058

                                Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego

                                O sistema Bloc Vote eacute uma das soluccedilotildees para o voto de minoria Permitindo queos eleitores votem no mesmo nuacutemero de candidatos que de vagas a serem preenchidasnatildeo existe o iacutempeto a esse tipo de voto estrateacutegico O resultado desse sistema portantoretorna a meacutedia das notas a casa dos 29 (Figura 43) Os sistemas AVS Borda Count eSVS tambeacutem impedem a presenccedila do voto de minoria e atingem resultados semelhantes

                                52

                                Figura 43 ndash BV - Cenaacuterio 6

                                Tabela 18 ndash Resultados do Cenaacuterio 6

                                Sistema Candidatoseleitos

                                Meacutedia dasnotas

                                FPTP sem voto de minoriaAna eBeto 2929

                                FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

                                FPTP com 80 de voto de minoriaBeto eCarla 0058

                                Bloc VoteAna eCarla 2913

                                Esses resultados podem ser replicados acessando os links

                                Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

                                100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

                                80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

                                53

                                5 COMO FUNCIONA O SIMULADOR

                                O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

                                51 CLASSE ELECTIONS

                                Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

                                bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

                                Figura 44 ndash estrutura candidates

                                bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

                                bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

                                Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

                                Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

                                54

                                Figura 45 ndash estrutura voters

                                Figura 46 ndash estrutura votes

                                daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

                                Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

                                55

                                Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

                                Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

                                na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

                                56

                                Figura 49 ndash PDF - Distribuiccedilatildeo Liked

                                Figura 50 ndash CDF - Distribuiccedilatildeo Liked

                                (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

                                Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

                                57

                                Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

                                Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

                                candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

                                Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

                                58

                                Figura 53 ndash PDF - Distribuiccedilatildeo Loved

                                Figura 54 ndash CDF - Distribuiccedilatildeo Loved

                                funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

                                59

                                Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                                Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                                Meacutedia das Notas sumei

                                sumvj nij

                                etimes v

                                Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                                Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                                60

                                Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                                Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                                52 CLASSE FIRSTPASTTHEPOST

                                Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                                Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                                61

                                Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                                Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                                mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                                62

                                53 CLASSE TWOROUNDSYSTEM

                                A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                                54 CLASSE INSTANTRUNOFFVOTING

                                A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                                Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                                63

                                cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                                55 CLASSE APPROVALVOTING

                                Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                                56 CLASSE BORDACOUNT

                                Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                                57 CLASSE SCOREVOTING

                                De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                                64

                                58 CLASSE BLOCVOTE

                                O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                                59 TECNOLOGIAS UTILIZADAS

                                A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                                Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                                O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                                Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                                65

                                6 CONCLUSAtildeO

                                Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                                Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                                Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                                Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                                Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                                66

                                REFEREcircNCIAS

                                AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                                Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                                Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                                Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                                HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                                LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                                ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                                Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                                POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                                The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                                67

                                APEcircNDICES

                                APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                if(not len(selfvoter_profiles))

                                for voter in range(selfN_VOTERS)

                                candidates_rank = dict()

                                for candidate in reversed(range(selfN_CANDIDATES))

                                if(selfBIAS_VECTOR[candidate]==4)

                                candidates_rank[candidate] = self_sortear(selfloved)

                                elif(selfBIAS_VECTOR[candidate]==3)

                                candidates_rank[candidate] = self_sortear(selfliked)

                                elif(selfBIAS_VECTOR[candidate]==2)

                                candidates_rank[candidate] = self_sortear(selfdisliked)

                                elif(selfBIAS_VECTOR[candidate]==1)

                                candidates_rank[candidate] = self_sortear(selfhated)

                                elif(selfBIAS_VECTOR[candidate]==-1)

                                candidates_rank[candidate] = self_sortear(selfpolarizer

                                )

                                elif(selfBIAS_VECTOR[candidate]==-2)

                                candidates_rank[candidate] = self_sortear(self

                                more_polarizer)

                                else

                                candidates_rank[candidate] = self_sortear(selfneutral)

                                selfvotersappend(candidates_rank)

                                else

                                ranges = []

                                ranks = []

                                for prof in selfvoter_profiles

                                rangesappend(int(prof[pop_percentage]))

                                rank =

                                for index score in enumerate(prof[scores])

                                rank[index] = score

                                ranksappend(rank)

                                for index _range in enumerate(ranges)

                                for _ in range(int(selfN_VOTERS(_range100)))

                                selfvotersappend(ranks[index])

                                68

                                APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                for i in range(selfN_CANDIDATES)

                                selfcandidates[i] = 0

                                selfvotes[i] = set()

                                APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                for candidate in range(selfN_CANDIDATES)

                                rating_sum = 0

                                for voter in selfvoters

                                rating_sum += voter[candidate]

                                selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                return selfcalculate_mean(winners)

                                else

                                chose_best = True if winners[0] == selfbest_candidate else

                                False

                                return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                69

                                APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                rating_sum = 0

                                for voter in selfvoters

                                for candidate in winners

                                rating_sum += voter[candidate]

                                return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                for i in range(1 selfN_VACANCIES + 2)

                                selfleading_candidatesappend(selfsorted_candidates[-i][self

                                CANDIDATE_INDEX])

                                APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                for leader in selfelecrounds[-1]

                                selfleading_candidatesappend(leader[0])

                                70

                                APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                self_account_for_coalitions()

                                for voter in selfvoters

                                selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                (1)))

                                temp = []

                                for voter in selfsorted_voters

                                new_dict = defaultdict(list)

                                for k in voter

                                new_dict[k[1]]append(k[0])

                                tempappend(new_dict)

                                selfsorted_voters = []

                                for voter_index current_voter in enumerate(temp)

                                new_voter = []

                                for rating candidate_indexes in current_voteritems()

                                if len(current_voter[rating]) gt 1

                                shuffle(current_voter[rating])

                                for e in candidate_indexes

                                new_voterappend((e rating))

                                else

                                new_voterappend((candidate_indexes[0] rating))

                                selfsorted_votersappend(new_voter)

                                selfcandidates[new_voter[-1][0]] += 1

                                selfvotes[new_voter[-1][0]]add(voter_index)

                                71

                                APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                for candidate in selfvotes_copy

                                if candidate not in selfelecleading_candidates

                                for voter_index in selfvotes_copy[candidate]

                                for index _candidate in enumerate(reversed(selfelec

                                sorted_voters[voter_index]))

                                if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                leading_candidates

                                if randomrandom() lt selfelec

                                tactical_vote_percentages[_candidate[selfelec

                                CANDIDATE_INDEX]]

                                selfrankings_changed[voter_index] = copy

                                deepcopy(selfelecsorted_voters[voter_index])

                                selfrankings_changed[voter_index][-(index + 1)]

                                selfrankings_changed[voter_index][-1] = self

                                rankings_changed[voter_index][-1] self

                                rankings_changed[voter_index][-(index + 1)]

                                selfcandidates[candidate] -= 1

                                selfcandidates[_candidate[selfelec

                                CANDIDATE_INDEX]] += 1

                                selfvotes[candidate]remove(voter_index)

                                selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                ]]add(voter_index)

                                break

                                break

                                72

                                APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                for candidate in selfelecleading_candidates

                                if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                continue

                                for voter_index in selfvotes_copy[candidate]

                                if voter_index in selfrankings_changed

                                ranking = selfrankings_changed[voter_index]

                                else

                                ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                ])

                                for index _candidate in enumerate(reversed(ranking))

                                if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                leading_candidates or (_candidate[selfelec

                                CANDIDATE_INDEX] in selfelecleading_candidates and

                                selfelecleading_candidatesindex(_candidate[selfelec

                                CANDIDATE_INDEX]) gt= half_vacancies)

                                if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                if randomrandom() lt selfelec

                                minority_vote_percentages[_candidate[selfelec

                                CANDIDATE_INDEX]]

                                selfcandidates[candidate] -= 1

                                selfcandidates[_candidate[selfelec

                                CANDIDATE_INDEX]] += 1

                                break

                                break

                                break

                                73

                                APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                self_account_for_coalitions()

                                for candidate in selfvotes

                                if candidate = selfwinner and candidate = selfsecond_place

                                for voter_index in selfvotes[candidate]

                                if voter_index in selfrankings_changed

                                ranking = selfrankings_changed[voter_index]

                                else

                                ranking = copydeepcopy(selfelecsorted_voters[

                                voter_index])

                                for index2 candidate in enumerate(reversed(ranking))

                                if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                selfcandidates[selfwinner] += 1

                                selfvotes[selfwinner]add(voter_index)

                                break

                                elif candidate[selfelecCANDIDATE_INDEX] == self

                                second_place

                                selfcandidates[selfsecond_place] += 1

                                selfvotes[selfsecond_place]add(voter_index)

                                break

                                selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                winners = []

                                vacancies = selfelecN_VACANCIES

                                for candidate in reversed(selfsorted_candidates)

                                if vacancies == 0

                                break

                                winnersappend(candidate[0])

                                vacancies -= 1

                                mean chose_best = selfelecget_mean(winners = winners)

                                74

                                APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                for voter_index voter in enumerate(selfelecsorted_voters)

                                voter_dict = dict()

                                og_voter_dict = dict()

                                for tup in voter

                                voter_dict[tup[0]] = tup[1]

                                og_voter_dict[tup[0]] = tup[1]

                                for coalition in selfeleccoalitions

                                for candidate in coalition

                                add_to_score = 0

                                for candidate2 in coalition

                                if candidate == candidate2

                                continue

                                half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                if half lt 0

                                add_to_score += mathceil(half)

                                else

                                add_to_score += mathfloor(half)

                                if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                voter_dict[candidate[rsquovaluersquo]] = 10

                                elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                voter_dict[candidate[rsquovaluersquo]] = -10

                                else

                                voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                selfrankings_changed[voter_index] = []

                                for candidate in voter_dict

                                selfrankings_changed[voter_index]append((candidate voter_dict[

                                candidate]))

                                selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                voter_index] key=lambda x x[1])

                                75

                                APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                selfelecroundsappend(selfsorted_candidates[_round])

                                if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                N_VACANCIES - 1)

                                return 2

                                elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                N_VOTERS gt 05)

                                return 1

                                else

                                selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                CANDIDATE_INDEX])

                                for voter_index in selfvotes[selfsorted_candidates[_round][self

                                elecCANDIDATE_INDEX]]

                                if voter_index in selfrankings_changed

                                for candidate in reversed(selfrankings_changed[voter_index

                                ])

                                if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                excluded

                                selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                ]] += 1

                                selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                add(voter_index)

                                break

                                else

                                continue

                                else

                                for candidate in reversed(selfelecsorted_voters[

                                voter_index])

                                if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                excluded

                                selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                ]] += 1

                                selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                add(voter_index)

                                break

                                else

                                continue

                                selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                return 0

                                76

                                APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                for index in range(selfelecN_CANDIDATES)

                                selfcandidates[index] = 0

                                for voter in selfelecsorted_voters

                                for candidate in reversed(voter)

                                if candidate[selfelecCANDIDATE_SCORE] gt 0

                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                else

                                break

                                APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                for index in range(selfelecN_CANDIDATES)

                                selfcandidates[index] = 0

                                for voter in selfelecsorted_voters

                                if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                elecCANDIDATE_INDEX]]

                                selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                else

                                for candidate in reversed(voter)

                                if candidate[selfelecCANDIDATE_SCORE] gt 0

                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                else

                                break

                                77

                                APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                pos = set()

                                for index perc in enumerate(selfelectactical_vote_percentages)

                                if perc gt 0

                                posadd(index)

                                for candidate in selfeleccandidates

                                if candidate not in selfleading_candidates

                                for voter_index in selfvotes[candidate]

                                raised = None

                                for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                ])

                                if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                leading_candidates

                                if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                if randomrandom() lt selfelectactical_vote_percentages[

                                candidate_tuple[selfelecCANDIDATE_INDEX]]

                                ranking = [None]selfelecN_CANDIDATES

                                ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                selfelecvoters[voter_index][candidate_tuple[selfelec

                                CANDIDATE_INDEX]])

                                raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                break

                                break

                                break

                                if raised = None

                                for _candidate in selfleading_candidates

                                if _candidate = ranking[-1][0]

                                ranking[0] = (_candidate selfelecvoters[voter_index][

                                _candidate])

                                buried = _candidate

                                break

                                i = 1

                                for candidate_tuple in selfelecsorted_voters[voter_index]

                                if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                buried]

                                continue

                                else

                                ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                selfelecvoters[voter_index][candidate_tuple[selfelec

                                CANDIDATE_INDEX]])

                                i += 1

                                selfrankings_changed[voter_index] = ranking

                                78

                                APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                for voter_index in selfvotes[candidate]

                                if randomrandom() lt selfelectactical_vote_percentages[candidate

                                ]

                                for _candidate in selfleading_candidates

                                if _candidate = candidate

                                ranking = [None]selfelecN_CANDIDATES

                                ranking[0] = (_candidate selfelecvoters[voter_index][

                                _candidate])

                                buried = _candidate

                                break

                                i = 1

                                for candidate_tuple in selfelecsorted_voters[voter_index]

                                if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                continue

                                else

                                ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                selfelecvoters[voter_index][candidate_tuple[selfelec

                                CANDIDATE_INDEX]])

                                i += 1

                                selfrankings_changed[voter_index] = ranking

                                79

                                APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                for index in range(selfelecN_CANDIDATES)

                                selfcandidates[index] = 0

                                for voter_index voter in enumerate(selfelecsorted_voters)

                                score = 0

                                if voter_index in selfrankings_changed

                                for candidate in selfrankings_changed[voter_index]

                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                score += 1

                                else

                                for candidate in voter

                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                score += 1

                                APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                for voter_index voter in enumerate(selfelecsorted_voters)

                                if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                elecCANDIDATE_INDEX]]

                                selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                sorted_voters[voter_index])

                                for candidate_index candidate in enumerate(reversed(voter))

                                if candidate_index == 0

                                selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                else

                                selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                80

                                APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                for index in range(selfelecN_CANDIDATES)

                                selfcandidates[index] = 0

                                for voter_index voter in enumerate(selfelecsorted_voters)

                                if voter_index in selfrankings_changed

                                for candidate in selfrankings_changed[voter_index]

                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                selfelecCANDIDATE_RANK]

                                else

                                for candidate in voter

                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                selfelecCANDIDATE_RANK]

                                APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                for index in range(selfelecN_CANDIDATES)

                                selfcandidates[index] = 0

                                for voter in selfelecsorted_voters

                                votes = selfelecN_VACANCIES

                                for candidate in reversed(voter)

                                if votes == 0

                                break

                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                votes -= 1

                                • Folha de aprovaccedilatildeo
                                • Agradecimentos
                                • Epiacutegrafe
                                • Resumo
                                • Abstract
                                • Lista de ilustraccedilotildees
                                • Lista de Coacutedigos
                                • Lista de tabelas
                                • Lista de abreviaturas e siglas
                                • Sumaacuterio
                                • INTRODUCcedilAtildeO
                                  • MOTIVACcedilAtildeO E OBJETIVO
                                  • MEacuteTODO
                                  • ESTRUTURA
                                    • SISTEMAS ELEITORAIS
                                      • FISRT PAST THE POST
                                        • Exemplo
                                        • Vantagens e Desvantagens do FPTP
                                        • Voto Uacutetil no FPTP
                                          • TWO-ROUND SYSTEM
                                            • Exemplo
                                            • Vantagens e Desvantagens do TRS
                                            • Voto Uacutetil no TRS
                                              • INSTANT-RUNOFF VOTING
                                                • Exemplo
                                                • Vantagens e Desvantagens do IRV
                                                • Voto Uacutetil no IRV
                                                  • APPROVAL VOTING SYSTEM
                                                    • Exemplo
                                                    • Vantagens e Desvantagens do AVS
                                                    • Voto Uacutetil no AVS
                                                      • THE BORDA COUNT
                                                        • Exemplo
                                                        • Vantagens e Desvantagens do BC
                                                        • Voto Uacutetil no BC
                                                          • SCORE VOTING SYSTEM
                                                            • Exemplo
                                                            • Vantagens e Desvantagens do SVS
                                                            • Voto Uacutetil no SVS
                                                              • BLOC VOTE
                                                                • Exemplo
                                                                • Voto Uacutetil no BV
                                                                    • O SIMULADOR
                                                                    • CENAacuteRIOS PERTINENTES
                                                                      • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                      • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                      • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                      • CENAacuteRIO 4 COALIZOtildeES
                                                                      • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                      • CENAacuteRIO 6 VOTO DE MINORIA
                                                                        • COMO FUNCIONA O SIMULADOR
                                                                          • CLASSE Elections
                                                                          • CLASSE FirstPastThePost
                                                                          • CLASSE TwoRoundSystem
                                                                          • CLASSE InstantRunoffVoting
                                                                          • CLASSE ApprovalVoting
                                                                          • CLASSE BordaCount
                                                                          • CLASSE ScoreVoting
                                                                          • CLASSE BlocVote
                                                                          • TECNOLOGIAS UTILIZADAS
                                                                            • CONCLUSAtildeO
                                                                            • Referecircncias
                                                                            • Meacutetodo create_voters
                                                                            • Meacutetodo create_candidates
                                                                            • Meacutetodo calculate_means
                                                                            • Meacutetodo get_mean
                                                                            • Meacutetodo calculate_mean
                                                                            • Meacutetodo set_leading_candidates
                                                                            • Meacutetodo irv_set_leading_candidates
                                                                            • Meacutetodo sort_ranks
                                                                            • Meacutetodo fptp_count_tactical_votes
                                                                            • Meacutetodo fptp_count_minority_votes
                                                                            • Meacutetodo trs_second_round
                                                                            • Meacutetodo trs_account_for_coalitions
                                                                            • Meacutetodo irv_count_votes
                                                                            • Meacutetodo avs_count_votes
                                                                            • Meacutetodo avs_count_votes_with_tactical
                                                                            • Meacutetodo irv_apply_tactical_votes
                                                                            • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                            • Meacutetodo bc_sum_candidates_scores
                                                                            • Meacutetodo svs_apply_tactical_votes
                                                                            • Meacutetodo svs_sum_candidates_scores
                                                                            • Meacutetodo bv_count_votes

                                  17

                                  2 SISTEMAS ELEITORAIS

                                  Atualmente mais e mais paiacuteses estatildeo adotando sistemas democraacuteticos de governoCerca de 6 em 10 governos no mundo satildeo democracias (Pew Research Center 2017) o quepode ser observado na Figura 1 abaixo Em um sistema democraacutetico a populaccedilatildeo escolheseus liacutederes atraveacutes de seu sistema eleitoral Existem diversos sistemas eleitorais em usono mundo muitos dos quais satildeo usados em conjunto para eleger um uacutenico candidato Emvaacuterios paiacuteses mais de um sistema eleitoral pode ser utilizado tambeacutem em diferentes niacuteveisde governo tanto presidencial quanto estadual ou municipal Natildeo apenas imersos nomeio poliacutetico eles tambeacutem podem ser usados em escopos menores como em esportes oucompeticcedilotildees artiacutesticas poreacutem sempre com a finalidade de alocar um ou mais indiviacuteduosa determinado cargo ou tiacutetulo

                                  Figura 1 ndash de paiacuteses de cada tipo de regime 1946-2016

                                  Fonte Center of Systemic Peacersquos Polity IV Project

                                  Os proacuteximos trecircs toacutepicos discutidos neste capiacutetulo referentes aos meacutetodos First Pastthe Post Two-Round System e Instant Runoff Voting possuem seus conceitos e infor-maccedilotildees relevantes com exceccedilatildeo dos exemplos traduzidos livremente do livro Behind theBallot Box A Citizenrsquos Guide to Voting Systems (AMY 2000)

                                  21 FISRT PAST THE POST

                                  O meacutetodo First Past the Post tambeacutem conhecido como Plurality Voting ou WinnerTakes All eacute o meacutetodo mais simples e direto e provavelmente o primeiro meacutetodo que sepensa quando se fala de eleiccedilotildees Os eleitores escolhem apenas um candidato e apoacutes a

                                  18

                                  contagem dos votos o candidato com o maior nuacutemero de votos eacute eleito O vencedor natildeonecessita da aprovaccedilatildeo de mais de 50 dos eleitores ele apenas precisa de uma pluralidadedos votos ou seja apenas possuir mais votos que os outros candidatos

                                  Esse sistema eacute utilizado em escala nos Estados Unidos para a maior parte das eleiccedilotildeesvoltadas a eleger apenas um candidato como prefeitos e governadores aleacutem de ser usadana disputa presidencial Dentre outros paiacuteses que empregam o sistema em suas corridaspresidenciais estatildeo listados o Meacutexico as Filipinas a Coreia do Sul e a Venezuela

                                  211 Exemplo

                                  Tabela 1 ndash Exemplo FPTP

                                  Candidatos VotosA 36B 25C 22D 17

                                  Neste exemplo o candidato A possui uma pluralidade dos votos com 36 e ele eacute ocandidato eleito mesmo natildeo tendo uma maioria

                                  212 Vantagens e Desvantagens do FPTP

                                  A vantagem do FPTP eacute a sua simplicidade Natildeo eacute difiacutecil para um eleitor comumcompreender o seu funcionamento eles apenas precisam se decidir por um candidato Eletambeacutem eacute muito simples e direto na sua contagem e seleccedilatildeo do vencedor

                                  Esse meacutetodo tambeacutem tende a criar listas de candidatos concorrentes mais curtasCandidatos independentes ou de partidos menores frequentemente acabam se sentindodesencorajados a concorrer devido agraves suas baixas chances de vitoacuteria Isso normalmentefornece aos eleitores uma faacutecil decisatildeo entre um ou dois candidatos dos maiores partidosao mesmo tempo poreacutem limitando suas opccedilotildees

                                  No entanto sua essecircncia eacute sua principal desvantagem a pluralidade O fato do can-didato eleito natildeo necessitar de uma maioridade dos votos da populaccedilatildeo parece violaros princiacutepios baacutesicos da democracia Democracia eacute em sua origem o poder(kratos) nopovo(demos) poreacutem na pluralidade o poder de eleger um candidato pode residir emapenas uma fraccedilatildeo relativamente pequena do povo Em um cenaacuterio hipoteacutetico comapenas trecircs candidatos um deles apenas poderia necessitar de natildeo mais do que 34 dosvotos para ser eleito o que significa que no pior dos casos 66 da populaccedilatildeo rejeitao candidato eleito O cenaacuterio soacute piora com mais e mais candidatos concorrendo Paraquatro candidatos satildeo necessaacuterios 26 dos votos no pior dos casos para cinco satildeo 21 eassim por diante

                                  19

                                  213 Voto Uacutetil no FPTP

                                  No FPTP tambeacutem existe a possibilidade de os eleitores evitarem votar em sua prefe-recircncia verdadeira No caso de sua preferecircncia natildeo aparentar ter boas chances de vitoacuteriamuitas vezes opta-se por uma segunda opccedilatildeo que esteja mais bem colocada nas eleiccedilotildeesO motivo disso eacute que nessas situaccedilotildees votar em sua preferecircncia pode parecer um des-perdiacutecio do seu voto e no pior dos cenaacuterios optar por natildeo transferir seu voto para umasegunda opccedilatildeo pode acabar resultando na eleiccedilatildeo de um candidato de seu desgosto As-sim votar de maneira verdadeira muitas vezes pode acabar prejudicando o eleitor que sevecirc forccedilado a abandonar seus interesses poliacuteticos mais imediatos e escolher o menor entredois(ou mais) males Os candidatos de partidos menores satildeo os que mais sofrem com essetipo de voto estrateacutegico por natildeo conseguirem agregar as maiores quantidades de votos

                                  Entretanto ao mesmo tempo que partidos maiores roubam votos de partidos meno-res com os votos taacuteticos partidos menores tambeacutem tem a oportunidade de ganhar algunsvotos com o denominado spoiler effect Ao entrarem na eleiccedilatildeo candidatos de partidosmenores podem adquirir votos de candidatos mais populares que possuem inclinaccedilatildeo po-liacutetica semelhante Logo eacute possiacutevel que haja certo equiliacutebrio ao se contrapor as mudanccedilasde voto devido aos votos uacuteteis agraves mudanccedilas oriundas do spoiler effect

                                  Poreacutem o spoiler effect natildeo necessariamente ocorre apenas entre partidos maiores emenores mas pode prejudicar candidatos de popularidades proacuteximas Por exemplo entretrecircs candidatos A B e C onde A representa determinada posiccedilatildeo no espectro poliacuteticoenquanto B e C possuem posiccedilotildees parecidas o que pode acontecer eacute B e C se prejudicaremmutuamente jaacute que ambos dividem os eleitores de um mesmo espectro poliacutetico Se esseespectro tem a maioria com 60 por exemplo com B e C compartilhando cada um 30dos votos o candidato A sairia vencedor com 40 mesmo que todos os eleitores de Bprefiram C e todos os eleitores de C prefiram B Esse exemplo demonstra claramente oproblema com os sistemas de pluralidade

                                  22 TWO-ROUND SYSTEM

                                  Uma das primeiras tentativas de lidar com a desvantagem dos sistemas por pluralidadeo Two-round System eacute usado desde o seacuteculo XIX no ocidente e atualmente ainda eacute utilizadoem corridas presidecircncias de paiacuteses como o Brasil Bulgaacuteria Chile Colocircmbia FinlacircndiaPolocircnia Portugal Ruacutessia e em inuacutemeras eleiccedilotildees locais nos Estados Unidos

                                  O principal objetivo do TRS eacute garantir que o vencedor tenha conseguido uma maioriados votos Para isso as eleiccedilotildees satildeo estruturadas em duas rodadas de votaccedilatildeo Na primeirarodada os eleitores se dirigem agraves urnas e votam no candidato de sua preferecircncia Apoacutesa contagem se a quantidade de votos do candidato mais votado superar a proporccedilatildeo de50 natildeo haacute a necessidade de uma segunda rodada e este candidato eacute eleito No entantose este natildeo for o caso haveraacute uma segunda rodada com apenas os dois candidatos mais

                                  20

                                  votados Nesta rodada os eleitores retornam as urnas para escolher uma das duas opccedilotildeessendo eleito o candidato mais votado agora definitivamente com uma maioria dos votos

                                  221 Exemplo

                                  Utilizando a mesma distribuiccedilatildeo de votos descrita na tabela 1 Neste caso como ocandidato A natildeo possui uma maioria dos votos ele e o candidato B iratildeo concorrer em umsegundo turno Digamos que as distribuiccedilotildees dos votos dos eleitores dos candidatos C eD em relaccedilatildeo aos candidatos A e B satildeo as seguintes

                                  Tabela 2 ndash 2deg turno do TRS

                                  Candidatos Votos dos eleitoresde C

                                  Votos dos eleitoresde D

                                  Votos do 1degturno

                                  A 7 5 36B 15 12 25

                                  O candidato B agora eacute eleito com uma maioria dos votos 52 contra 48 do candidatoA

                                  222 Vantagens e Desvantagens do TRS

                                  Por ser parecido com o FPTP esse sistema tambeacutem eacute de faacutecil compreensatildeo do eleitorcomum poreacutem a maior vantagem do TRS eacute a garantia de que o candidato vencedor teraacute oapoio da maioria dos eleitores no segundo turno eliminando a pluralidade Argumenta-seque isso daacute maior legitimidade poliacutetica ao mandato do candidato eleito

                                  O TRS tende a abrigar uma lista maior de candidatos sendo mais convidativo acandidatos de partidos menores mesmo que suas chances natildeo sejam maiores quandocomparadas agraves eleiccedilotildees sob o FPTP Mesmo assim essa listagem mais abrangente eacute umavantagem do sistema pois daacute aos eleitores uma variedade maior de opccedilotildees de voto

                                  Em relaccedilatildeo agraves suas desvantagens o TRS possui duas principais A primeira satildeo oscustos elevados do sistema decorrentes da necessidade da organizaccedilatildeo de um segundoturno de votaccedilotildees A segunda eacute o aumento no iacutendice de ausecircncias dos eleitores agraves urnasEssa ampliaccedilatildeo no natildeo comparecimento dos eleitores se daacute tambeacutem devido ao segundoturno por pura fatiga eleitoral bem como consequecircncia da desistecircncia de eleitores queapoiam candidatos que jaacute foram eliminados

                                  Outro ponto negativo do TRS eacute a sua natildeo-monotonicidade Isso significa que umcandidato pode ser prejudicado com um aumento em sua popularidade e suporte e domesmo modo um candidato pode se beneficiar com a perda de popularidade e suporteSe os candidatos A e B satildeo os esperados para ir ao segundo turno onde A eacute mais fortedo que B um aumento no suporte pelo candidato A pode resultar na sua derrota quandoesse aumento causa uma alteraccedilatildeo nos candidatos que satildeo selecionados para ir ao segundoturno Se esse aumento na popularidade de A resultar na eliminaccedilatildeo preacutevia de B um

                                  21

                                  terceiro candidato C pode ser vitorioso sobre A no segundo turno caso os eleitores de Bprefiram C ao candidato A Se natildeo houvesse esse crescimento de popularidade A teriaderrotado B no segundo turno Essa situaccedilatildeo seraacute vista em melhores detalhes na seccedilatildeo 43

                                  223 Voto Uacutetil no TRS

                                  Esse sistema minimiza os efeitos do voto uacutetil em relaccedilatildeo ao FPTP pois um eleitorqualquer pode tranquilamente votar em sua preferecircncia sem se preocupar em desperdiccedilaacute-lo mesmo que seu candidato natildeo tenha chances de vitoacuteria Se este natildeo for eleito aindapoderaacute escolher a sua preferecircncia dentre os dois candidatos que prosseguirem para osegundo turno

                                  Apesar disso ainda existe um cenaacuterio em que o eleitor pode ser tentado a natildeo votar emsua preferecircncia Eacute possiacutevel que ele opte pela sua segunda opccedilatildeo se souber que sua primeiraopccedilatildeo possui miacutenimas chances de ir ao segundo turno ou ateacute mesmo por saber que issodiminuiraacute as chances de algum outro candidato ser eleito Mesmo assim eacute evidente queo TRS natildeo proporciona o mesmo apelo ao voto taacutetico que o FPTP

                                  Outra caracteriacutestica do TRS eacute o incentivo a formaccedilatildeo de coalizotildees entre candidatosde partidos mais populares com candidatos de partidos menos populares As coalizotildeesfornecem benefiacutecios agrave ambas as partes onde os candidatos classificados para o segundoturno em geral se juntam a candidatos jaacute eliminados com a intenccedilatildeo de agregar maisvotos enquanto os candidatos jaacute eliminados apoiam um dos dois classificados na esperanccedilade inserir propostas proacuteprias ou modificaccedilotildees agrave chapa deles

                                  23 INSTANT-RUNOFF VOTING

                                  Instant Runoff Voting foi uma alternativa aos meacutetodos FPTP e TRS desenvolvidanos anos 70 por um professor do Instituto de Tecnologia de Massachusetts(MIT) O IRVelimina as principais desvantagens desses outros dois sistemas a pluralidade do FPTP e anecessidade de mais de uma rodada de votaccedilatildeo do TRS Este meacutetodo tambeacutem opera emmais de uma rodada poreacutem como o proacuteprio nome sugere essas rodadas satildeo instantacircneasnatildeo sendo necessaacuterio o retorno dos eleitores agraves urnas Atualmente ele eacute utilizado naIrlanda nas eleiccedilotildees presidenciais em Londres na eleiccedilatildeo de seu prefeito e em distritosindividuais na Austraacutelia para eleger membros de sua cacircmara baixa do parlamento OIRV tambeacutem eacute usado por vaacuterias organizaccedilotildees privadas nos Estados Unidos incluindoa American Political Science Association e a American Psychological Association paraeleger seus funcionaacuterios

                                  Nesse sistema os eleitores natildeo satildeo solicitados a votar em um uacutenico candidato aoinveacutes disso eles listam todos os candidatos concorrentes na ordem de sua preferecircnciaA partir dessas listas as primeiras opccedilotildees de cada eleitor recebem o seu voto e apoacutes acontagem se um candidato obtiver 50 dos votos mais um este candidato eacute eleito Se

                                  22

                                  isso natildeo ocorrer o candidato menos votado eacute eliminado das eleiccedilotildees e seus votos satildeotransferidos para a segunda opccedilatildeo de cada um de seus eleitores Esse procedimento serepete eliminando o candidato menos votado a cada rodada ateacute que algum dos candidatospossuam a maioridade dos votos

                                  231 Exemplo

                                  Na tabela 3 pode-se verificar a distribuiccedilatildeo de votos por perfil de eleitor e na tabela4 vecirc-se o desenvolvimento do IRV para essas distribuiccedilotildees O candidato D eacute o menosvotado e por consequecircncia eacute o primeiro a ser eliminado A segunda opccedilatildeo de todos oseleitores que votaram no candidato D eacute o candidato C por isso este recebe todos os votosdistribuiacutedos na segunda rodada Com isso o candidato B eacute eliminado com 25 dos votos eos candidatos A e C concorrem na uacuteltima rodada Mesmo com o candidato C na lideranccedilana segunda rodada a maior parte dos eleitores do B tem como preferecircncia o candidatoA por isso A eacute eleito com 55 dos votos contra 45 do C

                                  Tabela 3 ndash Exemplo IRV

                                  Rankings Ndeg de eleitoresABCD 20ABDC 16BDAC 19BDCA 6CABD 7CDBA 15DCAB 5DCBA 12

                                  Tabela 4 ndash Desenvolvimento do IRVTurnos D C B A

                                  1 17 22 25 362 eliminado 39 25 363 eliminado 45 eliminado 55

                                  232 Vantagens e Desvantagens do IRV

                                  Assim como no TRS a pluralidade eacute irrelevante no IRV e um candidato soacute eacute eleitocom a maioridade dos votos dando maior legitimidade ao mandato deste No entantopode-se argumentar que o IRV faz isso com mais eficiecircncia pois natildeo requer a execuccedilatildeode mais de uma rodada de votaccedilotildees Isso diminui os custos das eleiccedilotildees como um todoao mesmo tempo que proporciona um nuacutemero menor de isenccedilotildees por parte dos eleitoresdevido ao desgaste de todo o processo eleitoral

                                  23

                                  Aleacutem disso candidatos de partidos menores tendem a receber mais votos do queno FPTP e portanto satildeo mais encorajados a se candidatar Com uma lista maior decandidatos eleitores desfrutam de uma variedade maior de opccedilotildees de voto Contudomesmo com mais candidatos menos populares o spoiler effect mencionado anteriormentetambeacutem natildeo possui espaccedilo nesse sistema de votaccedilatildeo Partidos menores natildeo tem comoroubar votos de partidos maiores visto que esses votos eventualmente seratildeo transferidosde volta a eles durante o desenvolvimento das rodadas do IRV

                                  Em virtude de sua estrutura acredita-se que esse meacutetodo tende a encorajar os can-didatos tambeacutem a elaborar suas campanhas de forma mais abrangente ampliando suainfluecircncia para mais do que apenas um grupo especiacutefico de maneira que ele consiga agre-gar votos de segunda ou terceira opccedilatildeo aleacutem dos votos de seus eleitores principais

                                  A principal desvantagem do IRV eacute o fato de ele ainda natildeo ser amplamente utilizado aoredor do mundo Essa falta de familiaridade do sistema pode causar confusatildeo ao eleitorcomum em suas primeiras ocorrecircncias No entanto nos paiacuteses em que este eacute utilizadonatildeo parece haver confusatildeo entre os eleitores Aleacutem disso na maioria dos casos haveraacute umcusto potencialmente alto da substituiccedilatildeo ou alteraccedilatildeo dos sistemas das urnas eletrocircnicaspara que seja possiacutevel haver a implementaccedilatildeo do meacutetodo

                                  Aleacutem disso assim como o TRS este sistema tambeacutem possui natildeo-monotonicidade ouseja um candidato pode ser prejudicado ao ser ranqueado mais alto enquanto que outropode se beneficiar sendo ranqueado mais baixo pelos eleitores (ORNSTEIN 2018) issopode ocorrer quando esse ranqueamento causa alteraccedilotildees na ordem em que os candidatossatildeo eliminados Essa caracteriacutestica se manifesta em fenocircmenos complexos e especiacuteficos epor isso um exemplo de sua ocorrecircncia seraacute abordada em detalhes na seccedilatildeo 43

                                  233 Voto Uacutetil no IRV

                                  Como os sistemas de votaccedilatildeo anteriores o IRV natildeo eacute completamente imune ao vototaacutetico No entanto este meacutetodo se mostra bem resistente a eles quando comparado aoutros meacutetodos como o FPTP e o Borda Count (Bartholdi John J III and Orlin JamesB 1990) Distintivamente o IRV requer um maior esforccedilo do eleitor para elaborar umaestrateacutegia que melhor ajuste os resultados da eleiccedilatildeo de acordo com a sua preferecircnciaAleacutem disso eacute necessaacuterio que ele tenha informaccedilatildeo suficiente sobre os rankings de outroseleitores naturalmente obtida atraveacutes de pesquisas eleitorais

                                  Existe tambeacutem a possibilidade de ocorrer uma exaustatildeo dos votos quando natildeo haacuteo completo preenchimento do ranking por parte dos eleitores Nessas ocasiotildees o votonatildeo pode continuar a ser transferido a outros candidatos e ele eacute descartado Isso afetaa legitimidade do mandato do candidato eleito pois o resultado final natildeo representaraacute100 da populaccedilatildeo votante Essas ocorrecircncias no entanto podem ser minimizadas comuma melhor educaccedilatildeo eleitoral ou como foi implementado na Austraacutelia requerer que osrankings incluam uma totalidade dos candidatos concorrentes

                                  24

                                  24 APPROVAL VOTING SYSTEM

                                  No meacutetodo Approval Voting os eleitores natildeo satildeo limitados pelo nuacutemero de candidatosem que podem votar por isso approval cada eleitor pode votar em todos os candidatos osquais ele aprova Apoacutes as votaccedilotildees o candidato com a maior quantidade de votos eacute eleitoSegundo Hamlin (2015) a cidade de Fargo na Dakota do Norte se tornou a primeiracidade nos EUA a colocar em praacutetica este sistema em suas eleiccedilotildees gerais em novembrode 2018 AVS tambeacutem eacute utilizado para eleger o secretaacuterio-geral das Naccedilotildees Unidas e emdiversas outras organizaccedilotildees

                                  241 Exemplo

                                  Na tabela 5 abaixo pode-se encontrar 8 perfis de eleitores com seus candidatos apro-vados e quantidade de eleitores que se encaixam no perfil Na tabela 6 temos o resultadoda contabilizaccedilatildeo dos votos destes perfis O candidato mais popular eacute o B que se encontraaprovado em 5 perfis distintos totalizando 60 votos ou aproximadamente 32

                                  Tabela 5 ndash Exemplo AVS

                                  Aprovaccedilotildees Ndeg de eleitoresA 20AB 16B 19

                                  BDC 6CAB 7CD 15DC 5DCB 12

                                  Tabela 6 ndash Resultado AVSCandidatos Total de votos

                                  A 43B 60C 45D 38

                                  242 Vantagens e Desvantagens do AVS

                                  Aleacutem de simples este meacutetodo permite um niacutevel maior de expressividade aos eleitoresOnde no FPTP e TRS eles satildeo limitados pelo seu uacutenico voto aqui os eleitores tecircm aliberdade de demonstrar exatamente quais candidatos consideram aptos ou aceitaacuteveis aocargo

                                  25

                                  Outro efeito dessa liberdade trazida pelo AVS eacute a dizimaccedilatildeo do spoiler effect Can-didatos de partidos menores natildeo tem como roubar votos de partidos maiores nessesistema ambos os candidatos contabilizariam o voto

                                  243 Voto Uacutetil no AVS

                                  O tipo de voto uacutetil no AVS eacute denominado bullet voting Segundo The Center forElection Science (2015) esta taacutetica envolve simplesmente ignorar a possibilidade de votarem mais de um candidato e votar apenas em sua primeira opccedilatildeo Um eleitor pode serlevado a adotar essa estrateacutegia quando percebe que sua preferecircncia pode ser prejudicadacom o voto em alguma segunda opccedilatildeo sua Em um cenaacuterio extremo onde 100 doseleitores adotam esta estrateacutegia as eleiccedilotildees satildeo convertidas a um simples First Past ThePost

                                  25 THE BORDA COUNT

                                  Este meacutetodo carrega o nome em homenagem a seu criador Jean-Charles de Bordaque o desenvolveu em 1770 (LIPPMAN 2012) A contagem de Borda utiliza a abordagemde ranqueamento dos candidatos poreacutem de maneira diferente ao IRV Este eacute um sistemaque atribui uma pontuaccedilatildeo aos candidatos com base nestes rankings O candidato na basedo ranking natildeo recebe pontos o candidato imediatamente acima deste recebe 1 pontoo proacuteximo recebe 2 pontos e assim por diante ateacute o topo do ranking As pontuaccedilotildees detodos os rankings satildeo contabilizadas e o candidato com maior pontuaccedilatildeo eacute eleito Deacordo com Lippman variaccedilotildees deste meacutetodo satildeo encontradas em uso na premiaccedilatildeo dediversos esportes como na seleccedilatildeo do MVP(Most Valuable Player) da MLB(principal ligade beisebol dos EUA) e no Trofeacuteu Heisman de futebol americano universitaacuterio

                                  251 Exemplo

                                  Neste exemplo seratildeo aproveitados os mesmos rankings apresentados na tabela 3 Porserem 4 candidatos o primeiro colocado de cada ranking receberaacute 3 pontos o segundo 2pontos o terceiro 1 e o quarto 0 Assim o nuacutemero maacuteximo de pontos que um candidatopode atingir eacute igual a 300(se ficar na primeira posiccedilatildeo em todos os rankings) e o nuacutemerototal de pontos no sistema eacute 600 O nuacutemero maacuteximo de pontos que um candidato podeatingir eacute calculado com

                                  (cminus 1)times e

                                  Sendo c igual ao nuacutemero de candidatos e e o nuacutemero de eleitores Por sua vez onuacutemero total de pontos no sistema eacute

                                  26

                                  (cminus 1)times c2

                                  times e

                                  A contagem final dos pontos eacute apresentada na tabela 7 abaixo

                                  Tabela 7 ndash Resultado BCCandidatos Total de pontos

                                  A 146B 181C 126D 147

                                  O candidato eleito eacute o B com 181 pontos ou aproximadamente 60 da pontuaccedilatildeomaacutexima

                                  252 Vantagens e Desvantagens do BC

                                  Em comparaccedilatildeo com os meacutetodos abordados anteriormente que apenas consideramas primeiras opccedilotildees de cada eleitor este meacutetodo regularmente escolhe candidatos comaceitaccedilatildeo mais ampla ao inveacutes de uma preferecircncia direta dos eleitores (Electoral ReformSociety 2017b)

                                  Ele tambeacutem encoraja uma abordagem estrateacutegica por parte dos partidos onde seriade seu interesse nomear mais de um candidato para concorrer pois quanto mais candi-datos estatildeo no paacutereo maior eacute a pontuaccedilatildeo dos primeiros colocados Logo a nomeaccedilatildeo decandidatos menos populares pode beneficiar os principais candidatos de um partido

                                  253 Voto Uacutetil no BC

                                  Existem duas estrateacutegias aplicaacuteveis a esse sistema A primeira denominada compromi-sing de maneira similar a outros meacutetodos de votaccedilatildeo se resume em ranquear em primeirolugar um dos candidatos que estejam liderando as eleiccedilotildees mesmo que este natildeo seja suapreferecircncia real A segunda estrateacutegia burying eacute o oposto esta se baseia em ranquearem uacuteltimo lugar um dos candidatos liacutederes mesmo que este natildeo seja o seu candidato demaior desgosto Ambas estrateacutegias podem ser aplicadas ao mesmo tempo por um eleitor

                                  26 SCORE VOTING SYSTEM

                                  Score Voting ou Range Voting como tambeacutem eacute conhecido eacute mais um meacutetodo quetenta trazer maior liberdade de expressatildeo aos eleitores Assim como o Borda Counteste sistema funciona baseado na pontuaccedilatildeo dos candidatos no entanto ao inveacutes dessapontuaccedilatildeo ser relativa agrave posiccedilatildeo do candidato no ranking de cada eleitor este por sua veztem completa liberdade de atribuir qualquer quantidade de pontos aos candidatos dentro

                                  27

                                  de determinada escala Um eleitor pode dar o mesmo nuacutemero de pontos para diferentescandidatos e apoacutes o somatoacuterio de todas as pontuaccedilotildees o candidato com a pontuaccedilatildeo maisalta eacute eleito Incorporado ao escopo poliacutetico o SVS eacute utilizado no Partido Pirata Alematildeobem como em diversas organizaccedilotildees tais como o Fedora Project e Mozilla e tambeacutem emvariados esportes oliacutempicos e reality shows como o American Idol aponta Hamlin (2015)

                                  261 Exemplo

                                  Neste exemplo temos apresentados na tabela 8 abaixo 4 perfis distintos de eleitorese suas respectivas atribuiccedilotildees de pontos aos 4 candidatos Cada eleitor pode atribuirqualquer pontuaccedilatildeo a um candidato dentro da escala de -10 a 10 O resultado da eleiccedilatildeoapoacutes a soma de todos os pontos por candidato se encontra na tabela 9 onde o candidatoA eacute eleito com um total de 605 pontos

                                  Tabela 8 ndash Exemplo SVS

                                  Perfil A B C D Ndeg de eleitores1 10 -1 5 2 362 6 9 -3 4 253 2 0 8 4 224 3 3 3 10 17

                                  Tabela 9 ndash Resultado SVSCandidatos Total de pontos

                                  A 605B 240C 332D 430

                                  262 Vantagens e Desvantagens do SVS

                                  A grande vantagem do SVS eacute como ele proporciona aos eleitores expressar de maneiramuito proacutexima potencialmente exata suas impressotildees poliacuteticas de cada candidato Eleeacute ainda mais expressivo que o AVS Dessa maneira o spoiler effect tambeacutem se torna nuloao passo que toda intenccedilatildeo de voto eacute precisamente representada neste sistema

                                  Assim como outros meacutetodos eleitorais este sofre igualmente dos males produzidos pelovoto taacutetico Sua principal desvantagem eacute discutida na seccedilatildeo abaixo

                                  263 Voto Uacutetil no SVS

                                  Da mesma maneira que no Approval Voting atraveacutes do bullet voting o SVS tambeacutempode ser convertido em uma eleiccedilatildeo sob o meacutetodo FPTP em um cenaacuterio com um grande

                                  28

                                  volume de eleitores maliciosos O voto uacutetil sob este sistema se manifesta pontuando-seapenas um candidato com uma nota positiva e todos os outros com as notas mais baixasda escala Se todos os eleitores se aproveitarem dessa abordagem natildeo existiraacute distinccedilatildeoefetiva entre uma eleiccedilatildeo sob SVS e FPTP Essencialmente cada eleitor estaacute votando emapenas um candidato Essa eacute a principal desvantagem do SVS e ela consegue eliminarsua principal vantagem dar ao eleitor um poder maior de expressatildeo

                                  27 BLOC VOTE

                                  O Bloc Vote eacute um meacutetodo utilizado para a eleiccedilatildeo de candidatos a cargos no governocom mais de uma vacacircncia Pode ser considerado um meio-termo entre o FPTP e oAVS pois os eleitores podem votar em mais de um candidato poreacutem satildeo limitados pelonuacutemero de vagas Em uma eleiccedilatildeo com duas vagas por exemplo cada eleitor selecionaraacutedois candidatos ou menos Sensatamente o candidato mais votado eacute eleito Ele possuialgumas utilizaccedilotildees em eleiccedilotildees locais em algumas partes da Inglaterra (Electoral ReformSociety 2017a)

                                  271 Exemplo

                                  Neste exemplo dois candidatos seratildeo eleitos logo cada eleitor votaraacute em no maacuteximodois candidatos A distribuiccedilatildeo de votos pode ser conferida na tabela 10 e o resultado dacontagem de votos na tabela 11 abaixo Os candidatos eleitos satildeo o C totalizando 78do maacuteximo de votos possiacuteveis para um candidato e o A com 43

                                  Tabela 10 ndash Exemplo BV

                                  Aprovaccedilotildees Ndeg de eleitoresAC 20AB 16BC 19BD 6CA 7CD 15DC 17

                                  Tabela 11 ndash Resultado BVCandidatos Total de votos

                                  A 43B 41C 78D 38

                                  29

                                  272 Voto Uacutetil no BV

                                  Neste sistema eacute possiacutevel que um eleitor evite votar em sua primeira opccedilatildeo quandoeste natildeo tem chances de vitoacuteria e se fazendo isto ele diminuiraacute as chances de algum outrocandidato de seu desgosto ganhar Poreacutem o sistema previne um outro tipo de voto uacutetilEm eleiccedilotildees com mais de uma vaga onde os eleitores soacute podem votar em um candidatose um eleitor sabe que sua primeira opccedilatildeo tambeacutem eacute a primeira opccedilatildeo da maior parteda populaccedilatildeo e portanto muito provavelmente seraacute um dos candidatos eleitos eacute possiacutevelque ele arrisque votar em uma segunda opccedilatildeo sua na esperanccedila de a longo prazo elegersuas duas principais opccedilotildees de voto Com os eleitores podendo votar no nuacutemero exato devagas disponiacuteveis esse tipo de pensamento taacutetico perde o sentido

                                  30

                                  3 O SIMULADOR

                                  Para este trabalho foi implementado um simulador eleitoral na forma de uma aplicaccedilatildeoweb para que a interaccedilatildeo do usuaacuterio fosse facilitada Veremos a seguir como se daacute suautilizaccedilatildeo de forma geral

                                  Figura 2 ndash Captura de tela 1

                                  Figura 3 ndash Captura de tela 2

                                  A primeira opccedilatildeo encontrada pelo usuaacuterio eacute a escolha de quais sistemas de votaccedilatildeo se-ratildeo simulados (Figura 2) Todos eles podem ser selecionados para rodar simultaneamentePoreacutem natildeo eacute permitido rodar uma simulaccedilatildeo do Bloc Vote para uma eleiccedilatildeo onde apenasum candidato eacute eleito aleacutem disso natildeo existe implementaccedilatildeo dos meacutetodos TRS e IRV para

                                  31

                                  eleiccedilotildees com mais de um candidato eleito jaacute que eles se comportariam exatamente comono FPTP

                                  A maioria das linguagens de programaccedilatildeo senatildeo todas possuem um gerador de nuacuteme-ros pseudoaleatoacuterios que fornece a possibilidade de definir uma seed para o gerador Estaseed funciona como um ponto de partida para a geraccedilatildeo dos nuacutemero e portanto todasimulaccedilatildeo que rodar com a mesma seed sempre teraacute os mesmos resultados Se nenhumvalor for fornecido pelo usuaacuterio o tempo atual do sistema eacute utilizado As opccedilotildees subse-quentes satildeo a escolha do nuacutemero de eleitores gerados e o nuacutemero de vagas (Figura 3) Senenhum valor for fornecido o nuacutemero de eleitores padratildeo utilizado eacute 1000 e o nuacutemero devagas igual a 1

                                  Figura 4 ndash Captura de tela 3

                                  Este simulador possui dois modos para a criaccedilatildeo dos rankings dos eleitores No modoManipulate (Figura 4) primeiramente se define o nuacutemero de candidatos atraveacutes do campode entrada ao lado do tiacutetulo Candidates ou alternativamente pode-se adicionar candida-tos um a um atraveacutes do sinal de mais na parte inferior da paacutegina Para cada candidatoeacute possiacutevel definir a porcentagem de seus eleitores que optaraacute pelo voto taacutetico e pelovoto de minoria Tambeacutem eacute possiacutevel alterar o nome dos candidatos se for do interessedo usuaacuterio

                                  32

                                  Figura 5 ndash Captura de tela 4

                                  Figura 6 ndash Captura de tela 5

                                  33

                                  Figura 7 ndash Captura de tela 6

                                  Apoacutes a criaccedilatildeo dos candidatos o usuaacuterio pode criar perfis de eleitores que definiratildeo demaneira exata como partes da populaccedilatildeo iraacute votar (Figura 5) Em cada perfil se defineo valor em porcentos da populaccedilatildeo votante que o adotaraacute e a nota de cada candidatoTambeacutem eacute possiacutevel nomear cada perfil livremente

                                  No modo Generate (Figura 6) eacute onde o gerador de nuacutemeros pseudoaleatoacuterios eacute usadoNesse modo ao inveacutes do usuaacuterio criar perfis de eleitores ele define qual seraacute a distribuiccedilatildeoadotada para a geraccedilatildeo de notas de cada candidato Essas distribuiccedilotildees seratildeo mais bemdetalhadas no Capiacutetulo 5 Da mesma maneira que no modo Manipulate nesse modotambeacutem eacute possiacutevel definir os valores para os dois tipos de voto uacutetil os votos taacuteticos eos votos de minoria No primeiro estatildeo incluiacutedas as estrateacutegias de mudanccedila de votoespeciacuteficas de cada sistema como o bullet voting no AVS e SVS ou quando a preferecircnciade um eleitor claramente natildeo possui chances de vitoacuteria e ele muda seu voto para um doscandidatos que esteja na lideranccedila o que ocorre no FPTP e TRS O voto de minoriase apresenta apenas no FPTP em eleiccedilotildees onde mais de um candidato eacute eleito Se apreferecircncia de um eleitor claramente lidera a eleiccedilatildeo por ser tambeacutem a preferecircncia damaior parte da populaccedilatildeo esse eleitor pode mudar o seu voto para uma segunda opccedilatildeona esperanccedila de eleger dois de seus candidatos favoritos

                                  Por fim em ambos os modos o usuaacuterio tem a opccedilatildeo de definir coalizotildees entre oscandidatos se o sistema TRS estiver habilitado pois as coalizotildees apenas se manifestamnesse sistema Essas coalizotildees alteraratildeo as notas dos candidatos dependendo dos outroscandidatos pertencentes a elas (Figura 7)

                                  A aplicaccedilatildeo pode ser encontrada na paacutegina httpelectionsimpythonanywherecom

                                  34

                                  4 CENAacuteRIOS PERTINENTES

                                  Para todos os cenaacuterios deste capiacutetulo seraacute usada a seed do simulador igual a 100 e apopulaccedilatildeo de eleitores igual a 1000 para que exista consistecircncia na anaacutelise e tambeacutem paraque possa haver replicaccedilatildeo dos resultados se necessaacuterio

                                  41 CENAacuteRIO 1 VOTO TAacuteTICO

                                  Neste exemplo teremos quatro candidatos Ana Beto Carla e Diego Ana e Betoseratildeo gerados a partir da distribuiccedilatildeo Neutral (Figura 47) Carla da distribuiccedilatildeo Disliked(Figura 51) e Diego da Hated (Figura 55) Para a simulaccedilatildeo com a seed 100 o melhorcandidato a ser eleito ou seja aquele que maximiza a meacutedia das notas dos eleitores eacute oBeto com uma meacutedia de 0073 Para cada sistema seratildeo comparados os resultados semvoto taacutetico aos com 20 de voto taacutetico a favor da Ana Abaixo se encontram osresultados para o sistema FPTP

                                  Figura 8 ndash FPTP - Cenaacuterio 1 sem voto taacutetico

                                  Figura 9 ndash TRS segundo turno - Cenaacuterio 1 sem voto taacutetico

                                  35

                                  Figura 10 ndash IRV primeiro turno - Cenaacuterio 1

                                  Figura 11 ndash IRV segundo turno - Cenaacuterio 1

                                  Figura 12 ndash IRV terceiro turno - Cenaacuterio 1

                                  36

                                  Figura 13 ndash AVS - Cenaacuterio 1 sem voto taacutetico

                                  Figura 14 ndash BC - Cenaacuterio 1 sem voto taacutetico

                                  Figura 15 ndash SVS - Cenaacuterio 1 sem voto taacutetico

                                  37

                                  Nesse cenaacuterio sem voto taacutetico o uacutenico sistema que natildeo elege o Beto eacute o AVS Todosos outros elegem o melhor candidato Ou seja apesar de Beto ter uma melhor meacutediadas notas dos eleitores existem mais eleitores que ranqueiam Ana com uma nota acimade 0 No entanto apenas 20 dos eleitores de Diego e Carla que preferem a Ana aoinveacutes do Beto satildeo o suficiente para fazer Beto natildeo ser eleito se eles decidirem abandonarsua primeira opccedilatildeo e votar na Ana Considerando a vantagem que os votos taacuteticosproporcionam agrave Ana esta eacute eleita em todos os sistemas menos o TRS e o IRV

                                  Figura 16 ndash FPTP - Cenaacuterio 1 - 20 de voto taacutetico na Ana

                                  Figura 17 ndash TRS segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                  38

                                  Figura 18 ndash IRV primeiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                  Figura 19 ndash IRV segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                  Figura 20 ndash IRV terceiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                  39

                                  Figura 21 ndash AVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                                  Figura 22 ndash BC - Cenaacuterio 1 20 de voto taacutetico na Ana

                                  Figura 23 ndash SVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                                  40

                                  Eacute claro que se os eleitores que preferem o Beto tambeacutem votassem de maneira estra-teacutegica a situaccedilatildeo se equilibraria e haveria o mesmo niacutevel de concorrecircncia entre os doiscandidatos que ocorre quando natildeo haacute voto taacutetico Poreacutem no Borda Count esse equiliacute-brio pode natildeo acontecer e as estrateacutegias de compromising e burying podem acabar saindopela culatra se uma porcentagem elevada dos eleitores as adotarem Abaixo encontram-seos resultados para esse sistema quando 100 dos eleitores de Carla e Diego se comportammaliciosamente

                                  Figura 24 ndash BC - Cenaacuterio 1 100 de voto taacutetico na Ana e Beto

                                  Por causa do uso demasiado da estrateacutegia burying Ana e Beto perdem muitos pontose isso abre espaccedilo para uma vitoacuteria da Carla No entanto para porcentagens menores que100 o Beto ainda eacute o vencedor

                                  Essas duas estrateacutegias tambeacutem foram implementadas nesse simulador para o sistemaIRV e eacute possiacutevel ver como ele eacute resistente a elas Para que seja possiacutevel mudar os resultadosde uma eleiccedilatildeo sob o IRV eacute necessaacuterio mudar a ordem de eliminaccedilatildeo dos candidatos paraque o seu candidato preferido acabe enfrentando um candidato mais fraco nas rodadasfinais Isso natildeo ocorre com compromising e burying No proacuteximo cenaacuterio seraacute analisadacomo eacute possiacutevel modificar os resultados de uma eleiccedilatildeo sob o IRV

                                  Esses resultados podem ser replicados acessando os linksSem votos taacuteticos lthttpelectionsimpythonanywherecomdirect_res1111110

                                  --[0021][22Ana2222Beto222022Carla2222Diego22]------100gt

                                  Com 20 de voto taacutetico lthttpelectionsimpythonanywherecomdirect_res1111110--[0021][22Ana222022Beto2222Carla2222Diego22]1-[02000]---100gt

                                  Com 100 de voto taacuteticona Ana e Beto lthttpelectionsimpythonanywherecomdirect_res0000100--[0021][22Ana222022Beto222022Carla2222Diego22]1-[101000]---100gt

                                  41

                                  42 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV

                                  Neste cenaacuterio teremos Ana Carla e Beto concorrendo e trecircs perfis distintos que apoiamcada candidato As distribuiccedilotildees de notas dos perfis se encontram na tabela abaixo

                                  Tabela 12 ndash Distribuiccedilatildeo de notas - Cenaacuterio 2

                                  Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                  deeleitores

                                  1 10 5 0 422 0 10 5 303 5 0 10 28

                                  Com essas distribuiccedilotildees Carla eacute eliminada na primeira rodada e seus 28 de votossatildeo transferidos para a segunda opccedilatildeo de seus eleitores Ana que eacute eleita com 70 dosvotos e uma meacutedia de 56

                                  Figura 25 ndash IRV primeiro turno - Cenaacuterio 2

                                  Figura 26 ndash IRV segundo turno - Cenaacuterio 2

                                  42

                                  Cientes desse provaacutevel futuro cenaacuterio onde Ana eacute eleita uma pequena parte dos elei-tores de Beto estrategicamente o abandona e decide apoiar Carla na esperanccedila de leva-laao segundo turno contra Ana As novas distribuiccedilotildees de notas se encontram na tabelaabaixo com essa porccedilatildeo de eleitores representada pelo perfil 4

                                  Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2

                                  Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                  deeleitores

                                  1 10 5 0 422 0 10 5 283 5 0 10 284 0 8 10 2

                                  Essa mudanccedila estrateacutegica de voto altera a ordem de eliminaccedilotildees do sistema com Betosendo o primeiro a ser eliminado Com isso seus votos satildeo naturalmente transferidos paraCarla que derrota Ana no segundo turno com 58 dos votos

                                  Figura 27 ndash IRV primeiro turno com voto taacutetico - Cenaacuterio 2

                                  Figura 28 ndash IRV segundo turno com voto taacutetico - Cenaacuterio 2

                                  43

                                  Percebendo que a eleiccedilatildeo de Beto natildeo era provaacutevel seus eleitores conseguiram aomenos impedir a eleiccedilatildeo do pior candidato para eles Mas para isso foi necessaacuterio queeles tivessem a informaccedilatildeo de como os outros eleitores votariam Uma aproximaccedilatildeo dessasinformaccedilotildees poderia ser obtida em um cenaacuterio real com poucos candidatos atraveacutes depesquisas eleitorais poreacutem se o nuacutemero de candidatos eacute significativo uma noccedilatildeo completadas distribuiccedilotildees dos rankings dos eleitores se torna muito menos viaacutevel e dificulta aformulaccedilatildeo de estrateacutegias para alterar a ordem em que os candidatos satildeo eliminados

                                  Esses resultados podem ser replicados acessando os linksSem voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana22

                                  22Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                  Com voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana

                                  2222Beto2222Carla22]-----42Voter20Profile2001020520028Voter20Profile2010201020528Voter20Profile202520020102Voter20Profile20302082010100gt

                                  43 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE

                                  O interessante dos sistemas IRV e TRS eacute que os resultados do cenaacuterio anterior po-deriam ter sido obtidos ao inveacutes do voto taacutetico pela sua natildeo-monotonicidade Seriapossiacutevel que a Carla derrotasse a Ana no segundo turno atraveacutes do proacuteprio aumento depopularidade da Ana Assumindo que essa popularizaccedilatildeo ocorresse entre os candidatosdo perfil 2 onde 3 passasse a apoiar a Ana ao inveacutes do Beto as novas distribuiccedilotildeesseguiriam a tabela abaixo

                                  Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                  Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                  deeleitores

                                  1 10 5 0 452 0 10 5 273 5 0 10 28

                                  Dessa maneira Beto agora com uma porcentagem dos eleitores menor do que a deCarla seraacute eliminado na primeira rodada e como seus eleitores tecircm a Carla como segundaopccedilatildeo ela receberaacute todos os seus votos e seraacute eleita na segunda rodada As rodadas doIRV podem ser vistas nas figuras 29 e 30

                                  44

                                  Figura 29 ndash IRV primeiro turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                  Figura 30 ndash IRV segundo turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                  Tabela 15 ndash Resultados do Cenaacuterio 3Candidato

                                  eleitoMeacutedia das

                                  notasAntes da

                                  popularizaccedilatildeode Ana

                                  Ana 56

                                  Apoacutespopularizaccedilatildeo

                                  de AnaCarla 415

                                  Os efeitos dessa caracteriacutestica se refletem na satisfaccedilatildeo meacutedia da populaccedilatildeo A Ana eacuteclaramente a melhor candidata e mesmo com o seu ganho de popularidade (ou devido aele) a Carla eacute eleita

                                  Esses resultados podem ser replicados acessando os linksAntes da popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecom

                                  direct_res0010000---[22Ana2222Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                  45

                                  Apoacutes popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana2222Beto2222Carla22]-----45Voter20Profile2001020520027Voter20Profile2010201020528Voter20Profile20252002010100gt

                                  44 CENAacuteRIO 4 COALIZOtildeES

                                  O TRS por ser organizado em dois turnos separados normalmente a semanas dedistacircncia um do outro acaba abrindo brecha agrave mudanccedila de opiniatildeo por parte dos eleitorese o desenvolvimento de novas estrateacutegias por parte dos candidatos tais como a coalizatildeocom candidatos jaacute eliminados Com isso em mente nesse cenaacuterio teremos novamenteos quatro candidatos Ana Beto Carla e Diego Os trecircs primeiros seratildeo gerados dadistribuiccedilatildeo Neutral e Diego da distribuiccedilatildeo Disliked

                                  Figura 31 ndash TRS turno 1 - Cenaacuterio 4

                                  No TRS normal Ana Beto e Carla possuem com essas distribuiccedilotildees quantidades devotos muito proacuteximas com Beto e Carla indo para o segundo turno Carla estaacute 10 votosatraacutes de Beto e decide aproveitar o espaccedilo de tempo entre os dois turnos para tentaragregar mais votos Com isso Carla se aproxima de Diego e juntos formam uma coalizatildeoNo entanto com sua baixa popularidade Diego acaba ferindo a reputaccedilatildeo de Carla etorna o segundo turno muito mais faacutecil para Beto (Figura 33) Se Carla tivesse buscado osuporte de Ana por outro lado ela se veria vitoriosa no segundo turno e com uma amplavantagem sobre o Beto (Figura 34) Ou ateacute mesmo sem buscar uma coalizatildeo mesmosendo uma corrida apertada Carla teria naturalmente sido eleita (Figura 32)

                                  Esses resultados podem ser replicados acessando os linksSem coalizotildees lthttpelectionsimpythonanywherecomdirect_res0100000

                                  --[0002][22Ana222022Beto2222Carla2222Diego22]------100gt

                                  46

                                  Figura 32 ndash TRS turno 2 - Cenaacuterio 4

                                  Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4

                                  Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4

                                  47

                                  Coalizatildeo Carla e Diego lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2203Carla20Diego-100gt

                                  Coalizatildeo Carla e Ana lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2200Carla20Ana-100gt

                                  45 CENAacuteRIO 5 DILEMA DO PRISIONEIRO

                                  Neste cenaacuterio temos uma eleiccedilatildeo de uma vaga com trecircs candidatos concorrentes e trecircsperfis distintos de eleitores que seguiratildeo as seguintes distribuiccedilotildees

                                  Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5

                                  Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                  deeleitores

                                  1 10 -10 5 362 -10 10 5 343 -10 -10 5 30

                                  Esse contexto nos remete ao notaacutevel dilema do prisioneiro Nele dois prisioneiroscuacutemplices satildeo interrogados individualmente sem poder se comunicar um com o outro ecada um enfrenta o dilema de delatar ou natildeo o seu parceiro Se os dois prisioneirosdecidem se manter calados sobre o crime ambos satildeo sentenciados a um ano de prisatildeo Seapenas um deles dedurar o outro o traidor sai livre enquanto seu parceiro eacute condenadoa trecircs anos Se ambos dedurarem um ao outro eles satildeo condenados juntos a dois anosde prisatildeo Esse dilema eacute uma ideia claacutessica presente no estudo da teoria dos jogos sendooriginalmente elaborada por Merrill Flood e Melvin Dresher em 1950 e mais tarde sendonomeada de dilema dos prisioneiros por Albert W Tucker (POUNDSTONE 1992)

                                  O que esse dilema nos mostra eacute a tentaccedilatildeo que o indiviacuteduo deteacutem se sua racionalizaccedilatildeoestiver voltada para seus proacuteprios interesses e somente eles em oposiccedilatildeo a pensar no bemdo grupo como um todo Neste cenaacuterio encontramos dois grupos de eleitores expressiva-mente opostos os perfis 1 e 2 Se qualquer uma das preferecircncias desses perfis fosse eleitaisso significaria uma alta rejeiccedilatildeo de maior parte da populaccedilatildeo No entanto eles possuema segunda opccedilatildeo em comum a Carla que por sua vez eacute a preferecircncia do terceiro perfilPortanto a eleiccedilatildeo da Carla seria logicamente o resultado oacutetimo

                                  Mesmo assim a Ana eacute eleita nos dois sistemas acima o que natildeo parece justo poispela tabela 16 eacute evidente que apenas 36 da populaccedilatildeo a aprova enquanto que os outros64 a reprovam ao maacuteximo O sistema IRV se comporta de maneira idecircntica ao TRS

                                  48

                                  Figura 35 ndash FPTP - Cenaacuterio 5

                                  Figura 36 ndash TRS segundo turno - Cenaacuterio 5

                                  nesta situaccedilatildeo Com esse resultado a meacutedia das notas eacute -28 No entanto os trecircs sistemasseguintes nos apresentam resultados diferentes

                                  Tabela 17 ndash Resultados do Cenaacuterio 5

                                  Sistema Candidatoeleito

                                  Meacutedia dasnotas

                                  FPTP Ana -28TRS Ana -28IRV Ana -28AVS Carla 50BC Carla 50SVS Carla 50

                                  49

                                  Figura 37 ndash AVS - Cenaacuterio 5

                                  Figura 38 ndash BC - Cenaacuterio 5

                                  Tanto o AVS quanto o Borda Count e o SVS satildeo sistemas que consideram todasas opiniotildees de cada eleitor ao mesmo tempo e por isso satildeo capazes de eleger o melhorcandidato nesta situaccedilatildeo diferentemente do TRS que natildeo absorve completamente todosentimento do eleitor por todos os candidatos e o IRV que apesar de ser bem expressivoquebra esse processo em inuacutemeras rodadas o que permite a perda de informaccedilatildeo ao longodelas

                                  Esses resultados podem ser replicados acessando o linklthttpelectionsimpythonanywherecomdirect_res1111110---[22Ana

                                  222022Beto222022Carla22]-----36Voter20Profile2001020-1020534Voter20Profile201-10201020530Voter20Profile202-1020-10205100gt

                                  50

                                  Figura 39 ndash SVS - Cenaacuterio 5

                                  46 CENAacuteRIO 6 VOTO DE MINORIA

                                  Neste cenaacuterio temos uma eleiccedilatildeo com quatro candidatos e duas vagas A Ana seraacutea preferecircncia de uma extensa parte da populaccedilatildeo (distribuiccedilatildeo Loved Figura 53) Betoe Carla seratildeo candidatos razoavelmente populares (distribuiccedilatildeo Neutral Figura 47) eDiego seraacute a preferecircncia de apenas um pequeno grupo especiacutefico e rejeitado pela maioria(distribuiccedilatildeo Disliked Figura 51) Eacute intuitivo esperar que os dois candidatos eleitos seratildeoa Ana e ou o Beto ou a Carla e isso eacute exatamente o que ocorre na figura 40 no sistemaFPTP sem voto de minoria

                                  Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria

                                  Eacute evidente a discrepacircncia da quantidade de votos da Ana para os outros candidatose apesar de Beto e Carla serem mais populares que Diego os trecircs natildeo se encontrammuito afastados Poreacutem se a pequena fraccedilatildeo de candidatos que possuem a Ana como

                                  51

                                  Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego

                                  preferecircncia e Diego como segunda opccedilatildeo optarem pelo voto de minoria a situaccedilatildeo mudacompletamente (Figura 41) Assim apesar de extensamente rejeitado Diego conquistaa segunda vaga e a meacutedia das notas despenca de 2929 para 0505 No entanto aindaexiste um cenaacuterio pior Se os outros grupos de eleitores pensarem da mesma forma eevitarem votar na Ana achando que sua eleiccedilatildeo jaacute estaacute assegurada apenas 80 de votode minoria para esses grupos jaacute eacute o suficiente para eliminaacute-la das eleiccedilotildees (Figura 42)Com a Ana eliminada a meacutedia das notas cai ainda mais para 0058

                                  Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego

                                  O sistema Bloc Vote eacute uma das soluccedilotildees para o voto de minoria Permitindo queos eleitores votem no mesmo nuacutemero de candidatos que de vagas a serem preenchidasnatildeo existe o iacutempeto a esse tipo de voto estrateacutegico O resultado desse sistema portantoretorna a meacutedia das notas a casa dos 29 (Figura 43) Os sistemas AVS Borda Count eSVS tambeacutem impedem a presenccedila do voto de minoria e atingem resultados semelhantes

                                  52

                                  Figura 43 ndash BV - Cenaacuterio 6

                                  Tabela 18 ndash Resultados do Cenaacuterio 6

                                  Sistema Candidatoseleitos

                                  Meacutedia dasnotas

                                  FPTP sem voto de minoriaAna eBeto 2929

                                  FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

                                  FPTP com 80 de voto de minoriaBeto eCarla 0058

                                  Bloc VoteAna eCarla 2913

                                  Esses resultados podem ser replicados acessando os links

                                  Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

                                  100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

                                  80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

                                  53

                                  5 COMO FUNCIONA O SIMULADOR

                                  O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

                                  51 CLASSE ELECTIONS

                                  Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

                                  bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

                                  Figura 44 ndash estrutura candidates

                                  bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

                                  bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

                                  Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

                                  Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

                                  54

                                  Figura 45 ndash estrutura voters

                                  Figura 46 ndash estrutura votes

                                  daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

                                  Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

                                  55

                                  Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

                                  Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

                                  na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

                                  56

                                  Figura 49 ndash PDF - Distribuiccedilatildeo Liked

                                  Figura 50 ndash CDF - Distribuiccedilatildeo Liked

                                  (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

                                  Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

                                  57

                                  Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

                                  Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

                                  candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

                                  Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

                                  58

                                  Figura 53 ndash PDF - Distribuiccedilatildeo Loved

                                  Figura 54 ndash CDF - Distribuiccedilatildeo Loved

                                  funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

                                  59

                                  Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                                  Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                                  Meacutedia das Notas sumei

                                  sumvj nij

                                  etimes v

                                  Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                                  Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                                  60

                                  Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                                  Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                                  52 CLASSE FIRSTPASTTHEPOST

                                  Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                                  Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                                  61

                                  Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                                  Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                                  mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                                  62

                                  53 CLASSE TWOROUNDSYSTEM

                                  A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                                  54 CLASSE INSTANTRUNOFFVOTING

                                  A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                                  Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                                  63

                                  cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                                  55 CLASSE APPROVALVOTING

                                  Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                                  56 CLASSE BORDACOUNT

                                  Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                                  57 CLASSE SCOREVOTING

                                  De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                                  64

                                  58 CLASSE BLOCVOTE

                                  O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                                  59 TECNOLOGIAS UTILIZADAS

                                  A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                                  Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                                  O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                                  Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                                  65

                                  6 CONCLUSAtildeO

                                  Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                                  Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                                  Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                                  Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                                  Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                                  66

                                  REFEREcircNCIAS

                                  AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                                  Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                                  Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                                  Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                                  HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                                  LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                                  ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                                  Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                                  POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                                  The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                                  67

                                  APEcircNDICES

                                  APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                  Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                  if(not len(selfvoter_profiles))

                                  for voter in range(selfN_VOTERS)

                                  candidates_rank = dict()

                                  for candidate in reversed(range(selfN_CANDIDATES))

                                  if(selfBIAS_VECTOR[candidate]==4)

                                  candidates_rank[candidate] = self_sortear(selfloved)

                                  elif(selfBIAS_VECTOR[candidate]==3)

                                  candidates_rank[candidate] = self_sortear(selfliked)

                                  elif(selfBIAS_VECTOR[candidate]==2)

                                  candidates_rank[candidate] = self_sortear(selfdisliked)

                                  elif(selfBIAS_VECTOR[candidate]==1)

                                  candidates_rank[candidate] = self_sortear(selfhated)

                                  elif(selfBIAS_VECTOR[candidate]==-1)

                                  candidates_rank[candidate] = self_sortear(selfpolarizer

                                  )

                                  elif(selfBIAS_VECTOR[candidate]==-2)

                                  candidates_rank[candidate] = self_sortear(self

                                  more_polarizer)

                                  else

                                  candidates_rank[candidate] = self_sortear(selfneutral)

                                  selfvotersappend(candidates_rank)

                                  else

                                  ranges = []

                                  ranks = []

                                  for prof in selfvoter_profiles

                                  rangesappend(int(prof[pop_percentage]))

                                  rank =

                                  for index score in enumerate(prof[scores])

                                  rank[index] = score

                                  ranksappend(rank)

                                  for index _range in enumerate(ranges)

                                  for _ in range(int(selfN_VOTERS(_range100)))

                                  selfvotersappend(ranks[index])

                                  68

                                  APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                  Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                  for i in range(selfN_CANDIDATES)

                                  selfcandidates[i] = 0

                                  selfvotes[i] = set()

                                  APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                  Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                  for candidate in range(selfN_CANDIDATES)

                                  rating_sum = 0

                                  for voter in selfvoters

                                  rating_sum += voter[candidate]

                                  selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                  APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                  Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                  if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                  return selfcalculate_mean(winners)

                                  else

                                  chose_best = True if winners[0] == selfbest_candidate else

                                  False

                                  return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                  69

                                  APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                  Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                  rating_sum = 0

                                  for voter in selfvoters

                                  for candidate in winners

                                  rating_sum += voter[candidate]

                                  return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                  APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                  Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                  for i in range(1 selfN_VACANCIES + 2)

                                  selfleading_candidatesappend(selfsorted_candidates[-i][self

                                  CANDIDATE_INDEX])

                                  APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                  Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                  for leader in selfelecrounds[-1]

                                  selfleading_candidatesappend(leader[0])

                                  70

                                  APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                  Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                  self_account_for_coalitions()

                                  for voter in selfvoters

                                  selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                  (1)))

                                  temp = []

                                  for voter in selfsorted_voters

                                  new_dict = defaultdict(list)

                                  for k in voter

                                  new_dict[k[1]]append(k[0])

                                  tempappend(new_dict)

                                  selfsorted_voters = []

                                  for voter_index current_voter in enumerate(temp)

                                  new_voter = []

                                  for rating candidate_indexes in current_voteritems()

                                  if len(current_voter[rating]) gt 1

                                  shuffle(current_voter[rating])

                                  for e in candidate_indexes

                                  new_voterappend((e rating))

                                  else

                                  new_voterappend((candidate_indexes[0] rating))

                                  selfsorted_votersappend(new_voter)

                                  selfcandidates[new_voter[-1][0]] += 1

                                  selfvotes[new_voter[-1][0]]add(voter_index)

                                  71

                                  APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                  Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                  for candidate in selfvotes_copy

                                  if candidate not in selfelecleading_candidates

                                  for voter_index in selfvotes_copy[candidate]

                                  for index _candidate in enumerate(reversed(selfelec

                                  sorted_voters[voter_index]))

                                  if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                  leading_candidates

                                  if randomrandom() lt selfelec

                                  tactical_vote_percentages[_candidate[selfelec

                                  CANDIDATE_INDEX]]

                                  selfrankings_changed[voter_index] = copy

                                  deepcopy(selfelecsorted_voters[voter_index])

                                  selfrankings_changed[voter_index][-(index + 1)]

                                  selfrankings_changed[voter_index][-1] = self

                                  rankings_changed[voter_index][-1] self

                                  rankings_changed[voter_index][-(index + 1)]

                                  selfcandidates[candidate] -= 1

                                  selfcandidates[_candidate[selfelec

                                  CANDIDATE_INDEX]] += 1

                                  selfvotes[candidate]remove(voter_index)

                                  selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                  ]]add(voter_index)

                                  break

                                  break

                                  72

                                  APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                  Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                  half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                  for candidate in selfelecleading_candidates

                                  if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                  continue

                                  for voter_index in selfvotes_copy[candidate]

                                  if voter_index in selfrankings_changed

                                  ranking = selfrankings_changed[voter_index]

                                  else

                                  ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                  ])

                                  for index _candidate in enumerate(reversed(ranking))

                                  if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                  leading_candidates or (_candidate[selfelec

                                  CANDIDATE_INDEX] in selfelecleading_candidates and

                                  selfelecleading_candidatesindex(_candidate[selfelec

                                  CANDIDATE_INDEX]) gt= half_vacancies)

                                  if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                  if randomrandom() lt selfelec

                                  minority_vote_percentages[_candidate[selfelec

                                  CANDIDATE_INDEX]]

                                  selfcandidates[candidate] -= 1

                                  selfcandidates[_candidate[selfelec

                                  CANDIDATE_INDEX]] += 1

                                  break

                                  break

                                  break

                                  73

                                  APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                  Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                  self_account_for_coalitions()

                                  for candidate in selfvotes

                                  if candidate = selfwinner and candidate = selfsecond_place

                                  for voter_index in selfvotes[candidate]

                                  if voter_index in selfrankings_changed

                                  ranking = selfrankings_changed[voter_index]

                                  else

                                  ranking = copydeepcopy(selfelecsorted_voters[

                                  voter_index])

                                  for index2 candidate in enumerate(reversed(ranking))

                                  if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                  selfcandidates[selfwinner] += 1

                                  selfvotes[selfwinner]add(voter_index)

                                  break

                                  elif candidate[selfelecCANDIDATE_INDEX] == self

                                  second_place

                                  selfcandidates[selfsecond_place] += 1

                                  selfvotes[selfsecond_place]add(voter_index)

                                  break

                                  selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                  winners = []

                                  vacancies = selfelecN_VACANCIES

                                  for candidate in reversed(selfsorted_candidates)

                                  if vacancies == 0

                                  break

                                  winnersappend(candidate[0])

                                  vacancies -= 1

                                  mean chose_best = selfelecget_mean(winners = winners)

                                  74

                                  APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                  Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                  for voter_index voter in enumerate(selfelecsorted_voters)

                                  voter_dict = dict()

                                  og_voter_dict = dict()

                                  for tup in voter

                                  voter_dict[tup[0]] = tup[1]

                                  og_voter_dict[tup[0]] = tup[1]

                                  for coalition in selfeleccoalitions

                                  for candidate in coalition

                                  add_to_score = 0

                                  for candidate2 in coalition

                                  if candidate == candidate2

                                  continue

                                  half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                  if half lt 0

                                  add_to_score += mathceil(half)

                                  else

                                  add_to_score += mathfloor(half)

                                  if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                  voter_dict[candidate[rsquovaluersquo]] = 10

                                  elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                  voter_dict[candidate[rsquovaluersquo]] = -10

                                  else

                                  voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                  selfrankings_changed[voter_index] = []

                                  for candidate in voter_dict

                                  selfrankings_changed[voter_index]append((candidate voter_dict[

                                  candidate]))

                                  selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                  voter_index] key=lambda x x[1])

                                  75

                                  APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                  Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                  selfelecroundsappend(selfsorted_candidates[_round])

                                  if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                  N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                  N_VACANCIES - 1)

                                  return 2

                                  elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                  N_VOTERS gt 05)

                                  return 1

                                  else

                                  selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                  CANDIDATE_INDEX])

                                  for voter_index in selfvotes[selfsorted_candidates[_round][self

                                  elecCANDIDATE_INDEX]]

                                  if voter_index in selfrankings_changed

                                  for candidate in reversed(selfrankings_changed[voter_index

                                  ])

                                  if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                  excluded

                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                  ]] += 1

                                  selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                  add(voter_index)

                                  break

                                  else

                                  continue

                                  else

                                  for candidate in reversed(selfelecsorted_voters[

                                  voter_index])

                                  if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                  excluded

                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                  ]] += 1

                                  selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                  add(voter_index)

                                  break

                                  else

                                  continue

                                  selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                  return 0

                                  76

                                  APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                  Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                  for index in range(selfelecN_CANDIDATES)

                                  selfcandidates[index] = 0

                                  for voter in selfelecsorted_voters

                                  for candidate in reversed(voter)

                                  if candidate[selfelecCANDIDATE_SCORE] gt 0

                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                  else

                                  break

                                  APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                  Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                  for index in range(selfelecN_CANDIDATES)

                                  selfcandidates[index] = 0

                                  for voter in selfelecsorted_voters

                                  if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                  elecCANDIDATE_INDEX]]

                                  selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                  else

                                  for candidate in reversed(voter)

                                  if candidate[selfelecCANDIDATE_SCORE] gt 0

                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                  else

                                  break

                                  77

                                  APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                  Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                  pos = set()

                                  for index perc in enumerate(selfelectactical_vote_percentages)

                                  if perc gt 0

                                  posadd(index)

                                  for candidate in selfeleccandidates

                                  if candidate not in selfleading_candidates

                                  for voter_index in selfvotes[candidate]

                                  raised = None

                                  for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                  ])

                                  if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                  leading_candidates

                                  if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                  if randomrandom() lt selfelectactical_vote_percentages[

                                  candidate_tuple[selfelecCANDIDATE_INDEX]]

                                  ranking = [None]selfelecN_CANDIDATES

                                  ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                  selfelecvoters[voter_index][candidate_tuple[selfelec

                                  CANDIDATE_INDEX]])

                                  raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                  break

                                  break

                                  break

                                  if raised = None

                                  for _candidate in selfleading_candidates

                                  if _candidate = ranking[-1][0]

                                  ranking[0] = (_candidate selfelecvoters[voter_index][

                                  _candidate])

                                  buried = _candidate

                                  break

                                  i = 1

                                  for candidate_tuple in selfelecsorted_voters[voter_index]

                                  if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                  buried]

                                  continue

                                  else

                                  ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                  selfelecvoters[voter_index][candidate_tuple[selfelec

                                  CANDIDATE_INDEX]])

                                  i += 1

                                  selfrankings_changed[voter_index] = ranking

                                  78

                                  APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                  Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                  for voter_index in selfvotes[candidate]

                                  if randomrandom() lt selfelectactical_vote_percentages[candidate

                                  ]

                                  for _candidate in selfleading_candidates

                                  if _candidate = candidate

                                  ranking = [None]selfelecN_CANDIDATES

                                  ranking[0] = (_candidate selfelecvoters[voter_index][

                                  _candidate])

                                  buried = _candidate

                                  break

                                  i = 1

                                  for candidate_tuple in selfelecsorted_voters[voter_index]

                                  if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                  continue

                                  else

                                  ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                  selfelecvoters[voter_index][candidate_tuple[selfelec

                                  CANDIDATE_INDEX]])

                                  i += 1

                                  selfrankings_changed[voter_index] = ranking

                                  79

                                  APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                  Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                  for index in range(selfelecN_CANDIDATES)

                                  selfcandidates[index] = 0

                                  for voter_index voter in enumerate(selfelecsorted_voters)

                                  score = 0

                                  if voter_index in selfrankings_changed

                                  for candidate in selfrankings_changed[voter_index]

                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                  score += 1

                                  else

                                  for candidate in voter

                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                  score += 1

                                  APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                  Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                  for voter_index voter in enumerate(selfelecsorted_voters)

                                  if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                  elecCANDIDATE_INDEX]]

                                  selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                  sorted_voters[voter_index])

                                  for candidate_index candidate in enumerate(reversed(voter))

                                  if candidate_index == 0

                                  selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                  voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                  else

                                  selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                  voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                  80

                                  APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                  Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                  for index in range(selfelecN_CANDIDATES)

                                  selfcandidates[index] = 0

                                  for voter_index voter in enumerate(selfelecsorted_voters)

                                  if voter_index in selfrankings_changed

                                  for candidate in selfrankings_changed[voter_index]

                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                  selfelecCANDIDATE_RANK]

                                  else

                                  for candidate in voter

                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                  selfelecCANDIDATE_RANK]

                                  APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                  Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                  for index in range(selfelecN_CANDIDATES)

                                  selfcandidates[index] = 0

                                  for voter in selfelecsorted_voters

                                  votes = selfelecN_VACANCIES

                                  for candidate in reversed(voter)

                                  if votes == 0

                                  break

                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                  votes -= 1

                                  • Folha de aprovaccedilatildeo
                                  • Agradecimentos
                                  • Epiacutegrafe
                                  • Resumo
                                  • Abstract
                                  • Lista de ilustraccedilotildees
                                  • Lista de Coacutedigos
                                  • Lista de tabelas
                                  • Lista de abreviaturas e siglas
                                  • Sumaacuterio
                                  • INTRODUCcedilAtildeO
                                    • MOTIVACcedilAtildeO E OBJETIVO
                                    • MEacuteTODO
                                    • ESTRUTURA
                                      • SISTEMAS ELEITORAIS
                                        • FISRT PAST THE POST
                                          • Exemplo
                                          • Vantagens e Desvantagens do FPTP
                                          • Voto Uacutetil no FPTP
                                            • TWO-ROUND SYSTEM
                                              • Exemplo
                                              • Vantagens e Desvantagens do TRS
                                              • Voto Uacutetil no TRS
                                                • INSTANT-RUNOFF VOTING
                                                  • Exemplo
                                                  • Vantagens e Desvantagens do IRV
                                                  • Voto Uacutetil no IRV
                                                    • APPROVAL VOTING SYSTEM
                                                      • Exemplo
                                                      • Vantagens e Desvantagens do AVS
                                                      • Voto Uacutetil no AVS
                                                        • THE BORDA COUNT
                                                          • Exemplo
                                                          • Vantagens e Desvantagens do BC
                                                          • Voto Uacutetil no BC
                                                            • SCORE VOTING SYSTEM
                                                              • Exemplo
                                                              • Vantagens e Desvantagens do SVS
                                                              • Voto Uacutetil no SVS
                                                                • BLOC VOTE
                                                                  • Exemplo
                                                                  • Voto Uacutetil no BV
                                                                      • O SIMULADOR
                                                                      • CENAacuteRIOS PERTINENTES
                                                                        • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                        • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                        • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                        • CENAacuteRIO 4 COALIZOtildeES
                                                                        • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                        • CENAacuteRIO 6 VOTO DE MINORIA
                                                                          • COMO FUNCIONA O SIMULADOR
                                                                            • CLASSE Elections
                                                                            • CLASSE FirstPastThePost
                                                                            • CLASSE TwoRoundSystem
                                                                            • CLASSE InstantRunoffVoting
                                                                            • CLASSE ApprovalVoting
                                                                            • CLASSE BordaCount
                                                                            • CLASSE ScoreVoting
                                                                            • CLASSE BlocVote
                                                                            • TECNOLOGIAS UTILIZADAS
                                                                              • CONCLUSAtildeO
                                                                              • Referecircncias
                                                                              • Meacutetodo create_voters
                                                                              • Meacutetodo create_candidates
                                                                              • Meacutetodo calculate_means
                                                                              • Meacutetodo get_mean
                                                                              • Meacutetodo calculate_mean
                                                                              • Meacutetodo set_leading_candidates
                                                                              • Meacutetodo irv_set_leading_candidates
                                                                              • Meacutetodo sort_ranks
                                                                              • Meacutetodo fptp_count_tactical_votes
                                                                              • Meacutetodo fptp_count_minority_votes
                                                                              • Meacutetodo trs_second_round
                                                                              • Meacutetodo trs_account_for_coalitions
                                                                              • Meacutetodo irv_count_votes
                                                                              • Meacutetodo avs_count_votes
                                                                              • Meacutetodo avs_count_votes_with_tactical
                                                                              • Meacutetodo irv_apply_tactical_votes
                                                                              • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                              • Meacutetodo bc_sum_candidates_scores
                                                                              • Meacutetodo svs_apply_tactical_votes
                                                                              • Meacutetodo svs_sum_candidates_scores
                                                                              • Meacutetodo bv_count_votes

                                    18

                                    contagem dos votos o candidato com o maior nuacutemero de votos eacute eleito O vencedor natildeonecessita da aprovaccedilatildeo de mais de 50 dos eleitores ele apenas precisa de uma pluralidadedos votos ou seja apenas possuir mais votos que os outros candidatos

                                    Esse sistema eacute utilizado em escala nos Estados Unidos para a maior parte das eleiccedilotildeesvoltadas a eleger apenas um candidato como prefeitos e governadores aleacutem de ser usadana disputa presidencial Dentre outros paiacuteses que empregam o sistema em suas corridaspresidenciais estatildeo listados o Meacutexico as Filipinas a Coreia do Sul e a Venezuela

                                    211 Exemplo

                                    Tabela 1 ndash Exemplo FPTP

                                    Candidatos VotosA 36B 25C 22D 17

                                    Neste exemplo o candidato A possui uma pluralidade dos votos com 36 e ele eacute ocandidato eleito mesmo natildeo tendo uma maioria

                                    212 Vantagens e Desvantagens do FPTP

                                    A vantagem do FPTP eacute a sua simplicidade Natildeo eacute difiacutecil para um eleitor comumcompreender o seu funcionamento eles apenas precisam se decidir por um candidato Eletambeacutem eacute muito simples e direto na sua contagem e seleccedilatildeo do vencedor

                                    Esse meacutetodo tambeacutem tende a criar listas de candidatos concorrentes mais curtasCandidatos independentes ou de partidos menores frequentemente acabam se sentindodesencorajados a concorrer devido agraves suas baixas chances de vitoacuteria Isso normalmentefornece aos eleitores uma faacutecil decisatildeo entre um ou dois candidatos dos maiores partidosao mesmo tempo poreacutem limitando suas opccedilotildees

                                    No entanto sua essecircncia eacute sua principal desvantagem a pluralidade O fato do can-didato eleito natildeo necessitar de uma maioridade dos votos da populaccedilatildeo parece violaros princiacutepios baacutesicos da democracia Democracia eacute em sua origem o poder(kratos) nopovo(demos) poreacutem na pluralidade o poder de eleger um candidato pode residir emapenas uma fraccedilatildeo relativamente pequena do povo Em um cenaacuterio hipoteacutetico comapenas trecircs candidatos um deles apenas poderia necessitar de natildeo mais do que 34 dosvotos para ser eleito o que significa que no pior dos casos 66 da populaccedilatildeo rejeitao candidato eleito O cenaacuterio soacute piora com mais e mais candidatos concorrendo Paraquatro candidatos satildeo necessaacuterios 26 dos votos no pior dos casos para cinco satildeo 21 eassim por diante

                                    19

                                    213 Voto Uacutetil no FPTP

                                    No FPTP tambeacutem existe a possibilidade de os eleitores evitarem votar em sua prefe-recircncia verdadeira No caso de sua preferecircncia natildeo aparentar ter boas chances de vitoacuteriamuitas vezes opta-se por uma segunda opccedilatildeo que esteja mais bem colocada nas eleiccedilotildeesO motivo disso eacute que nessas situaccedilotildees votar em sua preferecircncia pode parecer um des-perdiacutecio do seu voto e no pior dos cenaacuterios optar por natildeo transferir seu voto para umasegunda opccedilatildeo pode acabar resultando na eleiccedilatildeo de um candidato de seu desgosto As-sim votar de maneira verdadeira muitas vezes pode acabar prejudicando o eleitor que sevecirc forccedilado a abandonar seus interesses poliacuteticos mais imediatos e escolher o menor entredois(ou mais) males Os candidatos de partidos menores satildeo os que mais sofrem com essetipo de voto estrateacutegico por natildeo conseguirem agregar as maiores quantidades de votos

                                    Entretanto ao mesmo tempo que partidos maiores roubam votos de partidos meno-res com os votos taacuteticos partidos menores tambeacutem tem a oportunidade de ganhar algunsvotos com o denominado spoiler effect Ao entrarem na eleiccedilatildeo candidatos de partidosmenores podem adquirir votos de candidatos mais populares que possuem inclinaccedilatildeo po-liacutetica semelhante Logo eacute possiacutevel que haja certo equiliacutebrio ao se contrapor as mudanccedilasde voto devido aos votos uacuteteis agraves mudanccedilas oriundas do spoiler effect

                                    Poreacutem o spoiler effect natildeo necessariamente ocorre apenas entre partidos maiores emenores mas pode prejudicar candidatos de popularidades proacuteximas Por exemplo entretrecircs candidatos A B e C onde A representa determinada posiccedilatildeo no espectro poliacuteticoenquanto B e C possuem posiccedilotildees parecidas o que pode acontecer eacute B e C se prejudicaremmutuamente jaacute que ambos dividem os eleitores de um mesmo espectro poliacutetico Se esseespectro tem a maioria com 60 por exemplo com B e C compartilhando cada um 30dos votos o candidato A sairia vencedor com 40 mesmo que todos os eleitores de Bprefiram C e todos os eleitores de C prefiram B Esse exemplo demonstra claramente oproblema com os sistemas de pluralidade

                                    22 TWO-ROUND SYSTEM

                                    Uma das primeiras tentativas de lidar com a desvantagem dos sistemas por pluralidadeo Two-round System eacute usado desde o seacuteculo XIX no ocidente e atualmente ainda eacute utilizadoem corridas presidecircncias de paiacuteses como o Brasil Bulgaacuteria Chile Colocircmbia FinlacircndiaPolocircnia Portugal Ruacutessia e em inuacutemeras eleiccedilotildees locais nos Estados Unidos

                                    O principal objetivo do TRS eacute garantir que o vencedor tenha conseguido uma maioriados votos Para isso as eleiccedilotildees satildeo estruturadas em duas rodadas de votaccedilatildeo Na primeirarodada os eleitores se dirigem agraves urnas e votam no candidato de sua preferecircncia Apoacutesa contagem se a quantidade de votos do candidato mais votado superar a proporccedilatildeo de50 natildeo haacute a necessidade de uma segunda rodada e este candidato eacute eleito No entantose este natildeo for o caso haveraacute uma segunda rodada com apenas os dois candidatos mais

                                    20

                                    votados Nesta rodada os eleitores retornam as urnas para escolher uma das duas opccedilotildeessendo eleito o candidato mais votado agora definitivamente com uma maioria dos votos

                                    221 Exemplo

                                    Utilizando a mesma distribuiccedilatildeo de votos descrita na tabela 1 Neste caso como ocandidato A natildeo possui uma maioria dos votos ele e o candidato B iratildeo concorrer em umsegundo turno Digamos que as distribuiccedilotildees dos votos dos eleitores dos candidatos C eD em relaccedilatildeo aos candidatos A e B satildeo as seguintes

                                    Tabela 2 ndash 2deg turno do TRS

                                    Candidatos Votos dos eleitoresde C

                                    Votos dos eleitoresde D

                                    Votos do 1degturno

                                    A 7 5 36B 15 12 25

                                    O candidato B agora eacute eleito com uma maioria dos votos 52 contra 48 do candidatoA

                                    222 Vantagens e Desvantagens do TRS

                                    Por ser parecido com o FPTP esse sistema tambeacutem eacute de faacutecil compreensatildeo do eleitorcomum poreacutem a maior vantagem do TRS eacute a garantia de que o candidato vencedor teraacute oapoio da maioria dos eleitores no segundo turno eliminando a pluralidade Argumenta-seque isso daacute maior legitimidade poliacutetica ao mandato do candidato eleito

                                    O TRS tende a abrigar uma lista maior de candidatos sendo mais convidativo acandidatos de partidos menores mesmo que suas chances natildeo sejam maiores quandocomparadas agraves eleiccedilotildees sob o FPTP Mesmo assim essa listagem mais abrangente eacute umavantagem do sistema pois daacute aos eleitores uma variedade maior de opccedilotildees de voto

                                    Em relaccedilatildeo agraves suas desvantagens o TRS possui duas principais A primeira satildeo oscustos elevados do sistema decorrentes da necessidade da organizaccedilatildeo de um segundoturno de votaccedilotildees A segunda eacute o aumento no iacutendice de ausecircncias dos eleitores agraves urnasEssa ampliaccedilatildeo no natildeo comparecimento dos eleitores se daacute tambeacutem devido ao segundoturno por pura fatiga eleitoral bem como consequecircncia da desistecircncia de eleitores queapoiam candidatos que jaacute foram eliminados

                                    Outro ponto negativo do TRS eacute a sua natildeo-monotonicidade Isso significa que umcandidato pode ser prejudicado com um aumento em sua popularidade e suporte e domesmo modo um candidato pode se beneficiar com a perda de popularidade e suporteSe os candidatos A e B satildeo os esperados para ir ao segundo turno onde A eacute mais fortedo que B um aumento no suporte pelo candidato A pode resultar na sua derrota quandoesse aumento causa uma alteraccedilatildeo nos candidatos que satildeo selecionados para ir ao segundoturno Se esse aumento na popularidade de A resultar na eliminaccedilatildeo preacutevia de B um

                                    21

                                    terceiro candidato C pode ser vitorioso sobre A no segundo turno caso os eleitores de Bprefiram C ao candidato A Se natildeo houvesse esse crescimento de popularidade A teriaderrotado B no segundo turno Essa situaccedilatildeo seraacute vista em melhores detalhes na seccedilatildeo 43

                                    223 Voto Uacutetil no TRS

                                    Esse sistema minimiza os efeitos do voto uacutetil em relaccedilatildeo ao FPTP pois um eleitorqualquer pode tranquilamente votar em sua preferecircncia sem se preocupar em desperdiccedilaacute-lo mesmo que seu candidato natildeo tenha chances de vitoacuteria Se este natildeo for eleito aindapoderaacute escolher a sua preferecircncia dentre os dois candidatos que prosseguirem para osegundo turno

                                    Apesar disso ainda existe um cenaacuterio em que o eleitor pode ser tentado a natildeo votar emsua preferecircncia Eacute possiacutevel que ele opte pela sua segunda opccedilatildeo se souber que sua primeiraopccedilatildeo possui miacutenimas chances de ir ao segundo turno ou ateacute mesmo por saber que issodiminuiraacute as chances de algum outro candidato ser eleito Mesmo assim eacute evidente queo TRS natildeo proporciona o mesmo apelo ao voto taacutetico que o FPTP

                                    Outra caracteriacutestica do TRS eacute o incentivo a formaccedilatildeo de coalizotildees entre candidatosde partidos mais populares com candidatos de partidos menos populares As coalizotildeesfornecem benefiacutecios agrave ambas as partes onde os candidatos classificados para o segundoturno em geral se juntam a candidatos jaacute eliminados com a intenccedilatildeo de agregar maisvotos enquanto os candidatos jaacute eliminados apoiam um dos dois classificados na esperanccedilade inserir propostas proacuteprias ou modificaccedilotildees agrave chapa deles

                                    23 INSTANT-RUNOFF VOTING

                                    Instant Runoff Voting foi uma alternativa aos meacutetodos FPTP e TRS desenvolvidanos anos 70 por um professor do Instituto de Tecnologia de Massachusetts(MIT) O IRVelimina as principais desvantagens desses outros dois sistemas a pluralidade do FPTP e anecessidade de mais de uma rodada de votaccedilatildeo do TRS Este meacutetodo tambeacutem opera emmais de uma rodada poreacutem como o proacuteprio nome sugere essas rodadas satildeo instantacircneasnatildeo sendo necessaacuterio o retorno dos eleitores agraves urnas Atualmente ele eacute utilizado naIrlanda nas eleiccedilotildees presidenciais em Londres na eleiccedilatildeo de seu prefeito e em distritosindividuais na Austraacutelia para eleger membros de sua cacircmara baixa do parlamento OIRV tambeacutem eacute usado por vaacuterias organizaccedilotildees privadas nos Estados Unidos incluindoa American Political Science Association e a American Psychological Association paraeleger seus funcionaacuterios

                                    Nesse sistema os eleitores natildeo satildeo solicitados a votar em um uacutenico candidato aoinveacutes disso eles listam todos os candidatos concorrentes na ordem de sua preferecircnciaA partir dessas listas as primeiras opccedilotildees de cada eleitor recebem o seu voto e apoacutes acontagem se um candidato obtiver 50 dos votos mais um este candidato eacute eleito Se

                                    22

                                    isso natildeo ocorrer o candidato menos votado eacute eliminado das eleiccedilotildees e seus votos satildeotransferidos para a segunda opccedilatildeo de cada um de seus eleitores Esse procedimento serepete eliminando o candidato menos votado a cada rodada ateacute que algum dos candidatospossuam a maioridade dos votos

                                    231 Exemplo

                                    Na tabela 3 pode-se verificar a distribuiccedilatildeo de votos por perfil de eleitor e na tabela4 vecirc-se o desenvolvimento do IRV para essas distribuiccedilotildees O candidato D eacute o menosvotado e por consequecircncia eacute o primeiro a ser eliminado A segunda opccedilatildeo de todos oseleitores que votaram no candidato D eacute o candidato C por isso este recebe todos os votosdistribuiacutedos na segunda rodada Com isso o candidato B eacute eliminado com 25 dos votos eos candidatos A e C concorrem na uacuteltima rodada Mesmo com o candidato C na lideranccedilana segunda rodada a maior parte dos eleitores do B tem como preferecircncia o candidatoA por isso A eacute eleito com 55 dos votos contra 45 do C

                                    Tabela 3 ndash Exemplo IRV

                                    Rankings Ndeg de eleitoresABCD 20ABDC 16BDAC 19BDCA 6CABD 7CDBA 15DCAB 5DCBA 12

                                    Tabela 4 ndash Desenvolvimento do IRVTurnos D C B A

                                    1 17 22 25 362 eliminado 39 25 363 eliminado 45 eliminado 55

                                    232 Vantagens e Desvantagens do IRV

                                    Assim como no TRS a pluralidade eacute irrelevante no IRV e um candidato soacute eacute eleitocom a maioridade dos votos dando maior legitimidade ao mandato deste No entantopode-se argumentar que o IRV faz isso com mais eficiecircncia pois natildeo requer a execuccedilatildeode mais de uma rodada de votaccedilotildees Isso diminui os custos das eleiccedilotildees como um todoao mesmo tempo que proporciona um nuacutemero menor de isenccedilotildees por parte dos eleitoresdevido ao desgaste de todo o processo eleitoral

                                    23

                                    Aleacutem disso candidatos de partidos menores tendem a receber mais votos do queno FPTP e portanto satildeo mais encorajados a se candidatar Com uma lista maior decandidatos eleitores desfrutam de uma variedade maior de opccedilotildees de voto Contudomesmo com mais candidatos menos populares o spoiler effect mencionado anteriormentetambeacutem natildeo possui espaccedilo nesse sistema de votaccedilatildeo Partidos menores natildeo tem comoroubar votos de partidos maiores visto que esses votos eventualmente seratildeo transferidosde volta a eles durante o desenvolvimento das rodadas do IRV

                                    Em virtude de sua estrutura acredita-se que esse meacutetodo tende a encorajar os can-didatos tambeacutem a elaborar suas campanhas de forma mais abrangente ampliando suainfluecircncia para mais do que apenas um grupo especiacutefico de maneira que ele consiga agre-gar votos de segunda ou terceira opccedilatildeo aleacutem dos votos de seus eleitores principais

                                    A principal desvantagem do IRV eacute o fato de ele ainda natildeo ser amplamente utilizado aoredor do mundo Essa falta de familiaridade do sistema pode causar confusatildeo ao eleitorcomum em suas primeiras ocorrecircncias No entanto nos paiacuteses em que este eacute utilizadonatildeo parece haver confusatildeo entre os eleitores Aleacutem disso na maioria dos casos haveraacute umcusto potencialmente alto da substituiccedilatildeo ou alteraccedilatildeo dos sistemas das urnas eletrocircnicaspara que seja possiacutevel haver a implementaccedilatildeo do meacutetodo

                                    Aleacutem disso assim como o TRS este sistema tambeacutem possui natildeo-monotonicidade ouseja um candidato pode ser prejudicado ao ser ranqueado mais alto enquanto que outropode se beneficiar sendo ranqueado mais baixo pelos eleitores (ORNSTEIN 2018) issopode ocorrer quando esse ranqueamento causa alteraccedilotildees na ordem em que os candidatossatildeo eliminados Essa caracteriacutestica se manifesta em fenocircmenos complexos e especiacuteficos epor isso um exemplo de sua ocorrecircncia seraacute abordada em detalhes na seccedilatildeo 43

                                    233 Voto Uacutetil no IRV

                                    Como os sistemas de votaccedilatildeo anteriores o IRV natildeo eacute completamente imune ao vototaacutetico No entanto este meacutetodo se mostra bem resistente a eles quando comparado aoutros meacutetodos como o FPTP e o Borda Count (Bartholdi John J III and Orlin JamesB 1990) Distintivamente o IRV requer um maior esforccedilo do eleitor para elaborar umaestrateacutegia que melhor ajuste os resultados da eleiccedilatildeo de acordo com a sua preferecircnciaAleacutem disso eacute necessaacuterio que ele tenha informaccedilatildeo suficiente sobre os rankings de outroseleitores naturalmente obtida atraveacutes de pesquisas eleitorais

                                    Existe tambeacutem a possibilidade de ocorrer uma exaustatildeo dos votos quando natildeo haacuteo completo preenchimento do ranking por parte dos eleitores Nessas ocasiotildees o votonatildeo pode continuar a ser transferido a outros candidatos e ele eacute descartado Isso afetaa legitimidade do mandato do candidato eleito pois o resultado final natildeo representaraacute100 da populaccedilatildeo votante Essas ocorrecircncias no entanto podem ser minimizadas comuma melhor educaccedilatildeo eleitoral ou como foi implementado na Austraacutelia requerer que osrankings incluam uma totalidade dos candidatos concorrentes

                                    24

                                    24 APPROVAL VOTING SYSTEM

                                    No meacutetodo Approval Voting os eleitores natildeo satildeo limitados pelo nuacutemero de candidatosem que podem votar por isso approval cada eleitor pode votar em todos os candidatos osquais ele aprova Apoacutes as votaccedilotildees o candidato com a maior quantidade de votos eacute eleitoSegundo Hamlin (2015) a cidade de Fargo na Dakota do Norte se tornou a primeiracidade nos EUA a colocar em praacutetica este sistema em suas eleiccedilotildees gerais em novembrode 2018 AVS tambeacutem eacute utilizado para eleger o secretaacuterio-geral das Naccedilotildees Unidas e emdiversas outras organizaccedilotildees

                                    241 Exemplo

                                    Na tabela 5 abaixo pode-se encontrar 8 perfis de eleitores com seus candidatos apro-vados e quantidade de eleitores que se encaixam no perfil Na tabela 6 temos o resultadoda contabilizaccedilatildeo dos votos destes perfis O candidato mais popular eacute o B que se encontraaprovado em 5 perfis distintos totalizando 60 votos ou aproximadamente 32

                                    Tabela 5 ndash Exemplo AVS

                                    Aprovaccedilotildees Ndeg de eleitoresA 20AB 16B 19

                                    BDC 6CAB 7CD 15DC 5DCB 12

                                    Tabela 6 ndash Resultado AVSCandidatos Total de votos

                                    A 43B 60C 45D 38

                                    242 Vantagens e Desvantagens do AVS

                                    Aleacutem de simples este meacutetodo permite um niacutevel maior de expressividade aos eleitoresOnde no FPTP e TRS eles satildeo limitados pelo seu uacutenico voto aqui os eleitores tecircm aliberdade de demonstrar exatamente quais candidatos consideram aptos ou aceitaacuteveis aocargo

                                    25

                                    Outro efeito dessa liberdade trazida pelo AVS eacute a dizimaccedilatildeo do spoiler effect Can-didatos de partidos menores natildeo tem como roubar votos de partidos maiores nessesistema ambos os candidatos contabilizariam o voto

                                    243 Voto Uacutetil no AVS

                                    O tipo de voto uacutetil no AVS eacute denominado bullet voting Segundo The Center forElection Science (2015) esta taacutetica envolve simplesmente ignorar a possibilidade de votarem mais de um candidato e votar apenas em sua primeira opccedilatildeo Um eleitor pode serlevado a adotar essa estrateacutegia quando percebe que sua preferecircncia pode ser prejudicadacom o voto em alguma segunda opccedilatildeo sua Em um cenaacuterio extremo onde 100 doseleitores adotam esta estrateacutegia as eleiccedilotildees satildeo convertidas a um simples First Past ThePost

                                    25 THE BORDA COUNT

                                    Este meacutetodo carrega o nome em homenagem a seu criador Jean-Charles de Bordaque o desenvolveu em 1770 (LIPPMAN 2012) A contagem de Borda utiliza a abordagemde ranqueamento dos candidatos poreacutem de maneira diferente ao IRV Este eacute um sistemaque atribui uma pontuaccedilatildeo aos candidatos com base nestes rankings O candidato na basedo ranking natildeo recebe pontos o candidato imediatamente acima deste recebe 1 pontoo proacuteximo recebe 2 pontos e assim por diante ateacute o topo do ranking As pontuaccedilotildees detodos os rankings satildeo contabilizadas e o candidato com maior pontuaccedilatildeo eacute eleito Deacordo com Lippman variaccedilotildees deste meacutetodo satildeo encontradas em uso na premiaccedilatildeo dediversos esportes como na seleccedilatildeo do MVP(Most Valuable Player) da MLB(principal ligade beisebol dos EUA) e no Trofeacuteu Heisman de futebol americano universitaacuterio

                                    251 Exemplo

                                    Neste exemplo seratildeo aproveitados os mesmos rankings apresentados na tabela 3 Porserem 4 candidatos o primeiro colocado de cada ranking receberaacute 3 pontos o segundo 2pontos o terceiro 1 e o quarto 0 Assim o nuacutemero maacuteximo de pontos que um candidatopode atingir eacute igual a 300(se ficar na primeira posiccedilatildeo em todos os rankings) e o nuacutemerototal de pontos no sistema eacute 600 O nuacutemero maacuteximo de pontos que um candidato podeatingir eacute calculado com

                                    (cminus 1)times e

                                    Sendo c igual ao nuacutemero de candidatos e e o nuacutemero de eleitores Por sua vez onuacutemero total de pontos no sistema eacute

                                    26

                                    (cminus 1)times c2

                                    times e

                                    A contagem final dos pontos eacute apresentada na tabela 7 abaixo

                                    Tabela 7 ndash Resultado BCCandidatos Total de pontos

                                    A 146B 181C 126D 147

                                    O candidato eleito eacute o B com 181 pontos ou aproximadamente 60 da pontuaccedilatildeomaacutexima

                                    252 Vantagens e Desvantagens do BC

                                    Em comparaccedilatildeo com os meacutetodos abordados anteriormente que apenas consideramas primeiras opccedilotildees de cada eleitor este meacutetodo regularmente escolhe candidatos comaceitaccedilatildeo mais ampla ao inveacutes de uma preferecircncia direta dos eleitores (Electoral ReformSociety 2017b)

                                    Ele tambeacutem encoraja uma abordagem estrateacutegica por parte dos partidos onde seriade seu interesse nomear mais de um candidato para concorrer pois quanto mais candi-datos estatildeo no paacutereo maior eacute a pontuaccedilatildeo dos primeiros colocados Logo a nomeaccedilatildeo decandidatos menos populares pode beneficiar os principais candidatos de um partido

                                    253 Voto Uacutetil no BC

                                    Existem duas estrateacutegias aplicaacuteveis a esse sistema A primeira denominada compromi-sing de maneira similar a outros meacutetodos de votaccedilatildeo se resume em ranquear em primeirolugar um dos candidatos que estejam liderando as eleiccedilotildees mesmo que este natildeo seja suapreferecircncia real A segunda estrateacutegia burying eacute o oposto esta se baseia em ranquearem uacuteltimo lugar um dos candidatos liacutederes mesmo que este natildeo seja o seu candidato demaior desgosto Ambas estrateacutegias podem ser aplicadas ao mesmo tempo por um eleitor

                                    26 SCORE VOTING SYSTEM

                                    Score Voting ou Range Voting como tambeacutem eacute conhecido eacute mais um meacutetodo quetenta trazer maior liberdade de expressatildeo aos eleitores Assim como o Borda Counteste sistema funciona baseado na pontuaccedilatildeo dos candidatos no entanto ao inveacutes dessapontuaccedilatildeo ser relativa agrave posiccedilatildeo do candidato no ranking de cada eleitor este por sua veztem completa liberdade de atribuir qualquer quantidade de pontos aos candidatos dentro

                                    27

                                    de determinada escala Um eleitor pode dar o mesmo nuacutemero de pontos para diferentescandidatos e apoacutes o somatoacuterio de todas as pontuaccedilotildees o candidato com a pontuaccedilatildeo maisalta eacute eleito Incorporado ao escopo poliacutetico o SVS eacute utilizado no Partido Pirata Alematildeobem como em diversas organizaccedilotildees tais como o Fedora Project e Mozilla e tambeacutem emvariados esportes oliacutempicos e reality shows como o American Idol aponta Hamlin (2015)

                                    261 Exemplo

                                    Neste exemplo temos apresentados na tabela 8 abaixo 4 perfis distintos de eleitorese suas respectivas atribuiccedilotildees de pontos aos 4 candidatos Cada eleitor pode atribuirqualquer pontuaccedilatildeo a um candidato dentro da escala de -10 a 10 O resultado da eleiccedilatildeoapoacutes a soma de todos os pontos por candidato se encontra na tabela 9 onde o candidatoA eacute eleito com um total de 605 pontos

                                    Tabela 8 ndash Exemplo SVS

                                    Perfil A B C D Ndeg de eleitores1 10 -1 5 2 362 6 9 -3 4 253 2 0 8 4 224 3 3 3 10 17

                                    Tabela 9 ndash Resultado SVSCandidatos Total de pontos

                                    A 605B 240C 332D 430

                                    262 Vantagens e Desvantagens do SVS

                                    A grande vantagem do SVS eacute como ele proporciona aos eleitores expressar de maneiramuito proacutexima potencialmente exata suas impressotildees poliacuteticas de cada candidato Eleeacute ainda mais expressivo que o AVS Dessa maneira o spoiler effect tambeacutem se torna nuloao passo que toda intenccedilatildeo de voto eacute precisamente representada neste sistema

                                    Assim como outros meacutetodos eleitorais este sofre igualmente dos males produzidos pelovoto taacutetico Sua principal desvantagem eacute discutida na seccedilatildeo abaixo

                                    263 Voto Uacutetil no SVS

                                    Da mesma maneira que no Approval Voting atraveacutes do bullet voting o SVS tambeacutempode ser convertido em uma eleiccedilatildeo sob o meacutetodo FPTP em um cenaacuterio com um grande

                                    28

                                    volume de eleitores maliciosos O voto uacutetil sob este sistema se manifesta pontuando-seapenas um candidato com uma nota positiva e todos os outros com as notas mais baixasda escala Se todos os eleitores se aproveitarem dessa abordagem natildeo existiraacute distinccedilatildeoefetiva entre uma eleiccedilatildeo sob SVS e FPTP Essencialmente cada eleitor estaacute votando emapenas um candidato Essa eacute a principal desvantagem do SVS e ela consegue eliminarsua principal vantagem dar ao eleitor um poder maior de expressatildeo

                                    27 BLOC VOTE

                                    O Bloc Vote eacute um meacutetodo utilizado para a eleiccedilatildeo de candidatos a cargos no governocom mais de uma vacacircncia Pode ser considerado um meio-termo entre o FPTP e oAVS pois os eleitores podem votar em mais de um candidato poreacutem satildeo limitados pelonuacutemero de vagas Em uma eleiccedilatildeo com duas vagas por exemplo cada eleitor selecionaraacutedois candidatos ou menos Sensatamente o candidato mais votado eacute eleito Ele possuialgumas utilizaccedilotildees em eleiccedilotildees locais em algumas partes da Inglaterra (Electoral ReformSociety 2017a)

                                    271 Exemplo

                                    Neste exemplo dois candidatos seratildeo eleitos logo cada eleitor votaraacute em no maacuteximodois candidatos A distribuiccedilatildeo de votos pode ser conferida na tabela 10 e o resultado dacontagem de votos na tabela 11 abaixo Os candidatos eleitos satildeo o C totalizando 78do maacuteximo de votos possiacuteveis para um candidato e o A com 43

                                    Tabela 10 ndash Exemplo BV

                                    Aprovaccedilotildees Ndeg de eleitoresAC 20AB 16BC 19BD 6CA 7CD 15DC 17

                                    Tabela 11 ndash Resultado BVCandidatos Total de votos

                                    A 43B 41C 78D 38

                                    29

                                    272 Voto Uacutetil no BV

                                    Neste sistema eacute possiacutevel que um eleitor evite votar em sua primeira opccedilatildeo quandoeste natildeo tem chances de vitoacuteria e se fazendo isto ele diminuiraacute as chances de algum outrocandidato de seu desgosto ganhar Poreacutem o sistema previne um outro tipo de voto uacutetilEm eleiccedilotildees com mais de uma vaga onde os eleitores soacute podem votar em um candidatose um eleitor sabe que sua primeira opccedilatildeo tambeacutem eacute a primeira opccedilatildeo da maior parteda populaccedilatildeo e portanto muito provavelmente seraacute um dos candidatos eleitos eacute possiacutevelque ele arrisque votar em uma segunda opccedilatildeo sua na esperanccedila de a longo prazo elegersuas duas principais opccedilotildees de voto Com os eleitores podendo votar no nuacutemero exato devagas disponiacuteveis esse tipo de pensamento taacutetico perde o sentido

                                    30

                                    3 O SIMULADOR

                                    Para este trabalho foi implementado um simulador eleitoral na forma de uma aplicaccedilatildeoweb para que a interaccedilatildeo do usuaacuterio fosse facilitada Veremos a seguir como se daacute suautilizaccedilatildeo de forma geral

                                    Figura 2 ndash Captura de tela 1

                                    Figura 3 ndash Captura de tela 2

                                    A primeira opccedilatildeo encontrada pelo usuaacuterio eacute a escolha de quais sistemas de votaccedilatildeo se-ratildeo simulados (Figura 2) Todos eles podem ser selecionados para rodar simultaneamentePoreacutem natildeo eacute permitido rodar uma simulaccedilatildeo do Bloc Vote para uma eleiccedilatildeo onde apenasum candidato eacute eleito aleacutem disso natildeo existe implementaccedilatildeo dos meacutetodos TRS e IRV para

                                    31

                                    eleiccedilotildees com mais de um candidato eleito jaacute que eles se comportariam exatamente comono FPTP

                                    A maioria das linguagens de programaccedilatildeo senatildeo todas possuem um gerador de nuacuteme-ros pseudoaleatoacuterios que fornece a possibilidade de definir uma seed para o gerador Estaseed funciona como um ponto de partida para a geraccedilatildeo dos nuacutemero e portanto todasimulaccedilatildeo que rodar com a mesma seed sempre teraacute os mesmos resultados Se nenhumvalor for fornecido pelo usuaacuterio o tempo atual do sistema eacute utilizado As opccedilotildees subse-quentes satildeo a escolha do nuacutemero de eleitores gerados e o nuacutemero de vagas (Figura 3) Senenhum valor for fornecido o nuacutemero de eleitores padratildeo utilizado eacute 1000 e o nuacutemero devagas igual a 1

                                    Figura 4 ndash Captura de tela 3

                                    Este simulador possui dois modos para a criaccedilatildeo dos rankings dos eleitores No modoManipulate (Figura 4) primeiramente se define o nuacutemero de candidatos atraveacutes do campode entrada ao lado do tiacutetulo Candidates ou alternativamente pode-se adicionar candida-tos um a um atraveacutes do sinal de mais na parte inferior da paacutegina Para cada candidatoeacute possiacutevel definir a porcentagem de seus eleitores que optaraacute pelo voto taacutetico e pelovoto de minoria Tambeacutem eacute possiacutevel alterar o nome dos candidatos se for do interessedo usuaacuterio

                                    32

                                    Figura 5 ndash Captura de tela 4

                                    Figura 6 ndash Captura de tela 5

                                    33

                                    Figura 7 ndash Captura de tela 6

                                    Apoacutes a criaccedilatildeo dos candidatos o usuaacuterio pode criar perfis de eleitores que definiratildeo demaneira exata como partes da populaccedilatildeo iraacute votar (Figura 5) Em cada perfil se defineo valor em porcentos da populaccedilatildeo votante que o adotaraacute e a nota de cada candidatoTambeacutem eacute possiacutevel nomear cada perfil livremente

                                    No modo Generate (Figura 6) eacute onde o gerador de nuacutemeros pseudoaleatoacuterios eacute usadoNesse modo ao inveacutes do usuaacuterio criar perfis de eleitores ele define qual seraacute a distribuiccedilatildeoadotada para a geraccedilatildeo de notas de cada candidato Essas distribuiccedilotildees seratildeo mais bemdetalhadas no Capiacutetulo 5 Da mesma maneira que no modo Manipulate nesse modotambeacutem eacute possiacutevel definir os valores para os dois tipos de voto uacutetil os votos taacuteticos eos votos de minoria No primeiro estatildeo incluiacutedas as estrateacutegias de mudanccedila de votoespeciacuteficas de cada sistema como o bullet voting no AVS e SVS ou quando a preferecircnciade um eleitor claramente natildeo possui chances de vitoacuteria e ele muda seu voto para um doscandidatos que esteja na lideranccedila o que ocorre no FPTP e TRS O voto de minoriase apresenta apenas no FPTP em eleiccedilotildees onde mais de um candidato eacute eleito Se apreferecircncia de um eleitor claramente lidera a eleiccedilatildeo por ser tambeacutem a preferecircncia damaior parte da populaccedilatildeo esse eleitor pode mudar o seu voto para uma segunda opccedilatildeona esperanccedila de eleger dois de seus candidatos favoritos

                                    Por fim em ambos os modos o usuaacuterio tem a opccedilatildeo de definir coalizotildees entre oscandidatos se o sistema TRS estiver habilitado pois as coalizotildees apenas se manifestamnesse sistema Essas coalizotildees alteraratildeo as notas dos candidatos dependendo dos outroscandidatos pertencentes a elas (Figura 7)

                                    A aplicaccedilatildeo pode ser encontrada na paacutegina httpelectionsimpythonanywherecom

                                    34

                                    4 CENAacuteRIOS PERTINENTES

                                    Para todos os cenaacuterios deste capiacutetulo seraacute usada a seed do simulador igual a 100 e apopulaccedilatildeo de eleitores igual a 1000 para que exista consistecircncia na anaacutelise e tambeacutem paraque possa haver replicaccedilatildeo dos resultados se necessaacuterio

                                    41 CENAacuteRIO 1 VOTO TAacuteTICO

                                    Neste exemplo teremos quatro candidatos Ana Beto Carla e Diego Ana e Betoseratildeo gerados a partir da distribuiccedilatildeo Neutral (Figura 47) Carla da distribuiccedilatildeo Disliked(Figura 51) e Diego da Hated (Figura 55) Para a simulaccedilatildeo com a seed 100 o melhorcandidato a ser eleito ou seja aquele que maximiza a meacutedia das notas dos eleitores eacute oBeto com uma meacutedia de 0073 Para cada sistema seratildeo comparados os resultados semvoto taacutetico aos com 20 de voto taacutetico a favor da Ana Abaixo se encontram osresultados para o sistema FPTP

                                    Figura 8 ndash FPTP - Cenaacuterio 1 sem voto taacutetico

                                    Figura 9 ndash TRS segundo turno - Cenaacuterio 1 sem voto taacutetico

                                    35

                                    Figura 10 ndash IRV primeiro turno - Cenaacuterio 1

                                    Figura 11 ndash IRV segundo turno - Cenaacuterio 1

                                    Figura 12 ndash IRV terceiro turno - Cenaacuterio 1

                                    36

                                    Figura 13 ndash AVS - Cenaacuterio 1 sem voto taacutetico

                                    Figura 14 ndash BC - Cenaacuterio 1 sem voto taacutetico

                                    Figura 15 ndash SVS - Cenaacuterio 1 sem voto taacutetico

                                    37

                                    Nesse cenaacuterio sem voto taacutetico o uacutenico sistema que natildeo elege o Beto eacute o AVS Todosos outros elegem o melhor candidato Ou seja apesar de Beto ter uma melhor meacutediadas notas dos eleitores existem mais eleitores que ranqueiam Ana com uma nota acimade 0 No entanto apenas 20 dos eleitores de Diego e Carla que preferem a Ana aoinveacutes do Beto satildeo o suficiente para fazer Beto natildeo ser eleito se eles decidirem abandonarsua primeira opccedilatildeo e votar na Ana Considerando a vantagem que os votos taacuteticosproporcionam agrave Ana esta eacute eleita em todos os sistemas menos o TRS e o IRV

                                    Figura 16 ndash FPTP - Cenaacuterio 1 - 20 de voto taacutetico na Ana

                                    Figura 17 ndash TRS segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                    38

                                    Figura 18 ndash IRV primeiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                    Figura 19 ndash IRV segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                    Figura 20 ndash IRV terceiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                    39

                                    Figura 21 ndash AVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                                    Figura 22 ndash BC - Cenaacuterio 1 20 de voto taacutetico na Ana

                                    Figura 23 ndash SVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                                    40

                                    Eacute claro que se os eleitores que preferem o Beto tambeacutem votassem de maneira estra-teacutegica a situaccedilatildeo se equilibraria e haveria o mesmo niacutevel de concorrecircncia entre os doiscandidatos que ocorre quando natildeo haacute voto taacutetico Poreacutem no Borda Count esse equiliacute-brio pode natildeo acontecer e as estrateacutegias de compromising e burying podem acabar saindopela culatra se uma porcentagem elevada dos eleitores as adotarem Abaixo encontram-seos resultados para esse sistema quando 100 dos eleitores de Carla e Diego se comportammaliciosamente

                                    Figura 24 ndash BC - Cenaacuterio 1 100 de voto taacutetico na Ana e Beto

                                    Por causa do uso demasiado da estrateacutegia burying Ana e Beto perdem muitos pontose isso abre espaccedilo para uma vitoacuteria da Carla No entanto para porcentagens menores que100 o Beto ainda eacute o vencedor

                                    Essas duas estrateacutegias tambeacutem foram implementadas nesse simulador para o sistemaIRV e eacute possiacutevel ver como ele eacute resistente a elas Para que seja possiacutevel mudar os resultadosde uma eleiccedilatildeo sob o IRV eacute necessaacuterio mudar a ordem de eliminaccedilatildeo dos candidatos paraque o seu candidato preferido acabe enfrentando um candidato mais fraco nas rodadasfinais Isso natildeo ocorre com compromising e burying No proacuteximo cenaacuterio seraacute analisadacomo eacute possiacutevel modificar os resultados de uma eleiccedilatildeo sob o IRV

                                    Esses resultados podem ser replicados acessando os linksSem votos taacuteticos lthttpelectionsimpythonanywherecomdirect_res1111110

                                    --[0021][22Ana2222Beto222022Carla2222Diego22]------100gt

                                    Com 20 de voto taacutetico lthttpelectionsimpythonanywherecomdirect_res1111110--[0021][22Ana222022Beto2222Carla2222Diego22]1-[02000]---100gt

                                    Com 100 de voto taacuteticona Ana e Beto lthttpelectionsimpythonanywherecomdirect_res0000100--[0021][22Ana222022Beto222022Carla2222Diego22]1-[101000]---100gt

                                    41

                                    42 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV

                                    Neste cenaacuterio teremos Ana Carla e Beto concorrendo e trecircs perfis distintos que apoiamcada candidato As distribuiccedilotildees de notas dos perfis se encontram na tabela abaixo

                                    Tabela 12 ndash Distribuiccedilatildeo de notas - Cenaacuterio 2

                                    Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                    deeleitores

                                    1 10 5 0 422 0 10 5 303 5 0 10 28

                                    Com essas distribuiccedilotildees Carla eacute eliminada na primeira rodada e seus 28 de votossatildeo transferidos para a segunda opccedilatildeo de seus eleitores Ana que eacute eleita com 70 dosvotos e uma meacutedia de 56

                                    Figura 25 ndash IRV primeiro turno - Cenaacuterio 2

                                    Figura 26 ndash IRV segundo turno - Cenaacuterio 2

                                    42

                                    Cientes desse provaacutevel futuro cenaacuterio onde Ana eacute eleita uma pequena parte dos elei-tores de Beto estrategicamente o abandona e decide apoiar Carla na esperanccedila de leva-laao segundo turno contra Ana As novas distribuiccedilotildees de notas se encontram na tabelaabaixo com essa porccedilatildeo de eleitores representada pelo perfil 4

                                    Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2

                                    Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                    deeleitores

                                    1 10 5 0 422 0 10 5 283 5 0 10 284 0 8 10 2

                                    Essa mudanccedila estrateacutegica de voto altera a ordem de eliminaccedilotildees do sistema com Betosendo o primeiro a ser eliminado Com isso seus votos satildeo naturalmente transferidos paraCarla que derrota Ana no segundo turno com 58 dos votos

                                    Figura 27 ndash IRV primeiro turno com voto taacutetico - Cenaacuterio 2

                                    Figura 28 ndash IRV segundo turno com voto taacutetico - Cenaacuterio 2

                                    43

                                    Percebendo que a eleiccedilatildeo de Beto natildeo era provaacutevel seus eleitores conseguiram aomenos impedir a eleiccedilatildeo do pior candidato para eles Mas para isso foi necessaacuterio queeles tivessem a informaccedilatildeo de como os outros eleitores votariam Uma aproximaccedilatildeo dessasinformaccedilotildees poderia ser obtida em um cenaacuterio real com poucos candidatos atraveacutes depesquisas eleitorais poreacutem se o nuacutemero de candidatos eacute significativo uma noccedilatildeo completadas distribuiccedilotildees dos rankings dos eleitores se torna muito menos viaacutevel e dificulta aformulaccedilatildeo de estrateacutegias para alterar a ordem em que os candidatos satildeo eliminados

                                    Esses resultados podem ser replicados acessando os linksSem voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana22

                                    22Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                    Com voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana

                                    2222Beto2222Carla22]-----42Voter20Profile2001020520028Voter20Profile2010201020528Voter20Profile202520020102Voter20Profile20302082010100gt

                                    43 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE

                                    O interessante dos sistemas IRV e TRS eacute que os resultados do cenaacuterio anterior po-deriam ter sido obtidos ao inveacutes do voto taacutetico pela sua natildeo-monotonicidade Seriapossiacutevel que a Carla derrotasse a Ana no segundo turno atraveacutes do proacuteprio aumento depopularidade da Ana Assumindo que essa popularizaccedilatildeo ocorresse entre os candidatosdo perfil 2 onde 3 passasse a apoiar a Ana ao inveacutes do Beto as novas distribuiccedilotildeesseguiriam a tabela abaixo

                                    Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                    Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                    deeleitores

                                    1 10 5 0 452 0 10 5 273 5 0 10 28

                                    Dessa maneira Beto agora com uma porcentagem dos eleitores menor do que a deCarla seraacute eliminado na primeira rodada e como seus eleitores tecircm a Carla como segundaopccedilatildeo ela receberaacute todos os seus votos e seraacute eleita na segunda rodada As rodadas doIRV podem ser vistas nas figuras 29 e 30

                                    44

                                    Figura 29 ndash IRV primeiro turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                    Figura 30 ndash IRV segundo turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                    Tabela 15 ndash Resultados do Cenaacuterio 3Candidato

                                    eleitoMeacutedia das

                                    notasAntes da

                                    popularizaccedilatildeode Ana

                                    Ana 56

                                    Apoacutespopularizaccedilatildeo

                                    de AnaCarla 415

                                    Os efeitos dessa caracteriacutestica se refletem na satisfaccedilatildeo meacutedia da populaccedilatildeo A Ana eacuteclaramente a melhor candidata e mesmo com o seu ganho de popularidade (ou devido aele) a Carla eacute eleita

                                    Esses resultados podem ser replicados acessando os linksAntes da popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecom

                                    direct_res0010000---[22Ana2222Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                    45

                                    Apoacutes popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana2222Beto2222Carla22]-----45Voter20Profile2001020520027Voter20Profile2010201020528Voter20Profile20252002010100gt

                                    44 CENAacuteRIO 4 COALIZOtildeES

                                    O TRS por ser organizado em dois turnos separados normalmente a semanas dedistacircncia um do outro acaba abrindo brecha agrave mudanccedila de opiniatildeo por parte dos eleitorese o desenvolvimento de novas estrateacutegias por parte dos candidatos tais como a coalizatildeocom candidatos jaacute eliminados Com isso em mente nesse cenaacuterio teremos novamenteos quatro candidatos Ana Beto Carla e Diego Os trecircs primeiros seratildeo gerados dadistribuiccedilatildeo Neutral e Diego da distribuiccedilatildeo Disliked

                                    Figura 31 ndash TRS turno 1 - Cenaacuterio 4

                                    No TRS normal Ana Beto e Carla possuem com essas distribuiccedilotildees quantidades devotos muito proacuteximas com Beto e Carla indo para o segundo turno Carla estaacute 10 votosatraacutes de Beto e decide aproveitar o espaccedilo de tempo entre os dois turnos para tentaragregar mais votos Com isso Carla se aproxima de Diego e juntos formam uma coalizatildeoNo entanto com sua baixa popularidade Diego acaba ferindo a reputaccedilatildeo de Carla etorna o segundo turno muito mais faacutecil para Beto (Figura 33) Se Carla tivesse buscado osuporte de Ana por outro lado ela se veria vitoriosa no segundo turno e com uma amplavantagem sobre o Beto (Figura 34) Ou ateacute mesmo sem buscar uma coalizatildeo mesmosendo uma corrida apertada Carla teria naturalmente sido eleita (Figura 32)

                                    Esses resultados podem ser replicados acessando os linksSem coalizotildees lthttpelectionsimpythonanywherecomdirect_res0100000

                                    --[0002][22Ana222022Beto2222Carla2222Diego22]------100gt

                                    46

                                    Figura 32 ndash TRS turno 2 - Cenaacuterio 4

                                    Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4

                                    Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4

                                    47

                                    Coalizatildeo Carla e Diego lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2203Carla20Diego-100gt

                                    Coalizatildeo Carla e Ana lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2200Carla20Ana-100gt

                                    45 CENAacuteRIO 5 DILEMA DO PRISIONEIRO

                                    Neste cenaacuterio temos uma eleiccedilatildeo de uma vaga com trecircs candidatos concorrentes e trecircsperfis distintos de eleitores que seguiratildeo as seguintes distribuiccedilotildees

                                    Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5

                                    Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                    deeleitores

                                    1 10 -10 5 362 -10 10 5 343 -10 -10 5 30

                                    Esse contexto nos remete ao notaacutevel dilema do prisioneiro Nele dois prisioneiroscuacutemplices satildeo interrogados individualmente sem poder se comunicar um com o outro ecada um enfrenta o dilema de delatar ou natildeo o seu parceiro Se os dois prisioneirosdecidem se manter calados sobre o crime ambos satildeo sentenciados a um ano de prisatildeo Seapenas um deles dedurar o outro o traidor sai livre enquanto seu parceiro eacute condenadoa trecircs anos Se ambos dedurarem um ao outro eles satildeo condenados juntos a dois anosde prisatildeo Esse dilema eacute uma ideia claacutessica presente no estudo da teoria dos jogos sendooriginalmente elaborada por Merrill Flood e Melvin Dresher em 1950 e mais tarde sendonomeada de dilema dos prisioneiros por Albert W Tucker (POUNDSTONE 1992)

                                    O que esse dilema nos mostra eacute a tentaccedilatildeo que o indiviacuteduo deteacutem se sua racionalizaccedilatildeoestiver voltada para seus proacuteprios interesses e somente eles em oposiccedilatildeo a pensar no bemdo grupo como um todo Neste cenaacuterio encontramos dois grupos de eleitores expressiva-mente opostos os perfis 1 e 2 Se qualquer uma das preferecircncias desses perfis fosse eleitaisso significaria uma alta rejeiccedilatildeo de maior parte da populaccedilatildeo No entanto eles possuema segunda opccedilatildeo em comum a Carla que por sua vez eacute a preferecircncia do terceiro perfilPortanto a eleiccedilatildeo da Carla seria logicamente o resultado oacutetimo

                                    Mesmo assim a Ana eacute eleita nos dois sistemas acima o que natildeo parece justo poispela tabela 16 eacute evidente que apenas 36 da populaccedilatildeo a aprova enquanto que os outros64 a reprovam ao maacuteximo O sistema IRV se comporta de maneira idecircntica ao TRS

                                    48

                                    Figura 35 ndash FPTP - Cenaacuterio 5

                                    Figura 36 ndash TRS segundo turno - Cenaacuterio 5

                                    nesta situaccedilatildeo Com esse resultado a meacutedia das notas eacute -28 No entanto os trecircs sistemasseguintes nos apresentam resultados diferentes

                                    Tabela 17 ndash Resultados do Cenaacuterio 5

                                    Sistema Candidatoeleito

                                    Meacutedia dasnotas

                                    FPTP Ana -28TRS Ana -28IRV Ana -28AVS Carla 50BC Carla 50SVS Carla 50

                                    49

                                    Figura 37 ndash AVS - Cenaacuterio 5

                                    Figura 38 ndash BC - Cenaacuterio 5

                                    Tanto o AVS quanto o Borda Count e o SVS satildeo sistemas que consideram todasas opiniotildees de cada eleitor ao mesmo tempo e por isso satildeo capazes de eleger o melhorcandidato nesta situaccedilatildeo diferentemente do TRS que natildeo absorve completamente todosentimento do eleitor por todos os candidatos e o IRV que apesar de ser bem expressivoquebra esse processo em inuacutemeras rodadas o que permite a perda de informaccedilatildeo ao longodelas

                                    Esses resultados podem ser replicados acessando o linklthttpelectionsimpythonanywherecomdirect_res1111110---[22Ana

                                    222022Beto222022Carla22]-----36Voter20Profile2001020-1020534Voter20Profile201-10201020530Voter20Profile202-1020-10205100gt

                                    50

                                    Figura 39 ndash SVS - Cenaacuterio 5

                                    46 CENAacuteRIO 6 VOTO DE MINORIA

                                    Neste cenaacuterio temos uma eleiccedilatildeo com quatro candidatos e duas vagas A Ana seraacutea preferecircncia de uma extensa parte da populaccedilatildeo (distribuiccedilatildeo Loved Figura 53) Betoe Carla seratildeo candidatos razoavelmente populares (distribuiccedilatildeo Neutral Figura 47) eDiego seraacute a preferecircncia de apenas um pequeno grupo especiacutefico e rejeitado pela maioria(distribuiccedilatildeo Disliked Figura 51) Eacute intuitivo esperar que os dois candidatos eleitos seratildeoa Ana e ou o Beto ou a Carla e isso eacute exatamente o que ocorre na figura 40 no sistemaFPTP sem voto de minoria

                                    Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria

                                    Eacute evidente a discrepacircncia da quantidade de votos da Ana para os outros candidatose apesar de Beto e Carla serem mais populares que Diego os trecircs natildeo se encontrammuito afastados Poreacutem se a pequena fraccedilatildeo de candidatos que possuem a Ana como

                                    51

                                    Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego

                                    preferecircncia e Diego como segunda opccedilatildeo optarem pelo voto de minoria a situaccedilatildeo mudacompletamente (Figura 41) Assim apesar de extensamente rejeitado Diego conquistaa segunda vaga e a meacutedia das notas despenca de 2929 para 0505 No entanto aindaexiste um cenaacuterio pior Se os outros grupos de eleitores pensarem da mesma forma eevitarem votar na Ana achando que sua eleiccedilatildeo jaacute estaacute assegurada apenas 80 de votode minoria para esses grupos jaacute eacute o suficiente para eliminaacute-la das eleiccedilotildees (Figura 42)Com a Ana eliminada a meacutedia das notas cai ainda mais para 0058

                                    Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego

                                    O sistema Bloc Vote eacute uma das soluccedilotildees para o voto de minoria Permitindo queos eleitores votem no mesmo nuacutemero de candidatos que de vagas a serem preenchidasnatildeo existe o iacutempeto a esse tipo de voto estrateacutegico O resultado desse sistema portantoretorna a meacutedia das notas a casa dos 29 (Figura 43) Os sistemas AVS Borda Count eSVS tambeacutem impedem a presenccedila do voto de minoria e atingem resultados semelhantes

                                    52

                                    Figura 43 ndash BV - Cenaacuterio 6

                                    Tabela 18 ndash Resultados do Cenaacuterio 6

                                    Sistema Candidatoseleitos

                                    Meacutedia dasnotas

                                    FPTP sem voto de minoriaAna eBeto 2929

                                    FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

                                    FPTP com 80 de voto de minoriaBeto eCarla 0058

                                    Bloc VoteAna eCarla 2913

                                    Esses resultados podem ser replicados acessando os links

                                    Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

                                    100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

                                    80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

                                    53

                                    5 COMO FUNCIONA O SIMULADOR

                                    O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

                                    51 CLASSE ELECTIONS

                                    Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

                                    bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

                                    Figura 44 ndash estrutura candidates

                                    bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

                                    bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

                                    Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

                                    Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

                                    54

                                    Figura 45 ndash estrutura voters

                                    Figura 46 ndash estrutura votes

                                    daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

                                    Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

                                    55

                                    Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

                                    Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

                                    na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

                                    56

                                    Figura 49 ndash PDF - Distribuiccedilatildeo Liked

                                    Figura 50 ndash CDF - Distribuiccedilatildeo Liked

                                    (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

                                    Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

                                    57

                                    Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

                                    Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

                                    candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

                                    Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

                                    58

                                    Figura 53 ndash PDF - Distribuiccedilatildeo Loved

                                    Figura 54 ndash CDF - Distribuiccedilatildeo Loved

                                    funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

                                    59

                                    Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                                    Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                                    Meacutedia das Notas sumei

                                    sumvj nij

                                    etimes v

                                    Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                                    Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                                    60

                                    Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                                    Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                                    52 CLASSE FIRSTPASTTHEPOST

                                    Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                                    Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                                    61

                                    Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                                    Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                                    mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                                    62

                                    53 CLASSE TWOROUNDSYSTEM

                                    A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                                    54 CLASSE INSTANTRUNOFFVOTING

                                    A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                                    Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                                    63

                                    cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                                    55 CLASSE APPROVALVOTING

                                    Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                                    56 CLASSE BORDACOUNT

                                    Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                                    57 CLASSE SCOREVOTING

                                    De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                                    64

                                    58 CLASSE BLOCVOTE

                                    O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                                    59 TECNOLOGIAS UTILIZADAS

                                    A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                                    Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                                    O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                                    Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                                    65

                                    6 CONCLUSAtildeO

                                    Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                                    Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                                    Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                                    Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                                    Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                                    66

                                    REFEREcircNCIAS

                                    AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                                    Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                                    Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                                    Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                                    HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                                    LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                                    ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                                    Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                                    POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                                    The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                                    67

                                    APEcircNDICES

                                    APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                    Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                    if(not len(selfvoter_profiles))

                                    for voter in range(selfN_VOTERS)

                                    candidates_rank = dict()

                                    for candidate in reversed(range(selfN_CANDIDATES))

                                    if(selfBIAS_VECTOR[candidate]==4)

                                    candidates_rank[candidate] = self_sortear(selfloved)

                                    elif(selfBIAS_VECTOR[candidate]==3)

                                    candidates_rank[candidate] = self_sortear(selfliked)

                                    elif(selfBIAS_VECTOR[candidate]==2)

                                    candidates_rank[candidate] = self_sortear(selfdisliked)

                                    elif(selfBIAS_VECTOR[candidate]==1)

                                    candidates_rank[candidate] = self_sortear(selfhated)

                                    elif(selfBIAS_VECTOR[candidate]==-1)

                                    candidates_rank[candidate] = self_sortear(selfpolarizer

                                    )

                                    elif(selfBIAS_VECTOR[candidate]==-2)

                                    candidates_rank[candidate] = self_sortear(self

                                    more_polarizer)

                                    else

                                    candidates_rank[candidate] = self_sortear(selfneutral)

                                    selfvotersappend(candidates_rank)

                                    else

                                    ranges = []

                                    ranks = []

                                    for prof in selfvoter_profiles

                                    rangesappend(int(prof[pop_percentage]))

                                    rank =

                                    for index score in enumerate(prof[scores])

                                    rank[index] = score

                                    ranksappend(rank)

                                    for index _range in enumerate(ranges)

                                    for _ in range(int(selfN_VOTERS(_range100)))

                                    selfvotersappend(ranks[index])

                                    68

                                    APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                    Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                    for i in range(selfN_CANDIDATES)

                                    selfcandidates[i] = 0

                                    selfvotes[i] = set()

                                    APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                    Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                    for candidate in range(selfN_CANDIDATES)

                                    rating_sum = 0

                                    for voter in selfvoters

                                    rating_sum += voter[candidate]

                                    selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                    APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                    Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                    if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                    return selfcalculate_mean(winners)

                                    else

                                    chose_best = True if winners[0] == selfbest_candidate else

                                    False

                                    return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                    69

                                    APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                    Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                    rating_sum = 0

                                    for voter in selfvoters

                                    for candidate in winners

                                    rating_sum += voter[candidate]

                                    return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                    APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                    Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                    for i in range(1 selfN_VACANCIES + 2)

                                    selfleading_candidatesappend(selfsorted_candidates[-i][self

                                    CANDIDATE_INDEX])

                                    APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                    Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                    for leader in selfelecrounds[-1]

                                    selfleading_candidatesappend(leader[0])

                                    70

                                    APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                    Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                    self_account_for_coalitions()

                                    for voter in selfvoters

                                    selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                    (1)))

                                    temp = []

                                    for voter in selfsorted_voters

                                    new_dict = defaultdict(list)

                                    for k in voter

                                    new_dict[k[1]]append(k[0])

                                    tempappend(new_dict)

                                    selfsorted_voters = []

                                    for voter_index current_voter in enumerate(temp)

                                    new_voter = []

                                    for rating candidate_indexes in current_voteritems()

                                    if len(current_voter[rating]) gt 1

                                    shuffle(current_voter[rating])

                                    for e in candidate_indexes

                                    new_voterappend((e rating))

                                    else

                                    new_voterappend((candidate_indexes[0] rating))

                                    selfsorted_votersappend(new_voter)

                                    selfcandidates[new_voter[-1][0]] += 1

                                    selfvotes[new_voter[-1][0]]add(voter_index)

                                    71

                                    APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                    Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                    for candidate in selfvotes_copy

                                    if candidate not in selfelecleading_candidates

                                    for voter_index in selfvotes_copy[candidate]

                                    for index _candidate in enumerate(reversed(selfelec

                                    sorted_voters[voter_index]))

                                    if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                    leading_candidates

                                    if randomrandom() lt selfelec

                                    tactical_vote_percentages[_candidate[selfelec

                                    CANDIDATE_INDEX]]

                                    selfrankings_changed[voter_index] = copy

                                    deepcopy(selfelecsorted_voters[voter_index])

                                    selfrankings_changed[voter_index][-(index + 1)]

                                    selfrankings_changed[voter_index][-1] = self

                                    rankings_changed[voter_index][-1] self

                                    rankings_changed[voter_index][-(index + 1)]

                                    selfcandidates[candidate] -= 1

                                    selfcandidates[_candidate[selfelec

                                    CANDIDATE_INDEX]] += 1

                                    selfvotes[candidate]remove(voter_index)

                                    selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                    ]]add(voter_index)

                                    break

                                    break

                                    72

                                    APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                    Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                    half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                    for candidate in selfelecleading_candidates

                                    if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                    continue

                                    for voter_index in selfvotes_copy[candidate]

                                    if voter_index in selfrankings_changed

                                    ranking = selfrankings_changed[voter_index]

                                    else

                                    ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                    ])

                                    for index _candidate in enumerate(reversed(ranking))

                                    if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                    leading_candidates or (_candidate[selfelec

                                    CANDIDATE_INDEX] in selfelecleading_candidates and

                                    selfelecleading_candidatesindex(_candidate[selfelec

                                    CANDIDATE_INDEX]) gt= half_vacancies)

                                    if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                    if randomrandom() lt selfelec

                                    minority_vote_percentages[_candidate[selfelec

                                    CANDIDATE_INDEX]]

                                    selfcandidates[candidate] -= 1

                                    selfcandidates[_candidate[selfelec

                                    CANDIDATE_INDEX]] += 1

                                    break

                                    break

                                    break

                                    73

                                    APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                    Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                    self_account_for_coalitions()

                                    for candidate in selfvotes

                                    if candidate = selfwinner and candidate = selfsecond_place

                                    for voter_index in selfvotes[candidate]

                                    if voter_index in selfrankings_changed

                                    ranking = selfrankings_changed[voter_index]

                                    else

                                    ranking = copydeepcopy(selfelecsorted_voters[

                                    voter_index])

                                    for index2 candidate in enumerate(reversed(ranking))

                                    if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                    selfcandidates[selfwinner] += 1

                                    selfvotes[selfwinner]add(voter_index)

                                    break

                                    elif candidate[selfelecCANDIDATE_INDEX] == self

                                    second_place

                                    selfcandidates[selfsecond_place] += 1

                                    selfvotes[selfsecond_place]add(voter_index)

                                    break

                                    selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                    winners = []

                                    vacancies = selfelecN_VACANCIES

                                    for candidate in reversed(selfsorted_candidates)

                                    if vacancies == 0

                                    break

                                    winnersappend(candidate[0])

                                    vacancies -= 1

                                    mean chose_best = selfelecget_mean(winners = winners)

                                    74

                                    APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                    Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                    for voter_index voter in enumerate(selfelecsorted_voters)

                                    voter_dict = dict()

                                    og_voter_dict = dict()

                                    for tup in voter

                                    voter_dict[tup[0]] = tup[1]

                                    og_voter_dict[tup[0]] = tup[1]

                                    for coalition in selfeleccoalitions

                                    for candidate in coalition

                                    add_to_score = 0

                                    for candidate2 in coalition

                                    if candidate == candidate2

                                    continue

                                    half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                    if half lt 0

                                    add_to_score += mathceil(half)

                                    else

                                    add_to_score += mathfloor(half)

                                    if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                    voter_dict[candidate[rsquovaluersquo]] = 10

                                    elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                    voter_dict[candidate[rsquovaluersquo]] = -10

                                    else

                                    voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                    selfrankings_changed[voter_index] = []

                                    for candidate in voter_dict

                                    selfrankings_changed[voter_index]append((candidate voter_dict[

                                    candidate]))

                                    selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                    voter_index] key=lambda x x[1])

                                    75

                                    APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                    Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                    selfelecroundsappend(selfsorted_candidates[_round])

                                    if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                    N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                    N_VACANCIES - 1)

                                    return 2

                                    elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                    N_VOTERS gt 05)

                                    return 1

                                    else

                                    selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                    CANDIDATE_INDEX])

                                    for voter_index in selfvotes[selfsorted_candidates[_round][self

                                    elecCANDIDATE_INDEX]]

                                    if voter_index in selfrankings_changed

                                    for candidate in reversed(selfrankings_changed[voter_index

                                    ])

                                    if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                    excluded

                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                    ]] += 1

                                    selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                    add(voter_index)

                                    break

                                    else

                                    continue

                                    else

                                    for candidate in reversed(selfelecsorted_voters[

                                    voter_index])

                                    if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                    excluded

                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                    ]] += 1

                                    selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                    add(voter_index)

                                    break

                                    else

                                    continue

                                    selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                    return 0

                                    76

                                    APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                    Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                    for index in range(selfelecN_CANDIDATES)

                                    selfcandidates[index] = 0

                                    for voter in selfelecsorted_voters

                                    for candidate in reversed(voter)

                                    if candidate[selfelecCANDIDATE_SCORE] gt 0

                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                    else

                                    break

                                    APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                    Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                    for index in range(selfelecN_CANDIDATES)

                                    selfcandidates[index] = 0

                                    for voter in selfelecsorted_voters

                                    if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                    elecCANDIDATE_INDEX]]

                                    selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                    else

                                    for candidate in reversed(voter)

                                    if candidate[selfelecCANDIDATE_SCORE] gt 0

                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                    else

                                    break

                                    77

                                    APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                    Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                    pos = set()

                                    for index perc in enumerate(selfelectactical_vote_percentages)

                                    if perc gt 0

                                    posadd(index)

                                    for candidate in selfeleccandidates

                                    if candidate not in selfleading_candidates

                                    for voter_index in selfvotes[candidate]

                                    raised = None

                                    for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                    ])

                                    if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                    leading_candidates

                                    if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                    if randomrandom() lt selfelectactical_vote_percentages[

                                    candidate_tuple[selfelecCANDIDATE_INDEX]]

                                    ranking = [None]selfelecN_CANDIDATES

                                    ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                    selfelecvoters[voter_index][candidate_tuple[selfelec

                                    CANDIDATE_INDEX]])

                                    raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                    break

                                    break

                                    break

                                    if raised = None

                                    for _candidate in selfleading_candidates

                                    if _candidate = ranking[-1][0]

                                    ranking[0] = (_candidate selfelecvoters[voter_index][

                                    _candidate])

                                    buried = _candidate

                                    break

                                    i = 1

                                    for candidate_tuple in selfelecsorted_voters[voter_index]

                                    if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                    buried]

                                    continue

                                    else

                                    ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                    selfelecvoters[voter_index][candidate_tuple[selfelec

                                    CANDIDATE_INDEX]])

                                    i += 1

                                    selfrankings_changed[voter_index] = ranking

                                    78

                                    APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                    Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                    for voter_index in selfvotes[candidate]

                                    if randomrandom() lt selfelectactical_vote_percentages[candidate

                                    ]

                                    for _candidate in selfleading_candidates

                                    if _candidate = candidate

                                    ranking = [None]selfelecN_CANDIDATES

                                    ranking[0] = (_candidate selfelecvoters[voter_index][

                                    _candidate])

                                    buried = _candidate

                                    break

                                    i = 1

                                    for candidate_tuple in selfelecsorted_voters[voter_index]

                                    if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                    continue

                                    else

                                    ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                    selfelecvoters[voter_index][candidate_tuple[selfelec

                                    CANDIDATE_INDEX]])

                                    i += 1

                                    selfrankings_changed[voter_index] = ranking

                                    79

                                    APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                    Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                    for index in range(selfelecN_CANDIDATES)

                                    selfcandidates[index] = 0

                                    for voter_index voter in enumerate(selfelecsorted_voters)

                                    score = 0

                                    if voter_index in selfrankings_changed

                                    for candidate in selfrankings_changed[voter_index]

                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                    score += 1

                                    else

                                    for candidate in voter

                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                    score += 1

                                    APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                    Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                    for voter_index voter in enumerate(selfelecsorted_voters)

                                    if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                    elecCANDIDATE_INDEX]]

                                    selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                    sorted_voters[voter_index])

                                    for candidate_index candidate in enumerate(reversed(voter))

                                    if candidate_index == 0

                                    selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                    voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                    else

                                    selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                    voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                    80

                                    APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                    Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                    for index in range(selfelecN_CANDIDATES)

                                    selfcandidates[index] = 0

                                    for voter_index voter in enumerate(selfelecsorted_voters)

                                    if voter_index in selfrankings_changed

                                    for candidate in selfrankings_changed[voter_index]

                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                    selfelecCANDIDATE_RANK]

                                    else

                                    for candidate in voter

                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                    selfelecCANDIDATE_RANK]

                                    APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                    Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                    for index in range(selfelecN_CANDIDATES)

                                    selfcandidates[index] = 0

                                    for voter in selfelecsorted_voters

                                    votes = selfelecN_VACANCIES

                                    for candidate in reversed(voter)

                                    if votes == 0

                                    break

                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                    votes -= 1

                                    • Folha de aprovaccedilatildeo
                                    • Agradecimentos
                                    • Epiacutegrafe
                                    • Resumo
                                    • Abstract
                                    • Lista de ilustraccedilotildees
                                    • Lista de Coacutedigos
                                    • Lista de tabelas
                                    • Lista de abreviaturas e siglas
                                    • Sumaacuterio
                                    • INTRODUCcedilAtildeO
                                      • MOTIVACcedilAtildeO E OBJETIVO
                                      • MEacuteTODO
                                      • ESTRUTURA
                                        • SISTEMAS ELEITORAIS
                                          • FISRT PAST THE POST
                                            • Exemplo
                                            • Vantagens e Desvantagens do FPTP
                                            • Voto Uacutetil no FPTP
                                              • TWO-ROUND SYSTEM
                                                • Exemplo
                                                • Vantagens e Desvantagens do TRS
                                                • Voto Uacutetil no TRS
                                                  • INSTANT-RUNOFF VOTING
                                                    • Exemplo
                                                    • Vantagens e Desvantagens do IRV
                                                    • Voto Uacutetil no IRV
                                                      • APPROVAL VOTING SYSTEM
                                                        • Exemplo
                                                        • Vantagens e Desvantagens do AVS
                                                        • Voto Uacutetil no AVS
                                                          • THE BORDA COUNT
                                                            • Exemplo
                                                            • Vantagens e Desvantagens do BC
                                                            • Voto Uacutetil no BC
                                                              • SCORE VOTING SYSTEM
                                                                • Exemplo
                                                                • Vantagens e Desvantagens do SVS
                                                                • Voto Uacutetil no SVS
                                                                  • BLOC VOTE
                                                                    • Exemplo
                                                                    • Voto Uacutetil no BV
                                                                        • O SIMULADOR
                                                                        • CENAacuteRIOS PERTINENTES
                                                                          • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                          • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                          • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                          • CENAacuteRIO 4 COALIZOtildeES
                                                                          • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                          • CENAacuteRIO 6 VOTO DE MINORIA
                                                                            • COMO FUNCIONA O SIMULADOR
                                                                              • CLASSE Elections
                                                                              • CLASSE FirstPastThePost
                                                                              • CLASSE TwoRoundSystem
                                                                              • CLASSE InstantRunoffVoting
                                                                              • CLASSE ApprovalVoting
                                                                              • CLASSE BordaCount
                                                                              • CLASSE ScoreVoting
                                                                              • CLASSE BlocVote
                                                                              • TECNOLOGIAS UTILIZADAS
                                                                                • CONCLUSAtildeO
                                                                                • Referecircncias
                                                                                • Meacutetodo create_voters
                                                                                • Meacutetodo create_candidates
                                                                                • Meacutetodo calculate_means
                                                                                • Meacutetodo get_mean
                                                                                • Meacutetodo calculate_mean
                                                                                • Meacutetodo set_leading_candidates
                                                                                • Meacutetodo irv_set_leading_candidates
                                                                                • Meacutetodo sort_ranks
                                                                                • Meacutetodo fptp_count_tactical_votes
                                                                                • Meacutetodo fptp_count_minority_votes
                                                                                • Meacutetodo trs_second_round
                                                                                • Meacutetodo trs_account_for_coalitions
                                                                                • Meacutetodo irv_count_votes
                                                                                • Meacutetodo avs_count_votes
                                                                                • Meacutetodo avs_count_votes_with_tactical
                                                                                • Meacutetodo irv_apply_tactical_votes
                                                                                • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                • Meacutetodo bc_sum_candidates_scores
                                                                                • Meacutetodo svs_apply_tactical_votes
                                                                                • Meacutetodo svs_sum_candidates_scores
                                                                                • Meacutetodo bv_count_votes

                                      19

                                      213 Voto Uacutetil no FPTP

                                      No FPTP tambeacutem existe a possibilidade de os eleitores evitarem votar em sua prefe-recircncia verdadeira No caso de sua preferecircncia natildeo aparentar ter boas chances de vitoacuteriamuitas vezes opta-se por uma segunda opccedilatildeo que esteja mais bem colocada nas eleiccedilotildeesO motivo disso eacute que nessas situaccedilotildees votar em sua preferecircncia pode parecer um des-perdiacutecio do seu voto e no pior dos cenaacuterios optar por natildeo transferir seu voto para umasegunda opccedilatildeo pode acabar resultando na eleiccedilatildeo de um candidato de seu desgosto As-sim votar de maneira verdadeira muitas vezes pode acabar prejudicando o eleitor que sevecirc forccedilado a abandonar seus interesses poliacuteticos mais imediatos e escolher o menor entredois(ou mais) males Os candidatos de partidos menores satildeo os que mais sofrem com essetipo de voto estrateacutegico por natildeo conseguirem agregar as maiores quantidades de votos

                                      Entretanto ao mesmo tempo que partidos maiores roubam votos de partidos meno-res com os votos taacuteticos partidos menores tambeacutem tem a oportunidade de ganhar algunsvotos com o denominado spoiler effect Ao entrarem na eleiccedilatildeo candidatos de partidosmenores podem adquirir votos de candidatos mais populares que possuem inclinaccedilatildeo po-liacutetica semelhante Logo eacute possiacutevel que haja certo equiliacutebrio ao se contrapor as mudanccedilasde voto devido aos votos uacuteteis agraves mudanccedilas oriundas do spoiler effect

                                      Poreacutem o spoiler effect natildeo necessariamente ocorre apenas entre partidos maiores emenores mas pode prejudicar candidatos de popularidades proacuteximas Por exemplo entretrecircs candidatos A B e C onde A representa determinada posiccedilatildeo no espectro poliacuteticoenquanto B e C possuem posiccedilotildees parecidas o que pode acontecer eacute B e C se prejudicaremmutuamente jaacute que ambos dividem os eleitores de um mesmo espectro poliacutetico Se esseespectro tem a maioria com 60 por exemplo com B e C compartilhando cada um 30dos votos o candidato A sairia vencedor com 40 mesmo que todos os eleitores de Bprefiram C e todos os eleitores de C prefiram B Esse exemplo demonstra claramente oproblema com os sistemas de pluralidade

                                      22 TWO-ROUND SYSTEM

                                      Uma das primeiras tentativas de lidar com a desvantagem dos sistemas por pluralidadeo Two-round System eacute usado desde o seacuteculo XIX no ocidente e atualmente ainda eacute utilizadoem corridas presidecircncias de paiacuteses como o Brasil Bulgaacuteria Chile Colocircmbia FinlacircndiaPolocircnia Portugal Ruacutessia e em inuacutemeras eleiccedilotildees locais nos Estados Unidos

                                      O principal objetivo do TRS eacute garantir que o vencedor tenha conseguido uma maioriados votos Para isso as eleiccedilotildees satildeo estruturadas em duas rodadas de votaccedilatildeo Na primeirarodada os eleitores se dirigem agraves urnas e votam no candidato de sua preferecircncia Apoacutesa contagem se a quantidade de votos do candidato mais votado superar a proporccedilatildeo de50 natildeo haacute a necessidade de uma segunda rodada e este candidato eacute eleito No entantose este natildeo for o caso haveraacute uma segunda rodada com apenas os dois candidatos mais

                                      20

                                      votados Nesta rodada os eleitores retornam as urnas para escolher uma das duas opccedilotildeessendo eleito o candidato mais votado agora definitivamente com uma maioria dos votos

                                      221 Exemplo

                                      Utilizando a mesma distribuiccedilatildeo de votos descrita na tabela 1 Neste caso como ocandidato A natildeo possui uma maioria dos votos ele e o candidato B iratildeo concorrer em umsegundo turno Digamos que as distribuiccedilotildees dos votos dos eleitores dos candidatos C eD em relaccedilatildeo aos candidatos A e B satildeo as seguintes

                                      Tabela 2 ndash 2deg turno do TRS

                                      Candidatos Votos dos eleitoresde C

                                      Votos dos eleitoresde D

                                      Votos do 1degturno

                                      A 7 5 36B 15 12 25

                                      O candidato B agora eacute eleito com uma maioria dos votos 52 contra 48 do candidatoA

                                      222 Vantagens e Desvantagens do TRS

                                      Por ser parecido com o FPTP esse sistema tambeacutem eacute de faacutecil compreensatildeo do eleitorcomum poreacutem a maior vantagem do TRS eacute a garantia de que o candidato vencedor teraacute oapoio da maioria dos eleitores no segundo turno eliminando a pluralidade Argumenta-seque isso daacute maior legitimidade poliacutetica ao mandato do candidato eleito

                                      O TRS tende a abrigar uma lista maior de candidatos sendo mais convidativo acandidatos de partidos menores mesmo que suas chances natildeo sejam maiores quandocomparadas agraves eleiccedilotildees sob o FPTP Mesmo assim essa listagem mais abrangente eacute umavantagem do sistema pois daacute aos eleitores uma variedade maior de opccedilotildees de voto

                                      Em relaccedilatildeo agraves suas desvantagens o TRS possui duas principais A primeira satildeo oscustos elevados do sistema decorrentes da necessidade da organizaccedilatildeo de um segundoturno de votaccedilotildees A segunda eacute o aumento no iacutendice de ausecircncias dos eleitores agraves urnasEssa ampliaccedilatildeo no natildeo comparecimento dos eleitores se daacute tambeacutem devido ao segundoturno por pura fatiga eleitoral bem como consequecircncia da desistecircncia de eleitores queapoiam candidatos que jaacute foram eliminados

                                      Outro ponto negativo do TRS eacute a sua natildeo-monotonicidade Isso significa que umcandidato pode ser prejudicado com um aumento em sua popularidade e suporte e domesmo modo um candidato pode se beneficiar com a perda de popularidade e suporteSe os candidatos A e B satildeo os esperados para ir ao segundo turno onde A eacute mais fortedo que B um aumento no suporte pelo candidato A pode resultar na sua derrota quandoesse aumento causa uma alteraccedilatildeo nos candidatos que satildeo selecionados para ir ao segundoturno Se esse aumento na popularidade de A resultar na eliminaccedilatildeo preacutevia de B um

                                      21

                                      terceiro candidato C pode ser vitorioso sobre A no segundo turno caso os eleitores de Bprefiram C ao candidato A Se natildeo houvesse esse crescimento de popularidade A teriaderrotado B no segundo turno Essa situaccedilatildeo seraacute vista em melhores detalhes na seccedilatildeo 43

                                      223 Voto Uacutetil no TRS

                                      Esse sistema minimiza os efeitos do voto uacutetil em relaccedilatildeo ao FPTP pois um eleitorqualquer pode tranquilamente votar em sua preferecircncia sem se preocupar em desperdiccedilaacute-lo mesmo que seu candidato natildeo tenha chances de vitoacuteria Se este natildeo for eleito aindapoderaacute escolher a sua preferecircncia dentre os dois candidatos que prosseguirem para osegundo turno

                                      Apesar disso ainda existe um cenaacuterio em que o eleitor pode ser tentado a natildeo votar emsua preferecircncia Eacute possiacutevel que ele opte pela sua segunda opccedilatildeo se souber que sua primeiraopccedilatildeo possui miacutenimas chances de ir ao segundo turno ou ateacute mesmo por saber que issodiminuiraacute as chances de algum outro candidato ser eleito Mesmo assim eacute evidente queo TRS natildeo proporciona o mesmo apelo ao voto taacutetico que o FPTP

                                      Outra caracteriacutestica do TRS eacute o incentivo a formaccedilatildeo de coalizotildees entre candidatosde partidos mais populares com candidatos de partidos menos populares As coalizotildeesfornecem benefiacutecios agrave ambas as partes onde os candidatos classificados para o segundoturno em geral se juntam a candidatos jaacute eliminados com a intenccedilatildeo de agregar maisvotos enquanto os candidatos jaacute eliminados apoiam um dos dois classificados na esperanccedilade inserir propostas proacuteprias ou modificaccedilotildees agrave chapa deles

                                      23 INSTANT-RUNOFF VOTING

                                      Instant Runoff Voting foi uma alternativa aos meacutetodos FPTP e TRS desenvolvidanos anos 70 por um professor do Instituto de Tecnologia de Massachusetts(MIT) O IRVelimina as principais desvantagens desses outros dois sistemas a pluralidade do FPTP e anecessidade de mais de uma rodada de votaccedilatildeo do TRS Este meacutetodo tambeacutem opera emmais de uma rodada poreacutem como o proacuteprio nome sugere essas rodadas satildeo instantacircneasnatildeo sendo necessaacuterio o retorno dos eleitores agraves urnas Atualmente ele eacute utilizado naIrlanda nas eleiccedilotildees presidenciais em Londres na eleiccedilatildeo de seu prefeito e em distritosindividuais na Austraacutelia para eleger membros de sua cacircmara baixa do parlamento OIRV tambeacutem eacute usado por vaacuterias organizaccedilotildees privadas nos Estados Unidos incluindoa American Political Science Association e a American Psychological Association paraeleger seus funcionaacuterios

                                      Nesse sistema os eleitores natildeo satildeo solicitados a votar em um uacutenico candidato aoinveacutes disso eles listam todos os candidatos concorrentes na ordem de sua preferecircnciaA partir dessas listas as primeiras opccedilotildees de cada eleitor recebem o seu voto e apoacutes acontagem se um candidato obtiver 50 dos votos mais um este candidato eacute eleito Se

                                      22

                                      isso natildeo ocorrer o candidato menos votado eacute eliminado das eleiccedilotildees e seus votos satildeotransferidos para a segunda opccedilatildeo de cada um de seus eleitores Esse procedimento serepete eliminando o candidato menos votado a cada rodada ateacute que algum dos candidatospossuam a maioridade dos votos

                                      231 Exemplo

                                      Na tabela 3 pode-se verificar a distribuiccedilatildeo de votos por perfil de eleitor e na tabela4 vecirc-se o desenvolvimento do IRV para essas distribuiccedilotildees O candidato D eacute o menosvotado e por consequecircncia eacute o primeiro a ser eliminado A segunda opccedilatildeo de todos oseleitores que votaram no candidato D eacute o candidato C por isso este recebe todos os votosdistribuiacutedos na segunda rodada Com isso o candidato B eacute eliminado com 25 dos votos eos candidatos A e C concorrem na uacuteltima rodada Mesmo com o candidato C na lideranccedilana segunda rodada a maior parte dos eleitores do B tem como preferecircncia o candidatoA por isso A eacute eleito com 55 dos votos contra 45 do C

                                      Tabela 3 ndash Exemplo IRV

                                      Rankings Ndeg de eleitoresABCD 20ABDC 16BDAC 19BDCA 6CABD 7CDBA 15DCAB 5DCBA 12

                                      Tabela 4 ndash Desenvolvimento do IRVTurnos D C B A

                                      1 17 22 25 362 eliminado 39 25 363 eliminado 45 eliminado 55

                                      232 Vantagens e Desvantagens do IRV

                                      Assim como no TRS a pluralidade eacute irrelevante no IRV e um candidato soacute eacute eleitocom a maioridade dos votos dando maior legitimidade ao mandato deste No entantopode-se argumentar que o IRV faz isso com mais eficiecircncia pois natildeo requer a execuccedilatildeode mais de uma rodada de votaccedilotildees Isso diminui os custos das eleiccedilotildees como um todoao mesmo tempo que proporciona um nuacutemero menor de isenccedilotildees por parte dos eleitoresdevido ao desgaste de todo o processo eleitoral

                                      23

                                      Aleacutem disso candidatos de partidos menores tendem a receber mais votos do queno FPTP e portanto satildeo mais encorajados a se candidatar Com uma lista maior decandidatos eleitores desfrutam de uma variedade maior de opccedilotildees de voto Contudomesmo com mais candidatos menos populares o spoiler effect mencionado anteriormentetambeacutem natildeo possui espaccedilo nesse sistema de votaccedilatildeo Partidos menores natildeo tem comoroubar votos de partidos maiores visto que esses votos eventualmente seratildeo transferidosde volta a eles durante o desenvolvimento das rodadas do IRV

                                      Em virtude de sua estrutura acredita-se que esse meacutetodo tende a encorajar os can-didatos tambeacutem a elaborar suas campanhas de forma mais abrangente ampliando suainfluecircncia para mais do que apenas um grupo especiacutefico de maneira que ele consiga agre-gar votos de segunda ou terceira opccedilatildeo aleacutem dos votos de seus eleitores principais

                                      A principal desvantagem do IRV eacute o fato de ele ainda natildeo ser amplamente utilizado aoredor do mundo Essa falta de familiaridade do sistema pode causar confusatildeo ao eleitorcomum em suas primeiras ocorrecircncias No entanto nos paiacuteses em que este eacute utilizadonatildeo parece haver confusatildeo entre os eleitores Aleacutem disso na maioria dos casos haveraacute umcusto potencialmente alto da substituiccedilatildeo ou alteraccedilatildeo dos sistemas das urnas eletrocircnicaspara que seja possiacutevel haver a implementaccedilatildeo do meacutetodo

                                      Aleacutem disso assim como o TRS este sistema tambeacutem possui natildeo-monotonicidade ouseja um candidato pode ser prejudicado ao ser ranqueado mais alto enquanto que outropode se beneficiar sendo ranqueado mais baixo pelos eleitores (ORNSTEIN 2018) issopode ocorrer quando esse ranqueamento causa alteraccedilotildees na ordem em que os candidatossatildeo eliminados Essa caracteriacutestica se manifesta em fenocircmenos complexos e especiacuteficos epor isso um exemplo de sua ocorrecircncia seraacute abordada em detalhes na seccedilatildeo 43

                                      233 Voto Uacutetil no IRV

                                      Como os sistemas de votaccedilatildeo anteriores o IRV natildeo eacute completamente imune ao vototaacutetico No entanto este meacutetodo se mostra bem resistente a eles quando comparado aoutros meacutetodos como o FPTP e o Borda Count (Bartholdi John J III and Orlin JamesB 1990) Distintivamente o IRV requer um maior esforccedilo do eleitor para elaborar umaestrateacutegia que melhor ajuste os resultados da eleiccedilatildeo de acordo com a sua preferecircnciaAleacutem disso eacute necessaacuterio que ele tenha informaccedilatildeo suficiente sobre os rankings de outroseleitores naturalmente obtida atraveacutes de pesquisas eleitorais

                                      Existe tambeacutem a possibilidade de ocorrer uma exaustatildeo dos votos quando natildeo haacuteo completo preenchimento do ranking por parte dos eleitores Nessas ocasiotildees o votonatildeo pode continuar a ser transferido a outros candidatos e ele eacute descartado Isso afetaa legitimidade do mandato do candidato eleito pois o resultado final natildeo representaraacute100 da populaccedilatildeo votante Essas ocorrecircncias no entanto podem ser minimizadas comuma melhor educaccedilatildeo eleitoral ou como foi implementado na Austraacutelia requerer que osrankings incluam uma totalidade dos candidatos concorrentes

                                      24

                                      24 APPROVAL VOTING SYSTEM

                                      No meacutetodo Approval Voting os eleitores natildeo satildeo limitados pelo nuacutemero de candidatosem que podem votar por isso approval cada eleitor pode votar em todos os candidatos osquais ele aprova Apoacutes as votaccedilotildees o candidato com a maior quantidade de votos eacute eleitoSegundo Hamlin (2015) a cidade de Fargo na Dakota do Norte se tornou a primeiracidade nos EUA a colocar em praacutetica este sistema em suas eleiccedilotildees gerais em novembrode 2018 AVS tambeacutem eacute utilizado para eleger o secretaacuterio-geral das Naccedilotildees Unidas e emdiversas outras organizaccedilotildees

                                      241 Exemplo

                                      Na tabela 5 abaixo pode-se encontrar 8 perfis de eleitores com seus candidatos apro-vados e quantidade de eleitores que se encaixam no perfil Na tabela 6 temos o resultadoda contabilizaccedilatildeo dos votos destes perfis O candidato mais popular eacute o B que se encontraaprovado em 5 perfis distintos totalizando 60 votos ou aproximadamente 32

                                      Tabela 5 ndash Exemplo AVS

                                      Aprovaccedilotildees Ndeg de eleitoresA 20AB 16B 19

                                      BDC 6CAB 7CD 15DC 5DCB 12

                                      Tabela 6 ndash Resultado AVSCandidatos Total de votos

                                      A 43B 60C 45D 38

                                      242 Vantagens e Desvantagens do AVS

                                      Aleacutem de simples este meacutetodo permite um niacutevel maior de expressividade aos eleitoresOnde no FPTP e TRS eles satildeo limitados pelo seu uacutenico voto aqui os eleitores tecircm aliberdade de demonstrar exatamente quais candidatos consideram aptos ou aceitaacuteveis aocargo

                                      25

                                      Outro efeito dessa liberdade trazida pelo AVS eacute a dizimaccedilatildeo do spoiler effect Can-didatos de partidos menores natildeo tem como roubar votos de partidos maiores nessesistema ambos os candidatos contabilizariam o voto

                                      243 Voto Uacutetil no AVS

                                      O tipo de voto uacutetil no AVS eacute denominado bullet voting Segundo The Center forElection Science (2015) esta taacutetica envolve simplesmente ignorar a possibilidade de votarem mais de um candidato e votar apenas em sua primeira opccedilatildeo Um eleitor pode serlevado a adotar essa estrateacutegia quando percebe que sua preferecircncia pode ser prejudicadacom o voto em alguma segunda opccedilatildeo sua Em um cenaacuterio extremo onde 100 doseleitores adotam esta estrateacutegia as eleiccedilotildees satildeo convertidas a um simples First Past ThePost

                                      25 THE BORDA COUNT

                                      Este meacutetodo carrega o nome em homenagem a seu criador Jean-Charles de Bordaque o desenvolveu em 1770 (LIPPMAN 2012) A contagem de Borda utiliza a abordagemde ranqueamento dos candidatos poreacutem de maneira diferente ao IRV Este eacute um sistemaque atribui uma pontuaccedilatildeo aos candidatos com base nestes rankings O candidato na basedo ranking natildeo recebe pontos o candidato imediatamente acima deste recebe 1 pontoo proacuteximo recebe 2 pontos e assim por diante ateacute o topo do ranking As pontuaccedilotildees detodos os rankings satildeo contabilizadas e o candidato com maior pontuaccedilatildeo eacute eleito Deacordo com Lippman variaccedilotildees deste meacutetodo satildeo encontradas em uso na premiaccedilatildeo dediversos esportes como na seleccedilatildeo do MVP(Most Valuable Player) da MLB(principal ligade beisebol dos EUA) e no Trofeacuteu Heisman de futebol americano universitaacuterio

                                      251 Exemplo

                                      Neste exemplo seratildeo aproveitados os mesmos rankings apresentados na tabela 3 Porserem 4 candidatos o primeiro colocado de cada ranking receberaacute 3 pontos o segundo 2pontos o terceiro 1 e o quarto 0 Assim o nuacutemero maacuteximo de pontos que um candidatopode atingir eacute igual a 300(se ficar na primeira posiccedilatildeo em todos os rankings) e o nuacutemerototal de pontos no sistema eacute 600 O nuacutemero maacuteximo de pontos que um candidato podeatingir eacute calculado com

                                      (cminus 1)times e

                                      Sendo c igual ao nuacutemero de candidatos e e o nuacutemero de eleitores Por sua vez onuacutemero total de pontos no sistema eacute

                                      26

                                      (cminus 1)times c2

                                      times e

                                      A contagem final dos pontos eacute apresentada na tabela 7 abaixo

                                      Tabela 7 ndash Resultado BCCandidatos Total de pontos

                                      A 146B 181C 126D 147

                                      O candidato eleito eacute o B com 181 pontos ou aproximadamente 60 da pontuaccedilatildeomaacutexima

                                      252 Vantagens e Desvantagens do BC

                                      Em comparaccedilatildeo com os meacutetodos abordados anteriormente que apenas consideramas primeiras opccedilotildees de cada eleitor este meacutetodo regularmente escolhe candidatos comaceitaccedilatildeo mais ampla ao inveacutes de uma preferecircncia direta dos eleitores (Electoral ReformSociety 2017b)

                                      Ele tambeacutem encoraja uma abordagem estrateacutegica por parte dos partidos onde seriade seu interesse nomear mais de um candidato para concorrer pois quanto mais candi-datos estatildeo no paacutereo maior eacute a pontuaccedilatildeo dos primeiros colocados Logo a nomeaccedilatildeo decandidatos menos populares pode beneficiar os principais candidatos de um partido

                                      253 Voto Uacutetil no BC

                                      Existem duas estrateacutegias aplicaacuteveis a esse sistema A primeira denominada compromi-sing de maneira similar a outros meacutetodos de votaccedilatildeo se resume em ranquear em primeirolugar um dos candidatos que estejam liderando as eleiccedilotildees mesmo que este natildeo seja suapreferecircncia real A segunda estrateacutegia burying eacute o oposto esta se baseia em ranquearem uacuteltimo lugar um dos candidatos liacutederes mesmo que este natildeo seja o seu candidato demaior desgosto Ambas estrateacutegias podem ser aplicadas ao mesmo tempo por um eleitor

                                      26 SCORE VOTING SYSTEM

                                      Score Voting ou Range Voting como tambeacutem eacute conhecido eacute mais um meacutetodo quetenta trazer maior liberdade de expressatildeo aos eleitores Assim como o Borda Counteste sistema funciona baseado na pontuaccedilatildeo dos candidatos no entanto ao inveacutes dessapontuaccedilatildeo ser relativa agrave posiccedilatildeo do candidato no ranking de cada eleitor este por sua veztem completa liberdade de atribuir qualquer quantidade de pontos aos candidatos dentro

                                      27

                                      de determinada escala Um eleitor pode dar o mesmo nuacutemero de pontos para diferentescandidatos e apoacutes o somatoacuterio de todas as pontuaccedilotildees o candidato com a pontuaccedilatildeo maisalta eacute eleito Incorporado ao escopo poliacutetico o SVS eacute utilizado no Partido Pirata Alematildeobem como em diversas organizaccedilotildees tais como o Fedora Project e Mozilla e tambeacutem emvariados esportes oliacutempicos e reality shows como o American Idol aponta Hamlin (2015)

                                      261 Exemplo

                                      Neste exemplo temos apresentados na tabela 8 abaixo 4 perfis distintos de eleitorese suas respectivas atribuiccedilotildees de pontos aos 4 candidatos Cada eleitor pode atribuirqualquer pontuaccedilatildeo a um candidato dentro da escala de -10 a 10 O resultado da eleiccedilatildeoapoacutes a soma de todos os pontos por candidato se encontra na tabela 9 onde o candidatoA eacute eleito com um total de 605 pontos

                                      Tabela 8 ndash Exemplo SVS

                                      Perfil A B C D Ndeg de eleitores1 10 -1 5 2 362 6 9 -3 4 253 2 0 8 4 224 3 3 3 10 17

                                      Tabela 9 ndash Resultado SVSCandidatos Total de pontos

                                      A 605B 240C 332D 430

                                      262 Vantagens e Desvantagens do SVS

                                      A grande vantagem do SVS eacute como ele proporciona aos eleitores expressar de maneiramuito proacutexima potencialmente exata suas impressotildees poliacuteticas de cada candidato Eleeacute ainda mais expressivo que o AVS Dessa maneira o spoiler effect tambeacutem se torna nuloao passo que toda intenccedilatildeo de voto eacute precisamente representada neste sistema

                                      Assim como outros meacutetodos eleitorais este sofre igualmente dos males produzidos pelovoto taacutetico Sua principal desvantagem eacute discutida na seccedilatildeo abaixo

                                      263 Voto Uacutetil no SVS

                                      Da mesma maneira que no Approval Voting atraveacutes do bullet voting o SVS tambeacutempode ser convertido em uma eleiccedilatildeo sob o meacutetodo FPTP em um cenaacuterio com um grande

                                      28

                                      volume de eleitores maliciosos O voto uacutetil sob este sistema se manifesta pontuando-seapenas um candidato com uma nota positiva e todos os outros com as notas mais baixasda escala Se todos os eleitores se aproveitarem dessa abordagem natildeo existiraacute distinccedilatildeoefetiva entre uma eleiccedilatildeo sob SVS e FPTP Essencialmente cada eleitor estaacute votando emapenas um candidato Essa eacute a principal desvantagem do SVS e ela consegue eliminarsua principal vantagem dar ao eleitor um poder maior de expressatildeo

                                      27 BLOC VOTE

                                      O Bloc Vote eacute um meacutetodo utilizado para a eleiccedilatildeo de candidatos a cargos no governocom mais de uma vacacircncia Pode ser considerado um meio-termo entre o FPTP e oAVS pois os eleitores podem votar em mais de um candidato poreacutem satildeo limitados pelonuacutemero de vagas Em uma eleiccedilatildeo com duas vagas por exemplo cada eleitor selecionaraacutedois candidatos ou menos Sensatamente o candidato mais votado eacute eleito Ele possuialgumas utilizaccedilotildees em eleiccedilotildees locais em algumas partes da Inglaterra (Electoral ReformSociety 2017a)

                                      271 Exemplo

                                      Neste exemplo dois candidatos seratildeo eleitos logo cada eleitor votaraacute em no maacuteximodois candidatos A distribuiccedilatildeo de votos pode ser conferida na tabela 10 e o resultado dacontagem de votos na tabela 11 abaixo Os candidatos eleitos satildeo o C totalizando 78do maacuteximo de votos possiacuteveis para um candidato e o A com 43

                                      Tabela 10 ndash Exemplo BV

                                      Aprovaccedilotildees Ndeg de eleitoresAC 20AB 16BC 19BD 6CA 7CD 15DC 17

                                      Tabela 11 ndash Resultado BVCandidatos Total de votos

                                      A 43B 41C 78D 38

                                      29

                                      272 Voto Uacutetil no BV

                                      Neste sistema eacute possiacutevel que um eleitor evite votar em sua primeira opccedilatildeo quandoeste natildeo tem chances de vitoacuteria e se fazendo isto ele diminuiraacute as chances de algum outrocandidato de seu desgosto ganhar Poreacutem o sistema previne um outro tipo de voto uacutetilEm eleiccedilotildees com mais de uma vaga onde os eleitores soacute podem votar em um candidatose um eleitor sabe que sua primeira opccedilatildeo tambeacutem eacute a primeira opccedilatildeo da maior parteda populaccedilatildeo e portanto muito provavelmente seraacute um dos candidatos eleitos eacute possiacutevelque ele arrisque votar em uma segunda opccedilatildeo sua na esperanccedila de a longo prazo elegersuas duas principais opccedilotildees de voto Com os eleitores podendo votar no nuacutemero exato devagas disponiacuteveis esse tipo de pensamento taacutetico perde o sentido

                                      30

                                      3 O SIMULADOR

                                      Para este trabalho foi implementado um simulador eleitoral na forma de uma aplicaccedilatildeoweb para que a interaccedilatildeo do usuaacuterio fosse facilitada Veremos a seguir como se daacute suautilizaccedilatildeo de forma geral

                                      Figura 2 ndash Captura de tela 1

                                      Figura 3 ndash Captura de tela 2

                                      A primeira opccedilatildeo encontrada pelo usuaacuterio eacute a escolha de quais sistemas de votaccedilatildeo se-ratildeo simulados (Figura 2) Todos eles podem ser selecionados para rodar simultaneamentePoreacutem natildeo eacute permitido rodar uma simulaccedilatildeo do Bloc Vote para uma eleiccedilatildeo onde apenasum candidato eacute eleito aleacutem disso natildeo existe implementaccedilatildeo dos meacutetodos TRS e IRV para

                                      31

                                      eleiccedilotildees com mais de um candidato eleito jaacute que eles se comportariam exatamente comono FPTP

                                      A maioria das linguagens de programaccedilatildeo senatildeo todas possuem um gerador de nuacuteme-ros pseudoaleatoacuterios que fornece a possibilidade de definir uma seed para o gerador Estaseed funciona como um ponto de partida para a geraccedilatildeo dos nuacutemero e portanto todasimulaccedilatildeo que rodar com a mesma seed sempre teraacute os mesmos resultados Se nenhumvalor for fornecido pelo usuaacuterio o tempo atual do sistema eacute utilizado As opccedilotildees subse-quentes satildeo a escolha do nuacutemero de eleitores gerados e o nuacutemero de vagas (Figura 3) Senenhum valor for fornecido o nuacutemero de eleitores padratildeo utilizado eacute 1000 e o nuacutemero devagas igual a 1

                                      Figura 4 ndash Captura de tela 3

                                      Este simulador possui dois modos para a criaccedilatildeo dos rankings dos eleitores No modoManipulate (Figura 4) primeiramente se define o nuacutemero de candidatos atraveacutes do campode entrada ao lado do tiacutetulo Candidates ou alternativamente pode-se adicionar candida-tos um a um atraveacutes do sinal de mais na parte inferior da paacutegina Para cada candidatoeacute possiacutevel definir a porcentagem de seus eleitores que optaraacute pelo voto taacutetico e pelovoto de minoria Tambeacutem eacute possiacutevel alterar o nome dos candidatos se for do interessedo usuaacuterio

                                      32

                                      Figura 5 ndash Captura de tela 4

                                      Figura 6 ndash Captura de tela 5

                                      33

                                      Figura 7 ndash Captura de tela 6

                                      Apoacutes a criaccedilatildeo dos candidatos o usuaacuterio pode criar perfis de eleitores que definiratildeo demaneira exata como partes da populaccedilatildeo iraacute votar (Figura 5) Em cada perfil se defineo valor em porcentos da populaccedilatildeo votante que o adotaraacute e a nota de cada candidatoTambeacutem eacute possiacutevel nomear cada perfil livremente

                                      No modo Generate (Figura 6) eacute onde o gerador de nuacutemeros pseudoaleatoacuterios eacute usadoNesse modo ao inveacutes do usuaacuterio criar perfis de eleitores ele define qual seraacute a distribuiccedilatildeoadotada para a geraccedilatildeo de notas de cada candidato Essas distribuiccedilotildees seratildeo mais bemdetalhadas no Capiacutetulo 5 Da mesma maneira que no modo Manipulate nesse modotambeacutem eacute possiacutevel definir os valores para os dois tipos de voto uacutetil os votos taacuteticos eos votos de minoria No primeiro estatildeo incluiacutedas as estrateacutegias de mudanccedila de votoespeciacuteficas de cada sistema como o bullet voting no AVS e SVS ou quando a preferecircnciade um eleitor claramente natildeo possui chances de vitoacuteria e ele muda seu voto para um doscandidatos que esteja na lideranccedila o que ocorre no FPTP e TRS O voto de minoriase apresenta apenas no FPTP em eleiccedilotildees onde mais de um candidato eacute eleito Se apreferecircncia de um eleitor claramente lidera a eleiccedilatildeo por ser tambeacutem a preferecircncia damaior parte da populaccedilatildeo esse eleitor pode mudar o seu voto para uma segunda opccedilatildeona esperanccedila de eleger dois de seus candidatos favoritos

                                      Por fim em ambos os modos o usuaacuterio tem a opccedilatildeo de definir coalizotildees entre oscandidatos se o sistema TRS estiver habilitado pois as coalizotildees apenas se manifestamnesse sistema Essas coalizotildees alteraratildeo as notas dos candidatos dependendo dos outroscandidatos pertencentes a elas (Figura 7)

                                      A aplicaccedilatildeo pode ser encontrada na paacutegina httpelectionsimpythonanywherecom

                                      34

                                      4 CENAacuteRIOS PERTINENTES

                                      Para todos os cenaacuterios deste capiacutetulo seraacute usada a seed do simulador igual a 100 e apopulaccedilatildeo de eleitores igual a 1000 para que exista consistecircncia na anaacutelise e tambeacutem paraque possa haver replicaccedilatildeo dos resultados se necessaacuterio

                                      41 CENAacuteRIO 1 VOTO TAacuteTICO

                                      Neste exemplo teremos quatro candidatos Ana Beto Carla e Diego Ana e Betoseratildeo gerados a partir da distribuiccedilatildeo Neutral (Figura 47) Carla da distribuiccedilatildeo Disliked(Figura 51) e Diego da Hated (Figura 55) Para a simulaccedilatildeo com a seed 100 o melhorcandidato a ser eleito ou seja aquele que maximiza a meacutedia das notas dos eleitores eacute oBeto com uma meacutedia de 0073 Para cada sistema seratildeo comparados os resultados semvoto taacutetico aos com 20 de voto taacutetico a favor da Ana Abaixo se encontram osresultados para o sistema FPTP

                                      Figura 8 ndash FPTP - Cenaacuterio 1 sem voto taacutetico

                                      Figura 9 ndash TRS segundo turno - Cenaacuterio 1 sem voto taacutetico

                                      35

                                      Figura 10 ndash IRV primeiro turno - Cenaacuterio 1

                                      Figura 11 ndash IRV segundo turno - Cenaacuterio 1

                                      Figura 12 ndash IRV terceiro turno - Cenaacuterio 1

                                      36

                                      Figura 13 ndash AVS - Cenaacuterio 1 sem voto taacutetico

                                      Figura 14 ndash BC - Cenaacuterio 1 sem voto taacutetico

                                      Figura 15 ndash SVS - Cenaacuterio 1 sem voto taacutetico

                                      37

                                      Nesse cenaacuterio sem voto taacutetico o uacutenico sistema que natildeo elege o Beto eacute o AVS Todosos outros elegem o melhor candidato Ou seja apesar de Beto ter uma melhor meacutediadas notas dos eleitores existem mais eleitores que ranqueiam Ana com uma nota acimade 0 No entanto apenas 20 dos eleitores de Diego e Carla que preferem a Ana aoinveacutes do Beto satildeo o suficiente para fazer Beto natildeo ser eleito se eles decidirem abandonarsua primeira opccedilatildeo e votar na Ana Considerando a vantagem que os votos taacuteticosproporcionam agrave Ana esta eacute eleita em todos os sistemas menos o TRS e o IRV

                                      Figura 16 ndash FPTP - Cenaacuterio 1 - 20 de voto taacutetico na Ana

                                      Figura 17 ndash TRS segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                      38

                                      Figura 18 ndash IRV primeiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                      Figura 19 ndash IRV segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                      Figura 20 ndash IRV terceiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                      39

                                      Figura 21 ndash AVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                                      Figura 22 ndash BC - Cenaacuterio 1 20 de voto taacutetico na Ana

                                      Figura 23 ndash SVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                                      40

                                      Eacute claro que se os eleitores que preferem o Beto tambeacutem votassem de maneira estra-teacutegica a situaccedilatildeo se equilibraria e haveria o mesmo niacutevel de concorrecircncia entre os doiscandidatos que ocorre quando natildeo haacute voto taacutetico Poreacutem no Borda Count esse equiliacute-brio pode natildeo acontecer e as estrateacutegias de compromising e burying podem acabar saindopela culatra se uma porcentagem elevada dos eleitores as adotarem Abaixo encontram-seos resultados para esse sistema quando 100 dos eleitores de Carla e Diego se comportammaliciosamente

                                      Figura 24 ndash BC - Cenaacuterio 1 100 de voto taacutetico na Ana e Beto

                                      Por causa do uso demasiado da estrateacutegia burying Ana e Beto perdem muitos pontose isso abre espaccedilo para uma vitoacuteria da Carla No entanto para porcentagens menores que100 o Beto ainda eacute o vencedor

                                      Essas duas estrateacutegias tambeacutem foram implementadas nesse simulador para o sistemaIRV e eacute possiacutevel ver como ele eacute resistente a elas Para que seja possiacutevel mudar os resultadosde uma eleiccedilatildeo sob o IRV eacute necessaacuterio mudar a ordem de eliminaccedilatildeo dos candidatos paraque o seu candidato preferido acabe enfrentando um candidato mais fraco nas rodadasfinais Isso natildeo ocorre com compromising e burying No proacuteximo cenaacuterio seraacute analisadacomo eacute possiacutevel modificar os resultados de uma eleiccedilatildeo sob o IRV

                                      Esses resultados podem ser replicados acessando os linksSem votos taacuteticos lthttpelectionsimpythonanywherecomdirect_res1111110

                                      --[0021][22Ana2222Beto222022Carla2222Diego22]------100gt

                                      Com 20 de voto taacutetico lthttpelectionsimpythonanywherecomdirect_res1111110--[0021][22Ana222022Beto2222Carla2222Diego22]1-[02000]---100gt

                                      Com 100 de voto taacuteticona Ana e Beto lthttpelectionsimpythonanywherecomdirect_res0000100--[0021][22Ana222022Beto222022Carla2222Diego22]1-[101000]---100gt

                                      41

                                      42 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV

                                      Neste cenaacuterio teremos Ana Carla e Beto concorrendo e trecircs perfis distintos que apoiamcada candidato As distribuiccedilotildees de notas dos perfis se encontram na tabela abaixo

                                      Tabela 12 ndash Distribuiccedilatildeo de notas - Cenaacuterio 2

                                      Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                      deeleitores

                                      1 10 5 0 422 0 10 5 303 5 0 10 28

                                      Com essas distribuiccedilotildees Carla eacute eliminada na primeira rodada e seus 28 de votossatildeo transferidos para a segunda opccedilatildeo de seus eleitores Ana que eacute eleita com 70 dosvotos e uma meacutedia de 56

                                      Figura 25 ndash IRV primeiro turno - Cenaacuterio 2

                                      Figura 26 ndash IRV segundo turno - Cenaacuterio 2

                                      42

                                      Cientes desse provaacutevel futuro cenaacuterio onde Ana eacute eleita uma pequena parte dos elei-tores de Beto estrategicamente o abandona e decide apoiar Carla na esperanccedila de leva-laao segundo turno contra Ana As novas distribuiccedilotildees de notas se encontram na tabelaabaixo com essa porccedilatildeo de eleitores representada pelo perfil 4

                                      Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2

                                      Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                      deeleitores

                                      1 10 5 0 422 0 10 5 283 5 0 10 284 0 8 10 2

                                      Essa mudanccedila estrateacutegica de voto altera a ordem de eliminaccedilotildees do sistema com Betosendo o primeiro a ser eliminado Com isso seus votos satildeo naturalmente transferidos paraCarla que derrota Ana no segundo turno com 58 dos votos

                                      Figura 27 ndash IRV primeiro turno com voto taacutetico - Cenaacuterio 2

                                      Figura 28 ndash IRV segundo turno com voto taacutetico - Cenaacuterio 2

                                      43

                                      Percebendo que a eleiccedilatildeo de Beto natildeo era provaacutevel seus eleitores conseguiram aomenos impedir a eleiccedilatildeo do pior candidato para eles Mas para isso foi necessaacuterio queeles tivessem a informaccedilatildeo de como os outros eleitores votariam Uma aproximaccedilatildeo dessasinformaccedilotildees poderia ser obtida em um cenaacuterio real com poucos candidatos atraveacutes depesquisas eleitorais poreacutem se o nuacutemero de candidatos eacute significativo uma noccedilatildeo completadas distribuiccedilotildees dos rankings dos eleitores se torna muito menos viaacutevel e dificulta aformulaccedilatildeo de estrateacutegias para alterar a ordem em que os candidatos satildeo eliminados

                                      Esses resultados podem ser replicados acessando os linksSem voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana22

                                      22Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                      Com voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana

                                      2222Beto2222Carla22]-----42Voter20Profile2001020520028Voter20Profile2010201020528Voter20Profile202520020102Voter20Profile20302082010100gt

                                      43 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE

                                      O interessante dos sistemas IRV e TRS eacute que os resultados do cenaacuterio anterior po-deriam ter sido obtidos ao inveacutes do voto taacutetico pela sua natildeo-monotonicidade Seriapossiacutevel que a Carla derrotasse a Ana no segundo turno atraveacutes do proacuteprio aumento depopularidade da Ana Assumindo que essa popularizaccedilatildeo ocorresse entre os candidatosdo perfil 2 onde 3 passasse a apoiar a Ana ao inveacutes do Beto as novas distribuiccedilotildeesseguiriam a tabela abaixo

                                      Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                      Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                      deeleitores

                                      1 10 5 0 452 0 10 5 273 5 0 10 28

                                      Dessa maneira Beto agora com uma porcentagem dos eleitores menor do que a deCarla seraacute eliminado na primeira rodada e como seus eleitores tecircm a Carla como segundaopccedilatildeo ela receberaacute todos os seus votos e seraacute eleita na segunda rodada As rodadas doIRV podem ser vistas nas figuras 29 e 30

                                      44

                                      Figura 29 ndash IRV primeiro turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                      Figura 30 ndash IRV segundo turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                      Tabela 15 ndash Resultados do Cenaacuterio 3Candidato

                                      eleitoMeacutedia das

                                      notasAntes da

                                      popularizaccedilatildeode Ana

                                      Ana 56

                                      Apoacutespopularizaccedilatildeo

                                      de AnaCarla 415

                                      Os efeitos dessa caracteriacutestica se refletem na satisfaccedilatildeo meacutedia da populaccedilatildeo A Ana eacuteclaramente a melhor candidata e mesmo com o seu ganho de popularidade (ou devido aele) a Carla eacute eleita

                                      Esses resultados podem ser replicados acessando os linksAntes da popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecom

                                      direct_res0010000---[22Ana2222Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                      45

                                      Apoacutes popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana2222Beto2222Carla22]-----45Voter20Profile2001020520027Voter20Profile2010201020528Voter20Profile20252002010100gt

                                      44 CENAacuteRIO 4 COALIZOtildeES

                                      O TRS por ser organizado em dois turnos separados normalmente a semanas dedistacircncia um do outro acaba abrindo brecha agrave mudanccedila de opiniatildeo por parte dos eleitorese o desenvolvimento de novas estrateacutegias por parte dos candidatos tais como a coalizatildeocom candidatos jaacute eliminados Com isso em mente nesse cenaacuterio teremos novamenteos quatro candidatos Ana Beto Carla e Diego Os trecircs primeiros seratildeo gerados dadistribuiccedilatildeo Neutral e Diego da distribuiccedilatildeo Disliked

                                      Figura 31 ndash TRS turno 1 - Cenaacuterio 4

                                      No TRS normal Ana Beto e Carla possuem com essas distribuiccedilotildees quantidades devotos muito proacuteximas com Beto e Carla indo para o segundo turno Carla estaacute 10 votosatraacutes de Beto e decide aproveitar o espaccedilo de tempo entre os dois turnos para tentaragregar mais votos Com isso Carla se aproxima de Diego e juntos formam uma coalizatildeoNo entanto com sua baixa popularidade Diego acaba ferindo a reputaccedilatildeo de Carla etorna o segundo turno muito mais faacutecil para Beto (Figura 33) Se Carla tivesse buscado osuporte de Ana por outro lado ela se veria vitoriosa no segundo turno e com uma amplavantagem sobre o Beto (Figura 34) Ou ateacute mesmo sem buscar uma coalizatildeo mesmosendo uma corrida apertada Carla teria naturalmente sido eleita (Figura 32)

                                      Esses resultados podem ser replicados acessando os linksSem coalizotildees lthttpelectionsimpythonanywherecomdirect_res0100000

                                      --[0002][22Ana222022Beto2222Carla2222Diego22]------100gt

                                      46

                                      Figura 32 ndash TRS turno 2 - Cenaacuterio 4

                                      Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4

                                      Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4

                                      47

                                      Coalizatildeo Carla e Diego lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2203Carla20Diego-100gt

                                      Coalizatildeo Carla e Ana lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2200Carla20Ana-100gt

                                      45 CENAacuteRIO 5 DILEMA DO PRISIONEIRO

                                      Neste cenaacuterio temos uma eleiccedilatildeo de uma vaga com trecircs candidatos concorrentes e trecircsperfis distintos de eleitores que seguiratildeo as seguintes distribuiccedilotildees

                                      Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5

                                      Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                      deeleitores

                                      1 10 -10 5 362 -10 10 5 343 -10 -10 5 30

                                      Esse contexto nos remete ao notaacutevel dilema do prisioneiro Nele dois prisioneiroscuacutemplices satildeo interrogados individualmente sem poder se comunicar um com o outro ecada um enfrenta o dilema de delatar ou natildeo o seu parceiro Se os dois prisioneirosdecidem se manter calados sobre o crime ambos satildeo sentenciados a um ano de prisatildeo Seapenas um deles dedurar o outro o traidor sai livre enquanto seu parceiro eacute condenadoa trecircs anos Se ambos dedurarem um ao outro eles satildeo condenados juntos a dois anosde prisatildeo Esse dilema eacute uma ideia claacutessica presente no estudo da teoria dos jogos sendooriginalmente elaborada por Merrill Flood e Melvin Dresher em 1950 e mais tarde sendonomeada de dilema dos prisioneiros por Albert W Tucker (POUNDSTONE 1992)

                                      O que esse dilema nos mostra eacute a tentaccedilatildeo que o indiviacuteduo deteacutem se sua racionalizaccedilatildeoestiver voltada para seus proacuteprios interesses e somente eles em oposiccedilatildeo a pensar no bemdo grupo como um todo Neste cenaacuterio encontramos dois grupos de eleitores expressiva-mente opostos os perfis 1 e 2 Se qualquer uma das preferecircncias desses perfis fosse eleitaisso significaria uma alta rejeiccedilatildeo de maior parte da populaccedilatildeo No entanto eles possuema segunda opccedilatildeo em comum a Carla que por sua vez eacute a preferecircncia do terceiro perfilPortanto a eleiccedilatildeo da Carla seria logicamente o resultado oacutetimo

                                      Mesmo assim a Ana eacute eleita nos dois sistemas acima o que natildeo parece justo poispela tabela 16 eacute evidente que apenas 36 da populaccedilatildeo a aprova enquanto que os outros64 a reprovam ao maacuteximo O sistema IRV se comporta de maneira idecircntica ao TRS

                                      48

                                      Figura 35 ndash FPTP - Cenaacuterio 5

                                      Figura 36 ndash TRS segundo turno - Cenaacuterio 5

                                      nesta situaccedilatildeo Com esse resultado a meacutedia das notas eacute -28 No entanto os trecircs sistemasseguintes nos apresentam resultados diferentes

                                      Tabela 17 ndash Resultados do Cenaacuterio 5

                                      Sistema Candidatoeleito

                                      Meacutedia dasnotas

                                      FPTP Ana -28TRS Ana -28IRV Ana -28AVS Carla 50BC Carla 50SVS Carla 50

                                      49

                                      Figura 37 ndash AVS - Cenaacuterio 5

                                      Figura 38 ndash BC - Cenaacuterio 5

                                      Tanto o AVS quanto o Borda Count e o SVS satildeo sistemas que consideram todasas opiniotildees de cada eleitor ao mesmo tempo e por isso satildeo capazes de eleger o melhorcandidato nesta situaccedilatildeo diferentemente do TRS que natildeo absorve completamente todosentimento do eleitor por todos os candidatos e o IRV que apesar de ser bem expressivoquebra esse processo em inuacutemeras rodadas o que permite a perda de informaccedilatildeo ao longodelas

                                      Esses resultados podem ser replicados acessando o linklthttpelectionsimpythonanywherecomdirect_res1111110---[22Ana

                                      222022Beto222022Carla22]-----36Voter20Profile2001020-1020534Voter20Profile201-10201020530Voter20Profile202-1020-10205100gt

                                      50

                                      Figura 39 ndash SVS - Cenaacuterio 5

                                      46 CENAacuteRIO 6 VOTO DE MINORIA

                                      Neste cenaacuterio temos uma eleiccedilatildeo com quatro candidatos e duas vagas A Ana seraacutea preferecircncia de uma extensa parte da populaccedilatildeo (distribuiccedilatildeo Loved Figura 53) Betoe Carla seratildeo candidatos razoavelmente populares (distribuiccedilatildeo Neutral Figura 47) eDiego seraacute a preferecircncia de apenas um pequeno grupo especiacutefico e rejeitado pela maioria(distribuiccedilatildeo Disliked Figura 51) Eacute intuitivo esperar que os dois candidatos eleitos seratildeoa Ana e ou o Beto ou a Carla e isso eacute exatamente o que ocorre na figura 40 no sistemaFPTP sem voto de minoria

                                      Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria

                                      Eacute evidente a discrepacircncia da quantidade de votos da Ana para os outros candidatose apesar de Beto e Carla serem mais populares que Diego os trecircs natildeo se encontrammuito afastados Poreacutem se a pequena fraccedilatildeo de candidatos que possuem a Ana como

                                      51

                                      Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego

                                      preferecircncia e Diego como segunda opccedilatildeo optarem pelo voto de minoria a situaccedilatildeo mudacompletamente (Figura 41) Assim apesar de extensamente rejeitado Diego conquistaa segunda vaga e a meacutedia das notas despenca de 2929 para 0505 No entanto aindaexiste um cenaacuterio pior Se os outros grupos de eleitores pensarem da mesma forma eevitarem votar na Ana achando que sua eleiccedilatildeo jaacute estaacute assegurada apenas 80 de votode minoria para esses grupos jaacute eacute o suficiente para eliminaacute-la das eleiccedilotildees (Figura 42)Com a Ana eliminada a meacutedia das notas cai ainda mais para 0058

                                      Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego

                                      O sistema Bloc Vote eacute uma das soluccedilotildees para o voto de minoria Permitindo queos eleitores votem no mesmo nuacutemero de candidatos que de vagas a serem preenchidasnatildeo existe o iacutempeto a esse tipo de voto estrateacutegico O resultado desse sistema portantoretorna a meacutedia das notas a casa dos 29 (Figura 43) Os sistemas AVS Borda Count eSVS tambeacutem impedem a presenccedila do voto de minoria e atingem resultados semelhantes

                                      52

                                      Figura 43 ndash BV - Cenaacuterio 6

                                      Tabela 18 ndash Resultados do Cenaacuterio 6

                                      Sistema Candidatoseleitos

                                      Meacutedia dasnotas

                                      FPTP sem voto de minoriaAna eBeto 2929

                                      FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

                                      FPTP com 80 de voto de minoriaBeto eCarla 0058

                                      Bloc VoteAna eCarla 2913

                                      Esses resultados podem ser replicados acessando os links

                                      Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

                                      100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

                                      80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

                                      53

                                      5 COMO FUNCIONA O SIMULADOR

                                      O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

                                      51 CLASSE ELECTIONS

                                      Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

                                      bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

                                      Figura 44 ndash estrutura candidates

                                      bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

                                      bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

                                      Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

                                      Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

                                      54

                                      Figura 45 ndash estrutura voters

                                      Figura 46 ndash estrutura votes

                                      daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

                                      Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

                                      55

                                      Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

                                      Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

                                      na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

                                      56

                                      Figura 49 ndash PDF - Distribuiccedilatildeo Liked

                                      Figura 50 ndash CDF - Distribuiccedilatildeo Liked

                                      (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

                                      Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

                                      57

                                      Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

                                      Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

                                      candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

                                      Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

                                      58

                                      Figura 53 ndash PDF - Distribuiccedilatildeo Loved

                                      Figura 54 ndash CDF - Distribuiccedilatildeo Loved

                                      funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

                                      59

                                      Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                                      Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                                      Meacutedia das Notas sumei

                                      sumvj nij

                                      etimes v

                                      Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                                      Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                                      60

                                      Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                                      Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                                      52 CLASSE FIRSTPASTTHEPOST

                                      Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                                      Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                                      61

                                      Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                                      Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                                      mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                                      62

                                      53 CLASSE TWOROUNDSYSTEM

                                      A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                                      54 CLASSE INSTANTRUNOFFVOTING

                                      A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                                      Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                                      63

                                      cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                                      55 CLASSE APPROVALVOTING

                                      Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                                      56 CLASSE BORDACOUNT

                                      Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                                      57 CLASSE SCOREVOTING

                                      De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                                      64

                                      58 CLASSE BLOCVOTE

                                      O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                                      59 TECNOLOGIAS UTILIZADAS

                                      A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                                      Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                                      O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                                      Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                                      65

                                      6 CONCLUSAtildeO

                                      Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                                      Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                                      Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                                      Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                                      Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                                      66

                                      REFEREcircNCIAS

                                      AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                                      Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                                      Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                                      Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                                      HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                                      LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                                      ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                                      Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                                      POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                                      The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                                      67

                                      APEcircNDICES

                                      APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                      Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                      if(not len(selfvoter_profiles))

                                      for voter in range(selfN_VOTERS)

                                      candidates_rank = dict()

                                      for candidate in reversed(range(selfN_CANDIDATES))

                                      if(selfBIAS_VECTOR[candidate]==4)

                                      candidates_rank[candidate] = self_sortear(selfloved)

                                      elif(selfBIAS_VECTOR[candidate]==3)

                                      candidates_rank[candidate] = self_sortear(selfliked)

                                      elif(selfBIAS_VECTOR[candidate]==2)

                                      candidates_rank[candidate] = self_sortear(selfdisliked)

                                      elif(selfBIAS_VECTOR[candidate]==1)

                                      candidates_rank[candidate] = self_sortear(selfhated)

                                      elif(selfBIAS_VECTOR[candidate]==-1)

                                      candidates_rank[candidate] = self_sortear(selfpolarizer

                                      )

                                      elif(selfBIAS_VECTOR[candidate]==-2)

                                      candidates_rank[candidate] = self_sortear(self

                                      more_polarizer)

                                      else

                                      candidates_rank[candidate] = self_sortear(selfneutral)

                                      selfvotersappend(candidates_rank)

                                      else

                                      ranges = []

                                      ranks = []

                                      for prof in selfvoter_profiles

                                      rangesappend(int(prof[pop_percentage]))

                                      rank =

                                      for index score in enumerate(prof[scores])

                                      rank[index] = score

                                      ranksappend(rank)

                                      for index _range in enumerate(ranges)

                                      for _ in range(int(selfN_VOTERS(_range100)))

                                      selfvotersappend(ranks[index])

                                      68

                                      APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                      Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                      for i in range(selfN_CANDIDATES)

                                      selfcandidates[i] = 0

                                      selfvotes[i] = set()

                                      APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                      Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                      for candidate in range(selfN_CANDIDATES)

                                      rating_sum = 0

                                      for voter in selfvoters

                                      rating_sum += voter[candidate]

                                      selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                      APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                      Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                      if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                      return selfcalculate_mean(winners)

                                      else

                                      chose_best = True if winners[0] == selfbest_candidate else

                                      False

                                      return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                      69

                                      APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                      Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                      rating_sum = 0

                                      for voter in selfvoters

                                      for candidate in winners

                                      rating_sum += voter[candidate]

                                      return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                      APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                      Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                      for i in range(1 selfN_VACANCIES + 2)

                                      selfleading_candidatesappend(selfsorted_candidates[-i][self

                                      CANDIDATE_INDEX])

                                      APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                      Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                      for leader in selfelecrounds[-1]

                                      selfleading_candidatesappend(leader[0])

                                      70

                                      APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                      Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                      self_account_for_coalitions()

                                      for voter in selfvoters

                                      selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                      (1)))

                                      temp = []

                                      for voter in selfsorted_voters

                                      new_dict = defaultdict(list)

                                      for k in voter

                                      new_dict[k[1]]append(k[0])

                                      tempappend(new_dict)

                                      selfsorted_voters = []

                                      for voter_index current_voter in enumerate(temp)

                                      new_voter = []

                                      for rating candidate_indexes in current_voteritems()

                                      if len(current_voter[rating]) gt 1

                                      shuffle(current_voter[rating])

                                      for e in candidate_indexes

                                      new_voterappend((e rating))

                                      else

                                      new_voterappend((candidate_indexes[0] rating))

                                      selfsorted_votersappend(new_voter)

                                      selfcandidates[new_voter[-1][0]] += 1

                                      selfvotes[new_voter[-1][0]]add(voter_index)

                                      71

                                      APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                      Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                      for candidate in selfvotes_copy

                                      if candidate not in selfelecleading_candidates

                                      for voter_index in selfvotes_copy[candidate]

                                      for index _candidate in enumerate(reversed(selfelec

                                      sorted_voters[voter_index]))

                                      if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                      leading_candidates

                                      if randomrandom() lt selfelec

                                      tactical_vote_percentages[_candidate[selfelec

                                      CANDIDATE_INDEX]]

                                      selfrankings_changed[voter_index] = copy

                                      deepcopy(selfelecsorted_voters[voter_index])

                                      selfrankings_changed[voter_index][-(index + 1)]

                                      selfrankings_changed[voter_index][-1] = self

                                      rankings_changed[voter_index][-1] self

                                      rankings_changed[voter_index][-(index + 1)]

                                      selfcandidates[candidate] -= 1

                                      selfcandidates[_candidate[selfelec

                                      CANDIDATE_INDEX]] += 1

                                      selfvotes[candidate]remove(voter_index)

                                      selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                      ]]add(voter_index)

                                      break

                                      break

                                      72

                                      APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                      Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                      half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                      for candidate in selfelecleading_candidates

                                      if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                      continue

                                      for voter_index in selfvotes_copy[candidate]

                                      if voter_index in selfrankings_changed

                                      ranking = selfrankings_changed[voter_index]

                                      else

                                      ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                      ])

                                      for index _candidate in enumerate(reversed(ranking))

                                      if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                      leading_candidates or (_candidate[selfelec

                                      CANDIDATE_INDEX] in selfelecleading_candidates and

                                      selfelecleading_candidatesindex(_candidate[selfelec

                                      CANDIDATE_INDEX]) gt= half_vacancies)

                                      if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                      if randomrandom() lt selfelec

                                      minority_vote_percentages[_candidate[selfelec

                                      CANDIDATE_INDEX]]

                                      selfcandidates[candidate] -= 1

                                      selfcandidates[_candidate[selfelec

                                      CANDIDATE_INDEX]] += 1

                                      break

                                      break

                                      break

                                      73

                                      APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                      Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                      self_account_for_coalitions()

                                      for candidate in selfvotes

                                      if candidate = selfwinner and candidate = selfsecond_place

                                      for voter_index in selfvotes[candidate]

                                      if voter_index in selfrankings_changed

                                      ranking = selfrankings_changed[voter_index]

                                      else

                                      ranking = copydeepcopy(selfelecsorted_voters[

                                      voter_index])

                                      for index2 candidate in enumerate(reversed(ranking))

                                      if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                      selfcandidates[selfwinner] += 1

                                      selfvotes[selfwinner]add(voter_index)

                                      break

                                      elif candidate[selfelecCANDIDATE_INDEX] == self

                                      second_place

                                      selfcandidates[selfsecond_place] += 1

                                      selfvotes[selfsecond_place]add(voter_index)

                                      break

                                      selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                      winners = []

                                      vacancies = selfelecN_VACANCIES

                                      for candidate in reversed(selfsorted_candidates)

                                      if vacancies == 0

                                      break

                                      winnersappend(candidate[0])

                                      vacancies -= 1

                                      mean chose_best = selfelecget_mean(winners = winners)

                                      74

                                      APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                      Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                      for voter_index voter in enumerate(selfelecsorted_voters)

                                      voter_dict = dict()

                                      og_voter_dict = dict()

                                      for tup in voter

                                      voter_dict[tup[0]] = tup[1]

                                      og_voter_dict[tup[0]] = tup[1]

                                      for coalition in selfeleccoalitions

                                      for candidate in coalition

                                      add_to_score = 0

                                      for candidate2 in coalition

                                      if candidate == candidate2

                                      continue

                                      half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                      if half lt 0

                                      add_to_score += mathceil(half)

                                      else

                                      add_to_score += mathfloor(half)

                                      if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                      voter_dict[candidate[rsquovaluersquo]] = 10

                                      elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                      voter_dict[candidate[rsquovaluersquo]] = -10

                                      else

                                      voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                      selfrankings_changed[voter_index] = []

                                      for candidate in voter_dict

                                      selfrankings_changed[voter_index]append((candidate voter_dict[

                                      candidate]))

                                      selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                      voter_index] key=lambda x x[1])

                                      75

                                      APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                      Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                      selfelecroundsappend(selfsorted_candidates[_round])

                                      if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                      N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                      N_VACANCIES - 1)

                                      return 2

                                      elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                      N_VOTERS gt 05)

                                      return 1

                                      else

                                      selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                      CANDIDATE_INDEX])

                                      for voter_index in selfvotes[selfsorted_candidates[_round][self

                                      elecCANDIDATE_INDEX]]

                                      if voter_index in selfrankings_changed

                                      for candidate in reversed(selfrankings_changed[voter_index

                                      ])

                                      if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                      excluded

                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                      ]] += 1

                                      selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                      add(voter_index)

                                      break

                                      else

                                      continue

                                      else

                                      for candidate in reversed(selfelecsorted_voters[

                                      voter_index])

                                      if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                      excluded

                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                      ]] += 1

                                      selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                      add(voter_index)

                                      break

                                      else

                                      continue

                                      selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                      return 0

                                      76

                                      APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                      Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                      for index in range(selfelecN_CANDIDATES)

                                      selfcandidates[index] = 0

                                      for voter in selfelecsorted_voters

                                      for candidate in reversed(voter)

                                      if candidate[selfelecCANDIDATE_SCORE] gt 0

                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                      else

                                      break

                                      APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                      Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                      for index in range(selfelecN_CANDIDATES)

                                      selfcandidates[index] = 0

                                      for voter in selfelecsorted_voters

                                      if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                      elecCANDIDATE_INDEX]]

                                      selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                      else

                                      for candidate in reversed(voter)

                                      if candidate[selfelecCANDIDATE_SCORE] gt 0

                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                      else

                                      break

                                      77

                                      APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                      Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                      pos = set()

                                      for index perc in enumerate(selfelectactical_vote_percentages)

                                      if perc gt 0

                                      posadd(index)

                                      for candidate in selfeleccandidates

                                      if candidate not in selfleading_candidates

                                      for voter_index in selfvotes[candidate]

                                      raised = None

                                      for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                      ])

                                      if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                      leading_candidates

                                      if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                      if randomrandom() lt selfelectactical_vote_percentages[

                                      candidate_tuple[selfelecCANDIDATE_INDEX]]

                                      ranking = [None]selfelecN_CANDIDATES

                                      ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                      selfelecvoters[voter_index][candidate_tuple[selfelec

                                      CANDIDATE_INDEX]])

                                      raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                      break

                                      break

                                      break

                                      if raised = None

                                      for _candidate in selfleading_candidates

                                      if _candidate = ranking[-1][0]

                                      ranking[0] = (_candidate selfelecvoters[voter_index][

                                      _candidate])

                                      buried = _candidate

                                      break

                                      i = 1

                                      for candidate_tuple in selfelecsorted_voters[voter_index]

                                      if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                      buried]

                                      continue

                                      else

                                      ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                      selfelecvoters[voter_index][candidate_tuple[selfelec

                                      CANDIDATE_INDEX]])

                                      i += 1

                                      selfrankings_changed[voter_index] = ranking

                                      78

                                      APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                      Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                      for voter_index in selfvotes[candidate]

                                      if randomrandom() lt selfelectactical_vote_percentages[candidate

                                      ]

                                      for _candidate in selfleading_candidates

                                      if _candidate = candidate

                                      ranking = [None]selfelecN_CANDIDATES

                                      ranking[0] = (_candidate selfelecvoters[voter_index][

                                      _candidate])

                                      buried = _candidate

                                      break

                                      i = 1

                                      for candidate_tuple in selfelecsorted_voters[voter_index]

                                      if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                      continue

                                      else

                                      ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                      selfelecvoters[voter_index][candidate_tuple[selfelec

                                      CANDIDATE_INDEX]])

                                      i += 1

                                      selfrankings_changed[voter_index] = ranking

                                      79

                                      APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                      Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                      for index in range(selfelecN_CANDIDATES)

                                      selfcandidates[index] = 0

                                      for voter_index voter in enumerate(selfelecsorted_voters)

                                      score = 0

                                      if voter_index in selfrankings_changed

                                      for candidate in selfrankings_changed[voter_index]

                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                      score += 1

                                      else

                                      for candidate in voter

                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                      score += 1

                                      APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                      Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                      for voter_index voter in enumerate(selfelecsorted_voters)

                                      if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                      elecCANDIDATE_INDEX]]

                                      selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                      sorted_voters[voter_index])

                                      for candidate_index candidate in enumerate(reversed(voter))

                                      if candidate_index == 0

                                      selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                      voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                      else

                                      selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                      voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                      80

                                      APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                      Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                      for index in range(selfelecN_CANDIDATES)

                                      selfcandidates[index] = 0

                                      for voter_index voter in enumerate(selfelecsorted_voters)

                                      if voter_index in selfrankings_changed

                                      for candidate in selfrankings_changed[voter_index]

                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                      selfelecCANDIDATE_RANK]

                                      else

                                      for candidate in voter

                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                      selfelecCANDIDATE_RANK]

                                      APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                      Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                      for index in range(selfelecN_CANDIDATES)

                                      selfcandidates[index] = 0

                                      for voter in selfelecsorted_voters

                                      votes = selfelecN_VACANCIES

                                      for candidate in reversed(voter)

                                      if votes == 0

                                      break

                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                      votes -= 1

                                      • Folha de aprovaccedilatildeo
                                      • Agradecimentos
                                      • Epiacutegrafe
                                      • Resumo
                                      • Abstract
                                      • Lista de ilustraccedilotildees
                                      • Lista de Coacutedigos
                                      • Lista de tabelas
                                      • Lista de abreviaturas e siglas
                                      • Sumaacuterio
                                      • INTRODUCcedilAtildeO
                                        • MOTIVACcedilAtildeO E OBJETIVO
                                        • MEacuteTODO
                                        • ESTRUTURA
                                          • SISTEMAS ELEITORAIS
                                            • FISRT PAST THE POST
                                              • Exemplo
                                              • Vantagens e Desvantagens do FPTP
                                              • Voto Uacutetil no FPTP
                                                • TWO-ROUND SYSTEM
                                                  • Exemplo
                                                  • Vantagens e Desvantagens do TRS
                                                  • Voto Uacutetil no TRS
                                                    • INSTANT-RUNOFF VOTING
                                                      • Exemplo
                                                      • Vantagens e Desvantagens do IRV
                                                      • Voto Uacutetil no IRV
                                                        • APPROVAL VOTING SYSTEM
                                                          • Exemplo
                                                          • Vantagens e Desvantagens do AVS
                                                          • Voto Uacutetil no AVS
                                                            • THE BORDA COUNT
                                                              • Exemplo
                                                              • Vantagens e Desvantagens do BC
                                                              • Voto Uacutetil no BC
                                                                • SCORE VOTING SYSTEM
                                                                  • Exemplo
                                                                  • Vantagens e Desvantagens do SVS
                                                                  • Voto Uacutetil no SVS
                                                                    • BLOC VOTE
                                                                      • Exemplo
                                                                      • Voto Uacutetil no BV
                                                                          • O SIMULADOR
                                                                          • CENAacuteRIOS PERTINENTES
                                                                            • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                            • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                            • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                            • CENAacuteRIO 4 COALIZOtildeES
                                                                            • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                            • CENAacuteRIO 6 VOTO DE MINORIA
                                                                              • COMO FUNCIONA O SIMULADOR
                                                                                • CLASSE Elections
                                                                                • CLASSE FirstPastThePost
                                                                                • CLASSE TwoRoundSystem
                                                                                • CLASSE InstantRunoffVoting
                                                                                • CLASSE ApprovalVoting
                                                                                • CLASSE BordaCount
                                                                                • CLASSE ScoreVoting
                                                                                • CLASSE BlocVote
                                                                                • TECNOLOGIAS UTILIZADAS
                                                                                  • CONCLUSAtildeO
                                                                                  • Referecircncias
                                                                                  • Meacutetodo create_voters
                                                                                  • Meacutetodo create_candidates
                                                                                  • Meacutetodo calculate_means
                                                                                  • Meacutetodo get_mean
                                                                                  • Meacutetodo calculate_mean
                                                                                  • Meacutetodo set_leading_candidates
                                                                                  • Meacutetodo irv_set_leading_candidates
                                                                                  • Meacutetodo sort_ranks
                                                                                  • Meacutetodo fptp_count_tactical_votes
                                                                                  • Meacutetodo fptp_count_minority_votes
                                                                                  • Meacutetodo trs_second_round
                                                                                  • Meacutetodo trs_account_for_coalitions
                                                                                  • Meacutetodo irv_count_votes
                                                                                  • Meacutetodo avs_count_votes
                                                                                  • Meacutetodo avs_count_votes_with_tactical
                                                                                  • Meacutetodo irv_apply_tactical_votes
                                                                                  • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                  • Meacutetodo bc_sum_candidates_scores
                                                                                  • Meacutetodo svs_apply_tactical_votes
                                                                                  • Meacutetodo svs_sum_candidates_scores
                                                                                  • Meacutetodo bv_count_votes

                                        20

                                        votados Nesta rodada os eleitores retornam as urnas para escolher uma das duas opccedilotildeessendo eleito o candidato mais votado agora definitivamente com uma maioria dos votos

                                        221 Exemplo

                                        Utilizando a mesma distribuiccedilatildeo de votos descrita na tabela 1 Neste caso como ocandidato A natildeo possui uma maioria dos votos ele e o candidato B iratildeo concorrer em umsegundo turno Digamos que as distribuiccedilotildees dos votos dos eleitores dos candidatos C eD em relaccedilatildeo aos candidatos A e B satildeo as seguintes

                                        Tabela 2 ndash 2deg turno do TRS

                                        Candidatos Votos dos eleitoresde C

                                        Votos dos eleitoresde D

                                        Votos do 1degturno

                                        A 7 5 36B 15 12 25

                                        O candidato B agora eacute eleito com uma maioria dos votos 52 contra 48 do candidatoA

                                        222 Vantagens e Desvantagens do TRS

                                        Por ser parecido com o FPTP esse sistema tambeacutem eacute de faacutecil compreensatildeo do eleitorcomum poreacutem a maior vantagem do TRS eacute a garantia de que o candidato vencedor teraacute oapoio da maioria dos eleitores no segundo turno eliminando a pluralidade Argumenta-seque isso daacute maior legitimidade poliacutetica ao mandato do candidato eleito

                                        O TRS tende a abrigar uma lista maior de candidatos sendo mais convidativo acandidatos de partidos menores mesmo que suas chances natildeo sejam maiores quandocomparadas agraves eleiccedilotildees sob o FPTP Mesmo assim essa listagem mais abrangente eacute umavantagem do sistema pois daacute aos eleitores uma variedade maior de opccedilotildees de voto

                                        Em relaccedilatildeo agraves suas desvantagens o TRS possui duas principais A primeira satildeo oscustos elevados do sistema decorrentes da necessidade da organizaccedilatildeo de um segundoturno de votaccedilotildees A segunda eacute o aumento no iacutendice de ausecircncias dos eleitores agraves urnasEssa ampliaccedilatildeo no natildeo comparecimento dos eleitores se daacute tambeacutem devido ao segundoturno por pura fatiga eleitoral bem como consequecircncia da desistecircncia de eleitores queapoiam candidatos que jaacute foram eliminados

                                        Outro ponto negativo do TRS eacute a sua natildeo-monotonicidade Isso significa que umcandidato pode ser prejudicado com um aumento em sua popularidade e suporte e domesmo modo um candidato pode se beneficiar com a perda de popularidade e suporteSe os candidatos A e B satildeo os esperados para ir ao segundo turno onde A eacute mais fortedo que B um aumento no suporte pelo candidato A pode resultar na sua derrota quandoesse aumento causa uma alteraccedilatildeo nos candidatos que satildeo selecionados para ir ao segundoturno Se esse aumento na popularidade de A resultar na eliminaccedilatildeo preacutevia de B um

                                        21

                                        terceiro candidato C pode ser vitorioso sobre A no segundo turno caso os eleitores de Bprefiram C ao candidato A Se natildeo houvesse esse crescimento de popularidade A teriaderrotado B no segundo turno Essa situaccedilatildeo seraacute vista em melhores detalhes na seccedilatildeo 43

                                        223 Voto Uacutetil no TRS

                                        Esse sistema minimiza os efeitos do voto uacutetil em relaccedilatildeo ao FPTP pois um eleitorqualquer pode tranquilamente votar em sua preferecircncia sem se preocupar em desperdiccedilaacute-lo mesmo que seu candidato natildeo tenha chances de vitoacuteria Se este natildeo for eleito aindapoderaacute escolher a sua preferecircncia dentre os dois candidatos que prosseguirem para osegundo turno

                                        Apesar disso ainda existe um cenaacuterio em que o eleitor pode ser tentado a natildeo votar emsua preferecircncia Eacute possiacutevel que ele opte pela sua segunda opccedilatildeo se souber que sua primeiraopccedilatildeo possui miacutenimas chances de ir ao segundo turno ou ateacute mesmo por saber que issodiminuiraacute as chances de algum outro candidato ser eleito Mesmo assim eacute evidente queo TRS natildeo proporciona o mesmo apelo ao voto taacutetico que o FPTP

                                        Outra caracteriacutestica do TRS eacute o incentivo a formaccedilatildeo de coalizotildees entre candidatosde partidos mais populares com candidatos de partidos menos populares As coalizotildeesfornecem benefiacutecios agrave ambas as partes onde os candidatos classificados para o segundoturno em geral se juntam a candidatos jaacute eliminados com a intenccedilatildeo de agregar maisvotos enquanto os candidatos jaacute eliminados apoiam um dos dois classificados na esperanccedilade inserir propostas proacuteprias ou modificaccedilotildees agrave chapa deles

                                        23 INSTANT-RUNOFF VOTING

                                        Instant Runoff Voting foi uma alternativa aos meacutetodos FPTP e TRS desenvolvidanos anos 70 por um professor do Instituto de Tecnologia de Massachusetts(MIT) O IRVelimina as principais desvantagens desses outros dois sistemas a pluralidade do FPTP e anecessidade de mais de uma rodada de votaccedilatildeo do TRS Este meacutetodo tambeacutem opera emmais de uma rodada poreacutem como o proacuteprio nome sugere essas rodadas satildeo instantacircneasnatildeo sendo necessaacuterio o retorno dos eleitores agraves urnas Atualmente ele eacute utilizado naIrlanda nas eleiccedilotildees presidenciais em Londres na eleiccedilatildeo de seu prefeito e em distritosindividuais na Austraacutelia para eleger membros de sua cacircmara baixa do parlamento OIRV tambeacutem eacute usado por vaacuterias organizaccedilotildees privadas nos Estados Unidos incluindoa American Political Science Association e a American Psychological Association paraeleger seus funcionaacuterios

                                        Nesse sistema os eleitores natildeo satildeo solicitados a votar em um uacutenico candidato aoinveacutes disso eles listam todos os candidatos concorrentes na ordem de sua preferecircnciaA partir dessas listas as primeiras opccedilotildees de cada eleitor recebem o seu voto e apoacutes acontagem se um candidato obtiver 50 dos votos mais um este candidato eacute eleito Se

                                        22

                                        isso natildeo ocorrer o candidato menos votado eacute eliminado das eleiccedilotildees e seus votos satildeotransferidos para a segunda opccedilatildeo de cada um de seus eleitores Esse procedimento serepete eliminando o candidato menos votado a cada rodada ateacute que algum dos candidatospossuam a maioridade dos votos

                                        231 Exemplo

                                        Na tabela 3 pode-se verificar a distribuiccedilatildeo de votos por perfil de eleitor e na tabela4 vecirc-se o desenvolvimento do IRV para essas distribuiccedilotildees O candidato D eacute o menosvotado e por consequecircncia eacute o primeiro a ser eliminado A segunda opccedilatildeo de todos oseleitores que votaram no candidato D eacute o candidato C por isso este recebe todos os votosdistribuiacutedos na segunda rodada Com isso o candidato B eacute eliminado com 25 dos votos eos candidatos A e C concorrem na uacuteltima rodada Mesmo com o candidato C na lideranccedilana segunda rodada a maior parte dos eleitores do B tem como preferecircncia o candidatoA por isso A eacute eleito com 55 dos votos contra 45 do C

                                        Tabela 3 ndash Exemplo IRV

                                        Rankings Ndeg de eleitoresABCD 20ABDC 16BDAC 19BDCA 6CABD 7CDBA 15DCAB 5DCBA 12

                                        Tabela 4 ndash Desenvolvimento do IRVTurnos D C B A

                                        1 17 22 25 362 eliminado 39 25 363 eliminado 45 eliminado 55

                                        232 Vantagens e Desvantagens do IRV

                                        Assim como no TRS a pluralidade eacute irrelevante no IRV e um candidato soacute eacute eleitocom a maioridade dos votos dando maior legitimidade ao mandato deste No entantopode-se argumentar que o IRV faz isso com mais eficiecircncia pois natildeo requer a execuccedilatildeode mais de uma rodada de votaccedilotildees Isso diminui os custos das eleiccedilotildees como um todoao mesmo tempo que proporciona um nuacutemero menor de isenccedilotildees por parte dos eleitoresdevido ao desgaste de todo o processo eleitoral

                                        23

                                        Aleacutem disso candidatos de partidos menores tendem a receber mais votos do queno FPTP e portanto satildeo mais encorajados a se candidatar Com uma lista maior decandidatos eleitores desfrutam de uma variedade maior de opccedilotildees de voto Contudomesmo com mais candidatos menos populares o spoiler effect mencionado anteriormentetambeacutem natildeo possui espaccedilo nesse sistema de votaccedilatildeo Partidos menores natildeo tem comoroubar votos de partidos maiores visto que esses votos eventualmente seratildeo transferidosde volta a eles durante o desenvolvimento das rodadas do IRV

                                        Em virtude de sua estrutura acredita-se que esse meacutetodo tende a encorajar os can-didatos tambeacutem a elaborar suas campanhas de forma mais abrangente ampliando suainfluecircncia para mais do que apenas um grupo especiacutefico de maneira que ele consiga agre-gar votos de segunda ou terceira opccedilatildeo aleacutem dos votos de seus eleitores principais

                                        A principal desvantagem do IRV eacute o fato de ele ainda natildeo ser amplamente utilizado aoredor do mundo Essa falta de familiaridade do sistema pode causar confusatildeo ao eleitorcomum em suas primeiras ocorrecircncias No entanto nos paiacuteses em que este eacute utilizadonatildeo parece haver confusatildeo entre os eleitores Aleacutem disso na maioria dos casos haveraacute umcusto potencialmente alto da substituiccedilatildeo ou alteraccedilatildeo dos sistemas das urnas eletrocircnicaspara que seja possiacutevel haver a implementaccedilatildeo do meacutetodo

                                        Aleacutem disso assim como o TRS este sistema tambeacutem possui natildeo-monotonicidade ouseja um candidato pode ser prejudicado ao ser ranqueado mais alto enquanto que outropode se beneficiar sendo ranqueado mais baixo pelos eleitores (ORNSTEIN 2018) issopode ocorrer quando esse ranqueamento causa alteraccedilotildees na ordem em que os candidatossatildeo eliminados Essa caracteriacutestica se manifesta em fenocircmenos complexos e especiacuteficos epor isso um exemplo de sua ocorrecircncia seraacute abordada em detalhes na seccedilatildeo 43

                                        233 Voto Uacutetil no IRV

                                        Como os sistemas de votaccedilatildeo anteriores o IRV natildeo eacute completamente imune ao vototaacutetico No entanto este meacutetodo se mostra bem resistente a eles quando comparado aoutros meacutetodos como o FPTP e o Borda Count (Bartholdi John J III and Orlin JamesB 1990) Distintivamente o IRV requer um maior esforccedilo do eleitor para elaborar umaestrateacutegia que melhor ajuste os resultados da eleiccedilatildeo de acordo com a sua preferecircnciaAleacutem disso eacute necessaacuterio que ele tenha informaccedilatildeo suficiente sobre os rankings de outroseleitores naturalmente obtida atraveacutes de pesquisas eleitorais

                                        Existe tambeacutem a possibilidade de ocorrer uma exaustatildeo dos votos quando natildeo haacuteo completo preenchimento do ranking por parte dos eleitores Nessas ocasiotildees o votonatildeo pode continuar a ser transferido a outros candidatos e ele eacute descartado Isso afetaa legitimidade do mandato do candidato eleito pois o resultado final natildeo representaraacute100 da populaccedilatildeo votante Essas ocorrecircncias no entanto podem ser minimizadas comuma melhor educaccedilatildeo eleitoral ou como foi implementado na Austraacutelia requerer que osrankings incluam uma totalidade dos candidatos concorrentes

                                        24

                                        24 APPROVAL VOTING SYSTEM

                                        No meacutetodo Approval Voting os eleitores natildeo satildeo limitados pelo nuacutemero de candidatosem que podem votar por isso approval cada eleitor pode votar em todos os candidatos osquais ele aprova Apoacutes as votaccedilotildees o candidato com a maior quantidade de votos eacute eleitoSegundo Hamlin (2015) a cidade de Fargo na Dakota do Norte se tornou a primeiracidade nos EUA a colocar em praacutetica este sistema em suas eleiccedilotildees gerais em novembrode 2018 AVS tambeacutem eacute utilizado para eleger o secretaacuterio-geral das Naccedilotildees Unidas e emdiversas outras organizaccedilotildees

                                        241 Exemplo

                                        Na tabela 5 abaixo pode-se encontrar 8 perfis de eleitores com seus candidatos apro-vados e quantidade de eleitores que se encaixam no perfil Na tabela 6 temos o resultadoda contabilizaccedilatildeo dos votos destes perfis O candidato mais popular eacute o B que se encontraaprovado em 5 perfis distintos totalizando 60 votos ou aproximadamente 32

                                        Tabela 5 ndash Exemplo AVS

                                        Aprovaccedilotildees Ndeg de eleitoresA 20AB 16B 19

                                        BDC 6CAB 7CD 15DC 5DCB 12

                                        Tabela 6 ndash Resultado AVSCandidatos Total de votos

                                        A 43B 60C 45D 38

                                        242 Vantagens e Desvantagens do AVS

                                        Aleacutem de simples este meacutetodo permite um niacutevel maior de expressividade aos eleitoresOnde no FPTP e TRS eles satildeo limitados pelo seu uacutenico voto aqui os eleitores tecircm aliberdade de demonstrar exatamente quais candidatos consideram aptos ou aceitaacuteveis aocargo

                                        25

                                        Outro efeito dessa liberdade trazida pelo AVS eacute a dizimaccedilatildeo do spoiler effect Can-didatos de partidos menores natildeo tem como roubar votos de partidos maiores nessesistema ambos os candidatos contabilizariam o voto

                                        243 Voto Uacutetil no AVS

                                        O tipo de voto uacutetil no AVS eacute denominado bullet voting Segundo The Center forElection Science (2015) esta taacutetica envolve simplesmente ignorar a possibilidade de votarem mais de um candidato e votar apenas em sua primeira opccedilatildeo Um eleitor pode serlevado a adotar essa estrateacutegia quando percebe que sua preferecircncia pode ser prejudicadacom o voto em alguma segunda opccedilatildeo sua Em um cenaacuterio extremo onde 100 doseleitores adotam esta estrateacutegia as eleiccedilotildees satildeo convertidas a um simples First Past ThePost

                                        25 THE BORDA COUNT

                                        Este meacutetodo carrega o nome em homenagem a seu criador Jean-Charles de Bordaque o desenvolveu em 1770 (LIPPMAN 2012) A contagem de Borda utiliza a abordagemde ranqueamento dos candidatos poreacutem de maneira diferente ao IRV Este eacute um sistemaque atribui uma pontuaccedilatildeo aos candidatos com base nestes rankings O candidato na basedo ranking natildeo recebe pontos o candidato imediatamente acima deste recebe 1 pontoo proacuteximo recebe 2 pontos e assim por diante ateacute o topo do ranking As pontuaccedilotildees detodos os rankings satildeo contabilizadas e o candidato com maior pontuaccedilatildeo eacute eleito Deacordo com Lippman variaccedilotildees deste meacutetodo satildeo encontradas em uso na premiaccedilatildeo dediversos esportes como na seleccedilatildeo do MVP(Most Valuable Player) da MLB(principal ligade beisebol dos EUA) e no Trofeacuteu Heisman de futebol americano universitaacuterio

                                        251 Exemplo

                                        Neste exemplo seratildeo aproveitados os mesmos rankings apresentados na tabela 3 Porserem 4 candidatos o primeiro colocado de cada ranking receberaacute 3 pontos o segundo 2pontos o terceiro 1 e o quarto 0 Assim o nuacutemero maacuteximo de pontos que um candidatopode atingir eacute igual a 300(se ficar na primeira posiccedilatildeo em todos os rankings) e o nuacutemerototal de pontos no sistema eacute 600 O nuacutemero maacuteximo de pontos que um candidato podeatingir eacute calculado com

                                        (cminus 1)times e

                                        Sendo c igual ao nuacutemero de candidatos e e o nuacutemero de eleitores Por sua vez onuacutemero total de pontos no sistema eacute

                                        26

                                        (cminus 1)times c2

                                        times e

                                        A contagem final dos pontos eacute apresentada na tabela 7 abaixo

                                        Tabela 7 ndash Resultado BCCandidatos Total de pontos

                                        A 146B 181C 126D 147

                                        O candidato eleito eacute o B com 181 pontos ou aproximadamente 60 da pontuaccedilatildeomaacutexima

                                        252 Vantagens e Desvantagens do BC

                                        Em comparaccedilatildeo com os meacutetodos abordados anteriormente que apenas consideramas primeiras opccedilotildees de cada eleitor este meacutetodo regularmente escolhe candidatos comaceitaccedilatildeo mais ampla ao inveacutes de uma preferecircncia direta dos eleitores (Electoral ReformSociety 2017b)

                                        Ele tambeacutem encoraja uma abordagem estrateacutegica por parte dos partidos onde seriade seu interesse nomear mais de um candidato para concorrer pois quanto mais candi-datos estatildeo no paacutereo maior eacute a pontuaccedilatildeo dos primeiros colocados Logo a nomeaccedilatildeo decandidatos menos populares pode beneficiar os principais candidatos de um partido

                                        253 Voto Uacutetil no BC

                                        Existem duas estrateacutegias aplicaacuteveis a esse sistema A primeira denominada compromi-sing de maneira similar a outros meacutetodos de votaccedilatildeo se resume em ranquear em primeirolugar um dos candidatos que estejam liderando as eleiccedilotildees mesmo que este natildeo seja suapreferecircncia real A segunda estrateacutegia burying eacute o oposto esta se baseia em ranquearem uacuteltimo lugar um dos candidatos liacutederes mesmo que este natildeo seja o seu candidato demaior desgosto Ambas estrateacutegias podem ser aplicadas ao mesmo tempo por um eleitor

                                        26 SCORE VOTING SYSTEM

                                        Score Voting ou Range Voting como tambeacutem eacute conhecido eacute mais um meacutetodo quetenta trazer maior liberdade de expressatildeo aos eleitores Assim como o Borda Counteste sistema funciona baseado na pontuaccedilatildeo dos candidatos no entanto ao inveacutes dessapontuaccedilatildeo ser relativa agrave posiccedilatildeo do candidato no ranking de cada eleitor este por sua veztem completa liberdade de atribuir qualquer quantidade de pontos aos candidatos dentro

                                        27

                                        de determinada escala Um eleitor pode dar o mesmo nuacutemero de pontos para diferentescandidatos e apoacutes o somatoacuterio de todas as pontuaccedilotildees o candidato com a pontuaccedilatildeo maisalta eacute eleito Incorporado ao escopo poliacutetico o SVS eacute utilizado no Partido Pirata Alematildeobem como em diversas organizaccedilotildees tais como o Fedora Project e Mozilla e tambeacutem emvariados esportes oliacutempicos e reality shows como o American Idol aponta Hamlin (2015)

                                        261 Exemplo

                                        Neste exemplo temos apresentados na tabela 8 abaixo 4 perfis distintos de eleitorese suas respectivas atribuiccedilotildees de pontos aos 4 candidatos Cada eleitor pode atribuirqualquer pontuaccedilatildeo a um candidato dentro da escala de -10 a 10 O resultado da eleiccedilatildeoapoacutes a soma de todos os pontos por candidato se encontra na tabela 9 onde o candidatoA eacute eleito com um total de 605 pontos

                                        Tabela 8 ndash Exemplo SVS

                                        Perfil A B C D Ndeg de eleitores1 10 -1 5 2 362 6 9 -3 4 253 2 0 8 4 224 3 3 3 10 17

                                        Tabela 9 ndash Resultado SVSCandidatos Total de pontos

                                        A 605B 240C 332D 430

                                        262 Vantagens e Desvantagens do SVS

                                        A grande vantagem do SVS eacute como ele proporciona aos eleitores expressar de maneiramuito proacutexima potencialmente exata suas impressotildees poliacuteticas de cada candidato Eleeacute ainda mais expressivo que o AVS Dessa maneira o spoiler effect tambeacutem se torna nuloao passo que toda intenccedilatildeo de voto eacute precisamente representada neste sistema

                                        Assim como outros meacutetodos eleitorais este sofre igualmente dos males produzidos pelovoto taacutetico Sua principal desvantagem eacute discutida na seccedilatildeo abaixo

                                        263 Voto Uacutetil no SVS

                                        Da mesma maneira que no Approval Voting atraveacutes do bullet voting o SVS tambeacutempode ser convertido em uma eleiccedilatildeo sob o meacutetodo FPTP em um cenaacuterio com um grande

                                        28

                                        volume de eleitores maliciosos O voto uacutetil sob este sistema se manifesta pontuando-seapenas um candidato com uma nota positiva e todos os outros com as notas mais baixasda escala Se todos os eleitores se aproveitarem dessa abordagem natildeo existiraacute distinccedilatildeoefetiva entre uma eleiccedilatildeo sob SVS e FPTP Essencialmente cada eleitor estaacute votando emapenas um candidato Essa eacute a principal desvantagem do SVS e ela consegue eliminarsua principal vantagem dar ao eleitor um poder maior de expressatildeo

                                        27 BLOC VOTE

                                        O Bloc Vote eacute um meacutetodo utilizado para a eleiccedilatildeo de candidatos a cargos no governocom mais de uma vacacircncia Pode ser considerado um meio-termo entre o FPTP e oAVS pois os eleitores podem votar em mais de um candidato poreacutem satildeo limitados pelonuacutemero de vagas Em uma eleiccedilatildeo com duas vagas por exemplo cada eleitor selecionaraacutedois candidatos ou menos Sensatamente o candidato mais votado eacute eleito Ele possuialgumas utilizaccedilotildees em eleiccedilotildees locais em algumas partes da Inglaterra (Electoral ReformSociety 2017a)

                                        271 Exemplo

                                        Neste exemplo dois candidatos seratildeo eleitos logo cada eleitor votaraacute em no maacuteximodois candidatos A distribuiccedilatildeo de votos pode ser conferida na tabela 10 e o resultado dacontagem de votos na tabela 11 abaixo Os candidatos eleitos satildeo o C totalizando 78do maacuteximo de votos possiacuteveis para um candidato e o A com 43

                                        Tabela 10 ndash Exemplo BV

                                        Aprovaccedilotildees Ndeg de eleitoresAC 20AB 16BC 19BD 6CA 7CD 15DC 17

                                        Tabela 11 ndash Resultado BVCandidatos Total de votos

                                        A 43B 41C 78D 38

                                        29

                                        272 Voto Uacutetil no BV

                                        Neste sistema eacute possiacutevel que um eleitor evite votar em sua primeira opccedilatildeo quandoeste natildeo tem chances de vitoacuteria e se fazendo isto ele diminuiraacute as chances de algum outrocandidato de seu desgosto ganhar Poreacutem o sistema previne um outro tipo de voto uacutetilEm eleiccedilotildees com mais de uma vaga onde os eleitores soacute podem votar em um candidatose um eleitor sabe que sua primeira opccedilatildeo tambeacutem eacute a primeira opccedilatildeo da maior parteda populaccedilatildeo e portanto muito provavelmente seraacute um dos candidatos eleitos eacute possiacutevelque ele arrisque votar em uma segunda opccedilatildeo sua na esperanccedila de a longo prazo elegersuas duas principais opccedilotildees de voto Com os eleitores podendo votar no nuacutemero exato devagas disponiacuteveis esse tipo de pensamento taacutetico perde o sentido

                                        30

                                        3 O SIMULADOR

                                        Para este trabalho foi implementado um simulador eleitoral na forma de uma aplicaccedilatildeoweb para que a interaccedilatildeo do usuaacuterio fosse facilitada Veremos a seguir como se daacute suautilizaccedilatildeo de forma geral

                                        Figura 2 ndash Captura de tela 1

                                        Figura 3 ndash Captura de tela 2

                                        A primeira opccedilatildeo encontrada pelo usuaacuterio eacute a escolha de quais sistemas de votaccedilatildeo se-ratildeo simulados (Figura 2) Todos eles podem ser selecionados para rodar simultaneamentePoreacutem natildeo eacute permitido rodar uma simulaccedilatildeo do Bloc Vote para uma eleiccedilatildeo onde apenasum candidato eacute eleito aleacutem disso natildeo existe implementaccedilatildeo dos meacutetodos TRS e IRV para

                                        31

                                        eleiccedilotildees com mais de um candidato eleito jaacute que eles se comportariam exatamente comono FPTP

                                        A maioria das linguagens de programaccedilatildeo senatildeo todas possuem um gerador de nuacuteme-ros pseudoaleatoacuterios que fornece a possibilidade de definir uma seed para o gerador Estaseed funciona como um ponto de partida para a geraccedilatildeo dos nuacutemero e portanto todasimulaccedilatildeo que rodar com a mesma seed sempre teraacute os mesmos resultados Se nenhumvalor for fornecido pelo usuaacuterio o tempo atual do sistema eacute utilizado As opccedilotildees subse-quentes satildeo a escolha do nuacutemero de eleitores gerados e o nuacutemero de vagas (Figura 3) Senenhum valor for fornecido o nuacutemero de eleitores padratildeo utilizado eacute 1000 e o nuacutemero devagas igual a 1

                                        Figura 4 ndash Captura de tela 3

                                        Este simulador possui dois modos para a criaccedilatildeo dos rankings dos eleitores No modoManipulate (Figura 4) primeiramente se define o nuacutemero de candidatos atraveacutes do campode entrada ao lado do tiacutetulo Candidates ou alternativamente pode-se adicionar candida-tos um a um atraveacutes do sinal de mais na parte inferior da paacutegina Para cada candidatoeacute possiacutevel definir a porcentagem de seus eleitores que optaraacute pelo voto taacutetico e pelovoto de minoria Tambeacutem eacute possiacutevel alterar o nome dos candidatos se for do interessedo usuaacuterio

                                        32

                                        Figura 5 ndash Captura de tela 4

                                        Figura 6 ndash Captura de tela 5

                                        33

                                        Figura 7 ndash Captura de tela 6

                                        Apoacutes a criaccedilatildeo dos candidatos o usuaacuterio pode criar perfis de eleitores que definiratildeo demaneira exata como partes da populaccedilatildeo iraacute votar (Figura 5) Em cada perfil se defineo valor em porcentos da populaccedilatildeo votante que o adotaraacute e a nota de cada candidatoTambeacutem eacute possiacutevel nomear cada perfil livremente

                                        No modo Generate (Figura 6) eacute onde o gerador de nuacutemeros pseudoaleatoacuterios eacute usadoNesse modo ao inveacutes do usuaacuterio criar perfis de eleitores ele define qual seraacute a distribuiccedilatildeoadotada para a geraccedilatildeo de notas de cada candidato Essas distribuiccedilotildees seratildeo mais bemdetalhadas no Capiacutetulo 5 Da mesma maneira que no modo Manipulate nesse modotambeacutem eacute possiacutevel definir os valores para os dois tipos de voto uacutetil os votos taacuteticos eos votos de minoria No primeiro estatildeo incluiacutedas as estrateacutegias de mudanccedila de votoespeciacuteficas de cada sistema como o bullet voting no AVS e SVS ou quando a preferecircnciade um eleitor claramente natildeo possui chances de vitoacuteria e ele muda seu voto para um doscandidatos que esteja na lideranccedila o que ocorre no FPTP e TRS O voto de minoriase apresenta apenas no FPTP em eleiccedilotildees onde mais de um candidato eacute eleito Se apreferecircncia de um eleitor claramente lidera a eleiccedilatildeo por ser tambeacutem a preferecircncia damaior parte da populaccedilatildeo esse eleitor pode mudar o seu voto para uma segunda opccedilatildeona esperanccedila de eleger dois de seus candidatos favoritos

                                        Por fim em ambos os modos o usuaacuterio tem a opccedilatildeo de definir coalizotildees entre oscandidatos se o sistema TRS estiver habilitado pois as coalizotildees apenas se manifestamnesse sistema Essas coalizotildees alteraratildeo as notas dos candidatos dependendo dos outroscandidatos pertencentes a elas (Figura 7)

                                        A aplicaccedilatildeo pode ser encontrada na paacutegina httpelectionsimpythonanywherecom

                                        34

                                        4 CENAacuteRIOS PERTINENTES

                                        Para todos os cenaacuterios deste capiacutetulo seraacute usada a seed do simulador igual a 100 e apopulaccedilatildeo de eleitores igual a 1000 para que exista consistecircncia na anaacutelise e tambeacutem paraque possa haver replicaccedilatildeo dos resultados se necessaacuterio

                                        41 CENAacuteRIO 1 VOTO TAacuteTICO

                                        Neste exemplo teremos quatro candidatos Ana Beto Carla e Diego Ana e Betoseratildeo gerados a partir da distribuiccedilatildeo Neutral (Figura 47) Carla da distribuiccedilatildeo Disliked(Figura 51) e Diego da Hated (Figura 55) Para a simulaccedilatildeo com a seed 100 o melhorcandidato a ser eleito ou seja aquele que maximiza a meacutedia das notas dos eleitores eacute oBeto com uma meacutedia de 0073 Para cada sistema seratildeo comparados os resultados semvoto taacutetico aos com 20 de voto taacutetico a favor da Ana Abaixo se encontram osresultados para o sistema FPTP

                                        Figura 8 ndash FPTP - Cenaacuterio 1 sem voto taacutetico

                                        Figura 9 ndash TRS segundo turno - Cenaacuterio 1 sem voto taacutetico

                                        35

                                        Figura 10 ndash IRV primeiro turno - Cenaacuterio 1

                                        Figura 11 ndash IRV segundo turno - Cenaacuterio 1

                                        Figura 12 ndash IRV terceiro turno - Cenaacuterio 1

                                        36

                                        Figura 13 ndash AVS - Cenaacuterio 1 sem voto taacutetico

                                        Figura 14 ndash BC - Cenaacuterio 1 sem voto taacutetico

                                        Figura 15 ndash SVS - Cenaacuterio 1 sem voto taacutetico

                                        37

                                        Nesse cenaacuterio sem voto taacutetico o uacutenico sistema que natildeo elege o Beto eacute o AVS Todosos outros elegem o melhor candidato Ou seja apesar de Beto ter uma melhor meacutediadas notas dos eleitores existem mais eleitores que ranqueiam Ana com uma nota acimade 0 No entanto apenas 20 dos eleitores de Diego e Carla que preferem a Ana aoinveacutes do Beto satildeo o suficiente para fazer Beto natildeo ser eleito se eles decidirem abandonarsua primeira opccedilatildeo e votar na Ana Considerando a vantagem que os votos taacuteticosproporcionam agrave Ana esta eacute eleita em todos os sistemas menos o TRS e o IRV

                                        Figura 16 ndash FPTP - Cenaacuterio 1 - 20 de voto taacutetico na Ana

                                        Figura 17 ndash TRS segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                        38

                                        Figura 18 ndash IRV primeiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                        Figura 19 ndash IRV segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                        Figura 20 ndash IRV terceiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                        39

                                        Figura 21 ndash AVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                                        Figura 22 ndash BC - Cenaacuterio 1 20 de voto taacutetico na Ana

                                        Figura 23 ndash SVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                                        40

                                        Eacute claro que se os eleitores que preferem o Beto tambeacutem votassem de maneira estra-teacutegica a situaccedilatildeo se equilibraria e haveria o mesmo niacutevel de concorrecircncia entre os doiscandidatos que ocorre quando natildeo haacute voto taacutetico Poreacutem no Borda Count esse equiliacute-brio pode natildeo acontecer e as estrateacutegias de compromising e burying podem acabar saindopela culatra se uma porcentagem elevada dos eleitores as adotarem Abaixo encontram-seos resultados para esse sistema quando 100 dos eleitores de Carla e Diego se comportammaliciosamente

                                        Figura 24 ndash BC - Cenaacuterio 1 100 de voto taacutetico na Ana e Beto

                                        Por causa do uso demasiado da estrateacutegia burying Ana e Beto perdem muitos pontose isso abre espaccedilo para uma vitoacuteria da Carla No entanto para porcentagens menores que100 o Beto ainda eacute o vencedor

                                        Essas duas estrateacutegias tambeacutem foram implementadas nesse simulador para o sistemaIRV e eacute possiacutevel ver como ele eacute resistente a elas Para que seja possiacutevel mudar os resultadosde uma eleiccedilatildeo sob o IRV eacute necessaacuterio mudar a ordem de eliminaccedilatildeo dos candidatos paraque o seu candidato preferido acabe enfrentando um candidato mais fraco nas rodadasfinais Isso natildeo ocorre com compromising e burying No proacuteximo cenaacuterio seraacute analisadacomo eacute possiacutevel modificar os resultados de uma eleiccedilatildeo sob o IRV

                                        Esses resultados podem ser replicados acessando os linksSem votos taacuteticos lthttpelectionsimpythonanywherecomdirect_res1111110

                                        --[0021][22Ana2222Beto222022Carla2222Diego22]------100gt

                                        Com 20 de voto taacutetico lthttpelectionsimpythonanywherecomdirect_res1111110--[0021][22Ana222022Beto2222Carla2222Diego22]1-[02000]---100gt

                                        Com 100 de voto taacuteticona Ana e Beto lthttpelectionsimpythonanywherecomdirect_res0000100--[0021][22Ana222022Beto222022Carla2222Diego22]1-[101000]---100gt

                                        41

                                        42 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV

                                        Neste cenaacuterio teremos Ana Carla e Beto concorrendo e trecircs perfis distintos que apoiamcada candidato As distribuiccedilotildees de notas dos perfis se encontram na tabela abaixo

                                        Tabela 12 ndash Distribuiccedilatildeo de notas - Cenaacuterio 2

                                        Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                        deeleitores

                                        1 10 5 0 422 0 10 5 303 5 0 10 28

                                        Com essas distribuiccedilotildees Carla eacute eliminada na primeira rodada e seus 28 de votossatildeo transferidos para a segunda opccedilatildeo de seus eleitores Ana que eacute eleita com 70 dosvotos e uma meacutedia de 56

                                        Figura 25 ndash IRV primeiro turno - Cenaacuterio 2

                                        Figura 26 ndash IRV segundo turno - Cenaacuterio 2

                                        42

                                        Cientes desse provaacutevel futuro cenaacuterio onde Ana eacute eleita uma pequena parte dos elei-tores de Beto estrategicamente o abandona e decide apoiar Carla na esperanccedila de leva-laao segundo turno contra Ana As novas distribuiccedilotildees de notas se encontram na tabelaabaixo com essa porccedilatildeo de eleitores representada pelo perfil 4

                                        Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2

                                        Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                        deeleitores

                                        1 10 5 0 422 0 10 5 283 5 0 10 284 0 8 10 2

                                        Essa mudanccedila estrateacutegica de voto altera a ordem de eliminaccedilotildees do sistema com Betosendo o primeiro a ser eliminado Com isso seus votos satildeo naturalmente transferidos paraCarla que derrota Ana no segundo turno com 58 dos votos

                                        Figura 27 ndash IRV primeiro turno com voto taacutetico - Cenaacuterio 2

                                        Figura 28 ndash IRV segundo turno com voto taacutetico - Cenaacuterio 2

                                        43

                                        Percebendo que a eleiccedilatildeo de Beto natildeo era provaacutevel seus eleitores conseguiram aomenos impedir a eleiccedilatildeo do pior candidato para eles Mas para isso foi necessaacuterio queeles tivessem a informaccedilatildeo de como os outros eleitores votariam Uma aproximaccedilatildeo dessasinformaccedilotildees poderia ser obtida em um cenaacuterio real com poucos candidatos atraveacutes depesquisas eleitorais poreacutem se o nuacutemero de candidatos eacute significativo uma noccedilatildeo completadas distribuiccedilotildees dos rankings dos eleitores se torna muito menos viaacutevel e dificulta aformulaccedilatildeo de estrateacutegias para alterar a ordem em que os candidatos satildeo eliminados

                                        Esses resultados podem ser replicados acessando os linksSem voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana22

                                        22Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                        Com voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana

                                        2222Beto2222Carla22]-----42Voter20Profile2001020520028Voter20Profile2010201020528Voter20Profile202520020102Voter20Profile20302082010100gt

                                        43 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE

                                        O interessante dos sistemas IRV e TRS eacute que os resultados do cenaacuterio anterior po-deriam ter sido obtidos ao inveacutes do voto taacutetico pela sua natildeo-monotonicidade Seriapossiacutevel que a Carla derrotasse a Ana no segundo turno atraveacutes do proacuteprio aumento depopularidade da Ana Assumindo que essa popularizaccedilatildeo ocorresse entre os candidatosdo perfil 2 onde 3 passasse a apoiar a Ana ao inveacutes do Beto as novas distribuiccedilotildeesseguiriam a tabela abaixo

                                        Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                        Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                        deeleitores

                                        1 10 5 0 452 0 10 5 273 5 0 10 28

                                        Dessa maneira Beto agora com uma porcentagem dos eleitores menor do que a deCarla seraacute eliminado na primeira rodada e como seus eleitores tecircm a Carla como segundaopccedilatildeo ela receberaacute todos os seus votos e seraacute eleita na segunda rodada As rodadas doIRV podem ser vistas nas figuras 29 e 30

                                        44

                                        Figura 29 ndash IRV primeiro turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                        Figura 30 ndash IRV segundo turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                        Tabela 15 ndash Resultados do Cenaacuterio 3Candidato

                                        eleitoMeacutedia das

                                        notasAntes da

                                        popularizaccedilatildeode Ana

                                        Ana 56

                                        Apoacutespopularizaccedilatildeo

                                        de AnaCarla 415

                                        Os efeitos dessa caracteriacutestica se refletem na satisfaccedilatildeo meacutedia da populaccedilatildeo A Ana eacuteclaramente a melhor candidata e mesmo com o seu ganho de popularidade (ou devido aele) a Carla eacute eleita

                                        Esses resultados podem ser replicados acessando os linksAntes da popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecom

                                        direct_res0010000---[22Ana2222Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                        45

                                        Apoacutes popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana2222Beto2222Carla22]-----45Voter20Profile2001020520027Voter20Profile2010201020528Voter20Profile20252002010100gt

                                        44 CENAacuteRIO 4 COALIZOtildeES

                                        O TRS por ser organizado em dois turnos separados normalmente a semanas dedistacircncia um do outro acaba abrindo brecha agrave mudanccedila de opiniatildeo por parte dos eleitorese o desenvolvimento de novas estrateacutegias por parte dos candidatos tais como a coalizatildeocom candidatos jaacute eliminados Com isso em mente nesse cenaacuterio teremos novamenteos quatro candidatos Ana Beto Carla e Diego Os trecircs primeiros seratildeo gerados dadistribuiccedilatildeo Neutral e Diego da distribuiccedilatildeo Disliked

                                        Figura 31 ndash TRS turno 1 - Cenaacuterio 4

                                        No TRS normal Ana Beto e Carla possuem com essas distribuiccedilotildees quantidades devotos muito proacuteximas com Beto e Carla indo para o segundo turno Carla estaacute 10 votosatraacutes de Beto e decide aproveitar o espaccedilo de tempo entre os dois turnos para tentaragregar mais votos Com isso Carla se aproxima de Diego e juntos formam uma coalizatildeoNo entanto com sua baixa popularidade Diego acaba ferindo a reputaccedilatildeo de Carla etorna o segundo turno muito mais faacutecil para Beto (Figura 33) Se Carla tivesse buscado osuporte de Ana por outro lado ela se veria vitoriosa no segundo turno e com uma amplavantagem sobre o Beto (Figura 34) Ou ateacute mesmo sem buscar uma coalizatildeo mesmosendo uma corrida apertada Carla teria naturalmente sido eleita (Figura 32)

                                        Esses resultados podem ser replicados acessando os linksSem coalizotildees lthttpelectionsimpythonanywherecomdirect_res0100000

                                        --[0002][22Ana222022Beto2222Carla2222Diego22]------100gt

                                        46

                                        Figura 32 ndash TRS turno 2 - Cenaacuterio 4

                                        Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4

                                        Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4

                                        47

                                        Coalizatildeo Carla e Diego lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2203Carla20Diego-100gt

                                        Coalizatildeo Carla e Ana lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2200Carla20Ana-100gt

                                        45 CENAacuteRIO 5 DILEMA DO PRISIONEIRO

                                        Neste cenaacuterio temos uma eleiccedilatildeo de uma vaga com trecircs candidatos concorrentes e trecircsperfis distintos de eleitores que seguiratildeo as seguintes distribuiccedilotildees

                                        Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5

                                        Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                        deeleitores

                                        1 10 -10 5 362 -10 10 5 343 -10 -10 5 30

                                        Esse contexto nos remete ao notaacutevel dilema do prisioneiro Nele dois prisioneiroscuacutemplices satildeo interrogados individualmente sem poder se comunicar um com o outro ecada um enfrenta o dilema de delatar ou natildeo o seu parceiro Se os dois prisioneirosdecidem se manter calados sobre o crime ambos satildeo sentenciados a um ano de prisatildeo Seapenas um deles dedurar o outro o traidor sai livre enquanto seu parceiro eacute condenadoa trecircs anos Se ambos dedurarem um ao outro eles satildeo condenados juntos a dois anosde prisatildeo Esse dilema eacute uma ideia claacutessica presente no estudo da teoria dos jogos sendooriginalmente elaborada por Merrill Flood e Melvin Dresher em 1950 e mais tarde sendonomeada de dilema dos prisioneiros por Albert W Tucker (POUNDSTONE 1992)

                                        O que esse dilema nos mostra eacute a tentaccedilatildeo que o indiviacuteduo deteacutem se sua racionalizaccedilatildeoestiver voltada para seus proacuteprios interesses e somente eles em oposiccedilatildeo a pensar no bemdo grupo como um todo Neste cenaacuterio encontramos dois grupos de eleitores expressiva-mente opostos os perfis 1 e 2 Se qualquer uma das preferecircncias desses perfis fosse eleitaisso significaria uma alta rejeiccedilatildeo de maior parte da populaccedilatildeo No entanto eles possuema segunda opccedilatildeo em comum a Carla que por sua vez eacute a preferecircncia do terceiro perfilPortanto a eleiccedilatildeo da Carla seria logicamente o resultado oacutetimo

                                        Mesmo assim a Ana eacute eleita nos dois sistemas acima o que natildeo parece justo poispela tabela 16 eacute evidente que apenas 36 da populaccedilatildeo a aprova enquanto que os outros64 a reprovam ao maacuteximo O sistema IRV se comporta de maneira idecircntica ao TRS

                                        48

                                        Figura 35 ndash FPTP - Cenaacuterio 5

                                        Figura 36 ndash TRS segundo turno - Cenaacuterio 5

                                        nesta situaccedilatildeo Com esse resultado a meacutedia das notas eacute -28 No entanto os trecircs sistemasseguintes nos apresentam resultados diferentes

                                        Tabela 17 ndash Resultados do Cenaacuterio 5

                                        Sistema Candidatoeleito

                                        Meacutedia dasnotas

                                        FPTP Ana -28TRS Ana -28IRV Ana -28AVS Carla 50BC Carla 50SVS Carla 50

                                        49

                                        Figura 37 ndash AVS - Cenaacuterio 5

                                        Figura 38 ndash BC - Cenaacuterio 5

                                        Tanto o AVS quanto o Borda Count e o SVS satildeo sistemas que consideram todasas opiniotildees de cada eleitor ao mesmo tempo e por isso satildeo capazes de eleger o melhorcandidato nesta situaccedilatildeo diferentemente do TRS que natildeo absorve completamente todosentimento do eleitor por todos os candidatos e o IRV que apesar de ser bem expressivoquebra esse processo em inuacutemeras rodadas o que permite a perda de informaccedilatildeo ao longodelas

                                        Esses resultados podem ser replicados acessando o linklthttpelectionsimpythonanywherecomdirect_res1111110---[22Ana

                                        222022Beto222022Carla22]-----36Voter20Profile2001020-1020534Voter20Profile201-10201020530Voter20Profile202-1020-10205100gt

                                        50

                                        Figura 39 ndash SVS - Cenaacuterio 5

                                        46 CENAacuteRIO 6 VOTO DE MINORIA

                                        Neste cenaacuterio temos uma eleiccedilatildeo com quatro candidatos e duas vagas A Ana seraacutea preferecircncia de uma extensa parte da populaccedilatildeo (distribuiccedilatildeo Loved Figura 53) Betoe Carla seratildeo candidatos razoavelmente populares (distribuiccedilatildeo Neutral Figura 47) eDiego seraacute a preferecircncia de apenas um pequeno grupo especiacutefico e rejeitado pela maioria(distribuiccedilatildeo Disliked Figura 51) Eacute intuitivo esperar que os dois candidatos eleitos seratildeoa Ana e ou o Beto ou a Carla e isso eacute exatamente o que ocorre na figura 40 no sistemaFPTP sem voto de minoria

                                        Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria

                                        Eacute evidente a discrepacircncia da quantidade de votos da Ana para os outros candidatose apesar de Beto e Carla serem mais populares que Diego os trecircs natildeo se encontrammuito afastados Poreacutem se a pequena fraccedilatildeo de candidatos que possuem a Ana como

                                        51

                                        Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego

                                        preferecircncia e Diego como segunda opccedilatildeo optarem pelo voto de minoria a situaccedilatildeo mudacompletamente (Figura 41) Assim apesar de extensamente rejeitado Diego conquistaa segunda vaga e a meacutedia das notas despenca de 2929 para 0505 No entanto aindaexiste um cenaacuterio pior Se os outros grupos de eleitores pensarem da mesma forma eevitarem votar na Ana achando que sua eleiccedilatildeo jaacute estaacute assegurada apenas 80 de votode minoria para esses grupos jaacute eacute o suficiente para eliminaacute-la das eleiccedilotildees (Figura 42)Com a Ana eliminada a meacutedia das notas cai ainda mais para 0058

                                        Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego

                                        O sistema Bloc Vote eacute uma das soluccedilotildees para o voto de minoria Permitindo queos eleitores votem no mesmo nuacutemero de candidatos que de vagas a serem preenchidasnatildeo existe o iacutempeto a esse tipo de voto estrateacutegico O resultado desse sistema portantoretorna a meacutedia das notas a casa dos 29 (Figura 43) Os sistemas AVS Borda Count eSVS tambeacutem impedem a presenccedila do voto de minoria e atingem resultados semelhantes

                                        52

                                        Figura 43 ndash BV - Cenaacuterio 6

                                        Tabela 18 ndash Resultados do Cenaacuterio 6

                                        Sistema Candidatoseleitos

                                        Meacutedia dasnotas

                                        FPTP sem voto de minoriaAna eBeto 2929

                                        FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

                                        FPTP com 80 de voto de minoriaBeto eCarla 0058

                                        Bloc VoteAna eCarla 2913

                                        Esses resultados podem ser replicados acessando os links

                                        Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

                                        100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

                                        80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

                                        53

                                        5 COMO FUNCIONA O SIMULADOR

                                        O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

                                        51 CLASSE ELECTIONS

                                        Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

                                        bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

                                        Figura 44 ndash estrutura candidates

                                        bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

                                        bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

                                        Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

                                        Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

                                        54

                                        Figura 45 ndash estrutura voters

                                        Figura 46 ndash estrutura votes

                                        daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

                                        Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

                                        55

                                        Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

                                        Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

                                        na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

                                        56

                                        Figura 49 ndash PDF - Distribuiccedilatildeo Liked

                                        Figura 50 ndash CDF - Distribuiccedilatildeo Liked

                                        (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

                                        Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

                                        57

                                        Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

                                        Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

                                        candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

                                        Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

                                        58

                                        Figura 53 ndash PDF - Distribuiccedilatildeo Loved

                                        Figura 54 ndash CDF - Distribuiccedilatildeo Loved

                                        funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

                                        59

                                        Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                                        Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                                        Meacutedia das Notas sumei

                                        sumvj nij

                                        etimes v

                                        Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                                        Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                                        60

                                        Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                                        Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                                        52 CLASSE FIRSTPASTTHEPOST

                                        Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                                        Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                                        61

                                        Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                                        Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                                        mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                                        62

                                        53 CLASSE TWOROUNDSYSTEM

                                        A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                                        54 CLASSE INSTANTRUNOFFVOTING

                                        A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                                        Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                                        63

                                        cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                                        55 CLASSE APPROVALVOTING

                                        Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                                        56 CLASSE BORDACOUNT

                                        Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                                        57 CLASSE SCOREVOTING

                                        De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                                        64

                                        58 CLASSE BLOCVOTE

                                        O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                                        59 TECNOLOGIAS UTILIZADAS

                                        A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                                        Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                                        O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                                        Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                                        65

                                        6 CONCLUSAtildeO

                                        Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                                        Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                                        Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                                        Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                                        Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                                        66

                                        REFEREcircNCIAS

                                        AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                                        Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                                        Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                                        Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                                        HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                                        LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                                        ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                                        Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                                        POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                                        The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                                        67

                                        APEcircNDICES

                                        APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                        Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                        if(not len(selfvoter_profiles))

                                        for voter in range(selfN_VOTERS)

                                        candidates_rank = dict()

                                        for candidate in reversed(range(selfN_CANDIDATES))

                                        if(selfBIAS_VECTOR[candidate]==4)

                                        candidates_rank[candidate] = self_sortear(selfloved)

                                        elif(selfBIAS_VECTOR[candidate]==3)

                                        candidates_rank[candidate] = self_sortear(selfliked)

                                        elif(selfBIAS_VECTOR[candidate]==2)

                                        candidates_rank[candidate] = self_sortear(selfdisliked)

                                        elif(selfBIAS_VECTOR[candidate]==1)

                                        candidates_rank[candidate] = self_sortear(selfhated)

                                        elif(selfBIAS_VECTOR[candidate]==-1)

                                        candidates_rank[candidate] = self_sortear(selfpolarizer

                                        )

                                        elif(selfBIAS_VECTOR[candidate]==-2)

                                        candidates_rank[candidate] = self_sortear(self

                                        more_polarizer)

                                        else

                                        candidates_rank[candidate] = self_sortear(selfneutral)

                                        selfvotersappend(candidates_rank)

                                        else

                                        ranges = []

                                        ranks = []

                                        for prof in selfvoter_profiles

                                        rangesappend(int(prof[pop_percentage]))

                                        rank =

                                        for index score in enumerate(prof[scores])

                                        rank[index] = score

                                        ranksappend(rank)

                                        for index _range in enumerate(ranges)

                                        for _ in range(int(selfN_VOTERS(_range100)))

                                        selfvotersappend(ranks[index])

                                        68

                                        APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                        Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                        for i in range(selfN_CANDIDATES)

                                        selfcandidates[i] = 0

                                        selfvotes[i] = set()

                                        APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                        Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                        for candidate in range(selfN_CANDIDATES)

                                        rating_sum = 0

                                        for voter in selfvoters

                                        rating_sum += voter[candidate]

                                        selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                        APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                        Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                        if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                        return selfcalculate_mean(winners)

                                        else

                                        chose_best = True if winners[0] == selfbest_candidate else

                                        False

                                        return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                        69

                                        APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                        Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                        rating_sum = 0

                                        for voter in selfvoters

                                        for candidate in winners

                                        rating_sum += voter[candidate]

                                        return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                        APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                        Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                        for i in range(1 selfN_VACANCIES + 2)

                                        selfleading_candidatesappend(selfsorted_candidates[-i][self

                                        CANDIDATE_INDEX])

                                        APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                        Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                        for leader in selfelecrounds[-1]

                                        selfleading_candidatesappend(leader[0])

                                        70

                                        APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                        Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                        self_account_for_coalitions()

                                        for voter in selfvoters

                                        selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                        (1)))

                                        temp = []

                                        for voter in selfsorted_voters

                                        new_dict = defaultdict(list)

                                        for k in voter

                                        new_dict[k[1]]append(k[0])

                                        tempappend(new_dict)

                                        selfsorted_voters = []

                                        for voter_index current_voter in enumerate(temp)

                                        new_voter = []

                                        for rating candidate_indexes in current_voteritems()

                                        if len(current_voter[rating]) gt 1

                                        shuffle(current_voter[rating])

                                        for e in candidate_indexes

                                        new_voterappend((e rating))

                                        else

                                        new_voterappend((candidate_indexes[0] rating))

                                        selfsorted_votersappend(new_voter)

                                        selfcandidates[new_voter[-1][0]] += 1

                                        selfvotes[new_voter[-1][0]]add(voter_index)

                                        71

                                        APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                        Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                        for candidate in selfvotes_copy

                                        if candidate not in selfelecleading_candidates

                                        for voter_index in selfvotes_copy[candidate]

                                        for index _candidate in enumerate(reversed(selfelec

                                        sorted_voters[voter_index]))

                                        if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                        leading_candidates

                                        if randomrandom() lt selfelec

                                        tactical_vote_percentages[_candidate[selfelec

                                        CANDIDATE_INDEX]]

                                        selfrankings_changed[voter_index] = copy

                                        deepcopy(selfelecsorted_voters[voter_index])

                                        selfrankings_changed[voter_index][-(index + 1)]

                                        selfrankings_changed[voter_index][-1] = self

                                        rankings_changed[voter_index][-1] self

                                        rankings_changed[voter_index][-(index + 1)]

                                        selfcandidates[candidate] -= 1

                                        selfcandidates[_candidate[selfelec

                                        CANDIDATE_INDEX]] += 1

                                        selfvotes[candidate]remove(voter_index)

                                        selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                        ]]add(voter_index)

                                        break

                                        break

                                        72

                                        APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                        Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                        half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                        for candidate in selfelecleading_candidates

                                        if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                        continue

                                        for voter_index in selfvotes_copy[candidate]

                                        if voter_index in selfrankings_changed

                                        ranking = selfrankings_changed[voter_index]

                                        else

                                        ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                        ])

                                        for index _candidate in enumerate(reversed(ranking))

                                        if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                        leading_candidates or (_candidate[selfelec

                                        CANDIDATE_INDEX] in selfelecleading_candidates and

                                        selfelecleading_candidatesindex(_candidate[selfelec

                                        CANDIDATE_INDEX]) gt= half_vacancies)

                                        if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                        if randomrandom() lt selfelec

                                        minority_vote_percentages[_candidate[selfelec

                                        CANDIDATE_INDEX]]

                                        selfcandidates[candidate] -= 1

                                        selfcandidates[_candidate[selfelec

                                        CANDIDATE_INDEX]] += 1

                                        break

                                        break

                                        break

                                        73

                                        APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                        Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                        self_account_for_coalitions()

                                        for candidate in selfvotes

                                        if candidate = selfwinner and candidate = selfsecond_place

                                        for voter_index in selfvotes[candidate]

                                        if voter_index in selfrankings_changed

                                        ranking = selfrankings_changed[voter_index]

                                        else

                                        ranking = copydeepcopy(selfelecsorted_voters[

                                        voter_index])

                                        for index2 candidate in enumerate(reversed(ranking))

                                        if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                        selfcandidates[selfwinner] += 1

                                        selfvotes[selfwinner]add(voter_index)

                                        break

                                        elif candidate[selfelecCANDIDATE_INDEX] == self

                                        second_place

                                        selfcandidates[selfsecond_place] += 1

                                        selfvotes[selfsecond_place]add(voter_index)

                                        break

                                        selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                        winners = []

                                        vacancies = selfelecN_VACANCIES

                                        for candidate in reversed(selfsorted_candidates)

                                        if vacancies == 0

                                        break

                                        winnersappend(candidate[0])

                                        vacancies -= 1

                                        mean chose_best = selfelecget_mean(winners = winners)

                                        74

                                        APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                        Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                        for voter_index voter in enumerate(selfelecsorted_voters)

                                        voter_dict = dict()

                                        og_voter_dict = dict()

                                        for tup in voter

                                        voter_dict[tup[0]] = tup[1]

                                        og_voter_dict[tup[0]] = tup[1]

                                        for coalition in selfeleccoalitions

                                        for candidate in coalition

                                        add_to_score = 0

                                        for candidate2 in coalition

                                        if candidate == candidate2

                                        continue

                                        half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                        if half lt 0

                                        add_to_score += mathceil(half)

                                        else

                                        add_to_score += mathfloor(half)

                                        if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                        voter_dict[candidate[rsquovaluersquo]] = 10

                                        elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                        voter_dict[candidate[rsquovaluersquo]] = -10

                                        else

                                        voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                        selfrankings_changed[voter_index] = []

                                        for candidate in voter_dict

                                        selfrankings_changed[voter_index]append((candidate voter_dict[

                                        candidate]))

                                        selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                        voter_index] key=lambda x x[1])

                                        75

                                        APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                        Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                        selfelecroundsappend(selfsorted_candidates[_round])

                                        if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                        N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                        N_VACANCIES - 1)

                                        return 2

                                        elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                        N_VOTERS gt 05)

                                        return 1

                                        else

                                        selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                        CANDIDATE_INDEX])

                                        for voter_index in selfvotes[selfsorted_candidates[_round][self

                                        elecCANDIDATE_INDEX]]

                                        if voter_index in selfrankings_changed

                                        for candidate in reversed(selfrankings_changed[voter_index

                                        ])

                                        if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                        excluded

                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                        ]] += 1

                                        selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                        add(voter_index)

                                        break

                                        else

                                        continue

                                        else

                                        for candidate in reversed(selfelecsorted_voters[

                                        voter_index])

                                        if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                        excluded

                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                        ]] += 1

                                        selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                        add(voter_index)

                                        break

                                        else

                                        continue

                                        selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                        return 0

                                        76

                                        APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                        Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                        for index in range(selfelecN_CANDIDATES)

                                        selfcandidates[index] = 0

                                        for voter in selfelecsorted_voters

                                        for candidate in reversed(voter)

                                        if candidate[selfelecCANDIDATE_SCORE] gt 0

                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                        else

                                        break

                                        APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                        Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                        for index in range(selfelecN_CANDIDATES)

                                        selfcandidates[index] = 0

                                        for voter in selfelecsorted_voters

                                        if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                        elecCANDIDATE_INDEX]]

                                        selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                        else

                                        for candidate in reversed(voter)

                                        if candidate[selfelecCANDIDATE_SCORE] gt 0

                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                        else

                                        break

                                        77

                                        APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                        Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                        pos = set()

                                        for index perc in enumerate(selfelectactical_vote_percentages)

                                        if perc gt 0

                                        posadd(index)

                                        for candidate in selfeleccandidates

                                        if candidate not in selfleading_candidates

                                        for voter_index in selfvotes[candidate]

                                        raised = None

                                        for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                        ])

                                        if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                        leading_candidates

                                        if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                        if randomrandom() lt selfelectactical_vote_percentages[

                                        candidate_tuple[selfelecCANDIDATE_INDEX]]

                                        ranking = [None]selfelecN_CANDIDATES

                                        ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                        selfelecvoters[voter_index][candidate_tuple[selfelec

                                        CANDIDATE_INDEX]])

                                        raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                        break

                                        break

                                        break

                                        if raised = None

                                        for _candidate in selfleading_candidates

                                        if _candidate = ranking[-1][0]

                                        ranking[0] = (_candidate selfelecvoters[voter_index][

                                        _candidate])

                                        buried = _candidate

                                        break

                                        i = 1

                                        for candidate_tuple in selfelecsorted_voters[voter_index]

                                        if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                        buried]

                                        continue

                                        else

                                        ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                        selfelecvoters[voter_index][candidate_tuple[selfelec

                                        CANDIDATE_INDEX]])

                                        i += 1

                                        selfrankings_changed[voter_index] = ranking

                                        78

                                        APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                        Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                        for voter_index in selfvotes[candidate]

                                        if randomrandom() lt selfelectactical_vote_percentages[candidate

                                        ]

                                        for _candidate in selfleading_candidates

                                        if _candidate = candidate

                                        ranking = [None]selfelecN_CANDIDATES

                                        ranking[0] = (_candidate selfelecvoters[voter_index][

                                        _candidate])

                                        buried = _candidate

                                        break

                                        i = 1

                                        for candidate_tuple in selfelecsorted_voters[voter_index]

                                        if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                        continue

                                        else

                                        ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                        selfelecvoters[voter_index][candidate_tuple[selfelec

                                        CANDIDATE_INDEX]])

                                        i += 1

                                        selfrankings_changed[voter_index] = ranking

                                        79

                                        APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                        Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                        for index in range(selfelecN_CANDIDATES)

                                        selfcandidates[index] = 0

                                        for voter_index voter in enumerate(selfelecsorted_voters)

                                        score = 0

                                        if voter_index in selfrankings_changed

                                        for candidate in selfrankings_changed[voter_index]

                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                        score += 1

                                        else

                                        for candidate in voter

                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                        score += 1

                                        APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                        Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                        for voter_index voter in enumerate(selfelecsorted_voters)

                                        if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                        elecCANDIDATE_INDEX]]

                                        selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                        sorted_voters[voter_index])

                                        for candidate_index candidate in enumerate(reversed(voter))

                                        if candidate_index == 0

                                        selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                        voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                        else

                                        selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                        voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                        80

                                        APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                        Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                        for index in range(selfelecN_CANDIDATES)

                                        selfcandidates[index] = 0

                                        for voter_index voter in enumerate(selfelecsorted_voters)

                                        if voter_index in selfrankings_changed

                                        for candidate in selfrankings_changed[voter_index]

                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                        selfelecCANDIDATE_RANK]

                                        else

                                        for candidate in voter

                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                        selfelecCANDIDATE_RANK]

                                        APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                        Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                        for index in range(selfelecN_CANDIDATES)

                                        selfcandidates[index] = 0

                                        for voter in selfelecsorted_voters

                                        votes = selfelecN_VACANCIES

                                        for candidate in reversed(voter)

                                        if votes == 0

                                        break

                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                        votes -= 1

                                        • Folha de aprovaccedilatildeo
                                        • Agradecimentos
                                        • Epiacutegrafe
                                        • Resumo
                                        • Abstract
                                        • Lista de ilustraccedilotildees
                                        • Lista de Coacutedigos
                                        • Lista de tabelas
                                        • Lista de abreviaturas e siglas
                                        • Sumaacuterio
                                        • INTRODUCcedilAtildeO
                                          • MOTIVACcedilAtildeO E OBJETIVO
                                          • MEacuteTODO
                                          • ESTRUTURA
                                            • SISTEMAS ELEITORAIS
                                              • FISRT PAST THE POST
                                                • Exemplo
                                                • Vantagens e Desvantagens do FPTP
                                                • Voto Uacutetil no FPTP
                                                  • TWO-ROUND SYSTEM
                                                    • Exemplo
                                                    • Vantagens e Desvantagens do TRS
                                                    • Voto Uacutetil no TRS
                                                      • INSTANT-RUNOFF VOTING
                                                        • Exemplo
                                                        • Vantagens e Desvantagens do IRV
                                                        • Voto Uacutetil no IRV
                                                          • APPROVAL VOTING SYSTEM
                                                            • Exemplo
                                                            • Vantagens e Desvantagens do AVS
                                                            • Voto Uacutetil no AVS
                                                              • THE BORDA COUNT
                                                                • Exemplo
                                                                • Vantagens e Desvantagens do BC
                                                                • Voto Uacutetil no BC
                                                                  • SCORE VOTING SYSTEM
                                                                    • Exemplo
                                                                    • Vantagens e Desvantagens do SVS
                                                                    • Voto Uacutetil no SVS
                                                                      • BLOC VOTE
                                                                        • Exemplo
                                                                        • Voto Uacutetil no BV
                                                                            • O SIMULADOR
                                                                            • CENAacuteRIOS PERTINENTES
                                                                              • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                              • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                              • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                              • CENAacuteRIO 4 COALIZOtildeES
                                                                              • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                              • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                • COMO FUNCIONA O SIMULADOR
                                                                                  • CLASSE Elections
                                                                                  • CLASSE FirstPastThePost
                                                                                  • CLASSE TwoRoundSystem
                                                                                  • CLASSE InstantRunoffVoting
                                                                                  • CLASSE ApprovalVoting
                                                                                  • CLASSE BordaCount
                                                                                  • CLASSE ScoreVoting
                                                                                  • CLASSE BlocVote
                                                                                  • TECNOLOGIAS UTILIZADAS
                                                                                    • CONCLUSAtildeO
                                                                                    • Referecircncias
                                                                                    • Meacutetodo create_voters
                                                                                    • Meacutetodo create_candidates
                                                                                    • Meacutetodo calculate_means
                                                                                    • Meacutetodo get_mean
                                                                                    • Meacutetodo calculate_mean
                                                                                    • Meacutetodo set_leading_candidates
                                                                                    • Meacutetodo irv_set_leading_candidates
                                                                                    • Meacutetodo sort_ranks
                                                                                    • Meacutetodo fptp_count_tactical_votes
                                                                                    • Meacutetodo fptp_count_minority_votes
                                                                                    • Meacutetodo trs_second_round
                                                                                    • Meacutetodo trs_account_for_coalitions
                                                                                    • Meacutetodo irv_count_votes
                                                                                    • Meacutetodo avs_count_votes
                                                                                    • Meacutetodo avs_count_votes_with_tactical
                                                                                    • Meacutetodo irv_apply_tactical_votes
                                                                                    • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                    • Meacutetodo bc_sum_candidates_scores
                                                                                    • Meacutetodo svs_apply_tactical_votes
                                                                                    • Meacutetodo svs_sum_candidates_scores
                                                                                    • Meacutetodo bv_count_votes

                                          21

                                          terceiro candidato C pode ser vitorioso sobre A no segundo turno caso os eleitores de Bprefiram C ao candidato A Se natildeo houvesse esse crescimento de popularidade A teriaderrotado B no segundo turno Essa situaccedilatildeo seraacute vista em melhores detalhes na seccedilatildeo 43

                                          223 Voto Uacutetil no TRS

                                          Esse sistema minimiza os efeitos do voto uacutetil em relaccedilatildeo ao FPTP pois um eleitorqualquer pode tranquilamente votar em sua preferecircncia sem se preocupar em desperdiccedilaacute-lo mesmo que seu candidato natildeo tenha chances de vitoacuteria Se este natildeo for eleito aindapoderaacute escolher a sua preferecircncia dentre os dois candidatos que prosseguirem para osegundo turno

                                          Apesar disso ainda existe um cenaacuterio em que o eleitor pode ser tentado a natildeo votar emsua preferecircncia Eacute possiacutevel que ele opte pela sua segunda opccedilatildeo se souber que sua primeiraopccedilatildeo possui miacutenimas chances de ir ao segundo turno ou ateacute mesmo por saber que issodiminuiraacute as chances de algum outro candidato ser eleito Mesmo assim eacute evidente queo TRS natildeo proporciona o mesmo apelo ao voto taacutetico que o FPTP

                                          Outra caracteriacutestica do TRS eacute o incentivo a formaccedilatildeo de coalizotildees entre candidatosde partidos mais populares com candidatos de partidos menos populares As coalizotildeesfornecem benefiacutecios agrave ambas as partes onde os candidatos classificados para o segundoturno em geral se juntam a candidatos jaacute eliminados com a intenccedilatildeo de agregar maisvotos enquanto os candidatos jaacute eliminados apoiam um dos dois classificados na esperanccedilade inserir propostas proacuteprias ou modificaccedilotildees agrave chapa deles

                                          23 INSTANT-RUNOFF VOTING

                                          Instant Runoff Voting foi uma alternativa aos meacutetodos FPTP e TRS desenvolvidanos anos 70 por um professor do Instituto de Tecnologia de Massachusetts(MIT) O IRVelimina as principais desvantagens desses outros dois sistemas a pluralidade do FPTP e anecessidade de mais de uma rodada de votaccedilatildeo do TRS Este meacutetodo tambeacutem opera emmais de uma rodada poreacutem como o proacuteprio nome sugere essas rodadas satildeo instantacircneasnatildeo sendo necessaacuterio o retorno dos eleitores agraves urnas Atualmente ele eacute utilizado naIrlanda nas eleiccedilotildees presidenciais em Londres na eleiccedilatildeo de seu prefeito e em distritosindividuais na Austraacutelia para eleger membros de sua cacircmara baixa do parlamento OIRV tambeacutem eacute usado por vaacuterias organizaccedilotildees privadas nos Estados Unidos incluindoa American Political Science Association e a American Psychological Association paraeleger seus funcionaacuterios

                                          Nesse sistema os eleitores natildeo satildeo solicitados a votar em um uacutenico candidato aoinveacutes disso eles listam todos os candidatos concorrentes na ordem de sua preferecircnciaA partir dessas listas as primeiras opccedilotildees de cada eleitor recebem o seu voto e apoacutes acontagem se um candidato obtiver 50 dos votos mais um este candidato eacute eleito Se

                                          22

                                          isso natildeo ocorrer o candidato menos votado eacute eliminado das eleiccedilotildees e seus votos satildeotransferidos para a segunda opccedilatildeo de cada um de seus eleitores Esse procedimento serepete eliminando o candidato menos votado a cada rodada ateacute que algum dos candidatospossuam a maioridade dos votos

                                          231 Exemplo

                                          Na tabela 3 pode-se verificar a distribuiccedilatildeo de votos por perfil de eleitor e na tabela4 vecirc-se o desenvolvimento do IRV para essas distribuiccedilotildees O candidato D eacute o menosvotado e por consequecircncia eacute o primeiro a ser eliminado A segunda opccedilatildeo de todos oseleitores que votaram no candidato D eacute o candidato C por isso este recebe todos os votosdistribuiacutedos na segunda rodada Com isso o candidato B eacute eliminado com 25 dos votos eos candidatos A e C concorrem na uacuteltima rodada Mesmo com o candidato C na lideranccedilana segunda rodada a maior parte dos eleitores do B tem como preferecircncia o candidatoA por isso A eacute eleito com 55 dos votos contra 45 do C

                                          Tabela 3 ndash Exemplo IRV

                                          Rankings Ndeg de eleitoresABCD 20ABDC 16BDAC 19BDCA 6CABD 7CDBA 15DCAB 5DCBA 12

                                          Tabela 4 ndash Desenvolvimento do IRVTurnos D C B A

                                          1 17 22 25 362 eliminado 39 25 363 eliminado 45 eliminado 55

                                          232 Vantagens e Desvantagens do IRV

                                          Assim como no TRS a pluralidade eacute irrelevante no IRV e um candidato soacute eacute eleitocom a maioridade dos votos dando maior legitimidade ao mandato deste No entantopode-se argumentar que o IRV faz isso com mais eficiecircncia pois natildeo requer a execuccedilatildeode mais de uma rodada de votaccedilotildees Isso diminui os custos das eleiccedilotildees como um todoao mesmo tempo que proporciona um nuacutemero menor de isenccedilotildees por parte dos eleitoresdevido ao desgaste de todo o processo eleitoral

                                          23

                                          Aleacutem disso candidatos de partidos menores tendem a receber mais votos do queno FPTP e portanto satildeo mais encorajados a se candidatar Com uma lista maior decandidatos eleitores desfrutam de uma variedade maior de opccedilotildees de voto Contudomesmo com mais candidatos menos populares o spoiler effect mencionado anteriormentetambeacutem natildeo possui espaccedilo nesse sistema de votaccedilatildeo Partidos menores natildeo tem comoroubar votos de partidos maiores visto que esses votos eventualmente seratildeo transferidosde volta a eles durante o desenvolvimento das rodadas do IRV

                                          Em virtude de sua estrutura acredita-se que esse meacutetodo tende a encorajar os can-didatos tambeacutem a elaborar suas campanhas de forma mais abrangente ampliando suainfluecircncia para mais do que apenas um grupo especiacutefico de maneira que ele consiga agre-gar votos de segunda ou terceira opccedilatildeo aleacutem dos votos de seus eleitores principais

                                          A principal desvantagem do IRV eacute o fato de ele ainda natildeo ser amplamente utilizado aoredor do mundo Essa falta de familiaridade do sistema pode causar confusatildeo ao eleitorcomum em suas primeiras ocorrecircncias No entanto nos paiacuteses em que este eacute utilizadonatildeo parece haver confusatildeo entre os eleitores Aleacutem disso na maioria dos casos haveraacute umcusto potencialmente alto da substituiccedilatildeo ou alteraccedilatildeo dos sistemas das urnas eletrocircnicaspara que seja possiacutevel haver a implementaccedilatildeo do meacutetodo

                                          Aleacutem disso assim como o TRS este sistema tambeacutem possui natildeo-monotonicidade ouseja um candidato pode ser prejudicado ao ser ranqueado mais alto enquanto que outropode se beneficiar sendo ranqueado mais baixo pelos eleitores (ORNSTEIN 2018) issopode ocorrer quando esse ranqueamento causa alteraccedilotildees na ordem em que os candidatossatildeo eliminados Essa caracteriacutestica se manifesta em fenocircmenos complexos e especiacuteficos epor isso um exemplo de sua ocorrecircncia seraacute abordada em detalhes na seccedilatildeo 43

                                          233 Voto Uacutetil no IRV

                                          Como os sistemas de votaccedilatildeo anteriores o IRV natildeo eacute completamente imune ao vototaacutetico No entanto este meacutetodo se mostra bem resistente a eles quando comparado aoutros meacutetodos como o FPTP e o Borda Count (Bartholdi John J III and Orlin JamesB 1990) Distintivamente o IRV requer um maior esforccedilo do eleitor para elaborar umaestrateacutegia que melhor ajuste os resultados da eleiccedilatildeo de acordo com a sua preferecircnciaAleacutem disso eacute necessaacuterio que ele tenha informaccedilatildeo suficiente sobre os rankings de outroseleitores naturalmente obtida atraveacutes de pesquisas eleitorais

                                          Existe tambeacutem a possibilidade de ocorrer uma exaustatildeo dos votos quando natildeo haacuteo completo preenchimento do ranking por parte dos eleitores Nessas ocasiotildees o votonatildeo pode continuar a ser transferido a outros candidatos e ele eacute descartado Isso afetaa legitimidade do mandato do candidato eleito pois o resultado final natildeo representaraacute100 da populaccedilatildeo votante Essas ocorrecircncias no entanto podem ser minimizadas comuma melhor educaccedilatildeo eleitoral ou como foi implementado na Austraacutelia requerer que osrankings incluam uma totalidade dos candidatos concorrentes

                                          24

                                          24 APPROVAL VOTING SYSTEM

                                          No meacutetodo Approval Voting os eleitores natildeo satildeo limitados pelo nuacutemero de candidatosem que podem votar por isso approval cada eleitor pode votar em todos os candidatos osquais ele aprova Apoacutes as votaccedilotildees o candidato com a maior quantidade de votos eacute eleitoSegundo Hamlin (2015) a cidade de Fargo na Dakota do Norte se tornou a primeiracidade nos EUA a colocar em praacutetica este sistema em suas eleiccedilotildees gerais em novembrode 2018 AVS tambeacutem eacute utilizado para eleger o secretaacuterio-geral das Naccedilotildees Unidas e emdiversas outras organizaccedilotildees

                                          241 Exemplo

                                          Na tabela 5 abaixo pode-se encontrar 8 perfis de eleitores com seus candidatos apro-vados e quantidade de eleitores que se encaixam no perfil Na tabela 6 temos o resultadoda contabilizaccedilatildeo dos votos destes perfis O candidato mais popular eacute o B que se encontraaprovado em 5 perfis distintos totalizando 60 votos ou aproximadamente 32

                                          Tabela 5 ndash Exemplo AVS

                                          Aprovaccedilotildees Ndeg de eleitoresA 20AB 16B 19

                                          BDC 6CAB 7CD 15DC 5DCB 12

                                          Tabela 6 ndash Resultado AVSCandidatos Total de votos

                                          A 43B 60C 45D 38

                                          242 Vantagens e Desvantagens do AVS

                                          Aleacutem de simples este meacutetodo permite um niacutevel maior de expressividade aos eleitoresOnde no FPTP e TRS eles satildeo limitados pelo seu uacutenico voto aqui os eleitores tecircm aliberdade de demonstrar exatamente quais candidatos consideram aptos ou aceitaacuteveis aocargo

                                          25

                                          Outro efeito dessa liberdade trazida pelo AVS eacute a dizimaccedilatildeo do spoiler effect Can-didatos de partidos menores natildeo tem como roubar votos de partidos maiores nessesistema ambos os candidatos contabilizariam o voto

                                          243 Voto Uacutetil no AVS

                                          O tipo de voto uacutetil no AVS eacute denominado bullet voting Segundo The Center forElection Science (2015) esta taacutetica envolve simplesmente ignorar a possibilidade de votarem mais de um candidato e votar apenas em sua primeira opccedilatildeo Um eleitor pode serlevado a adotar essa estrateacutegia quando percebe que sua preferecircncia pode ser prejudicadacom o voto em alguma segunda opccedilatildeo sua Em um cenaacuterio extremo onde 100 doseleitores adotam esta estrateacutegia as eleiccedilotildees satildeo convertidas a um simples First Past ThePost

                                          25 THE BORDA COUNT

                                          Este meacutetodo carrega o nome em homenagem a seu criador Jean-Charles de Bordaque o desenvolveu em 1770 (LIPPMAN 2012) A contagem de Borda utiliza a abordagemde ranqueamento dos candidatos poreacutem de maneira diferente ao IRV Este eacute um sistemaque atribui uma pontuaccedilatildeo aos candidatos com base nestes rankings O candidato na basedo ranking natildeo recebe pontos o candidato imediatamente acima deste recebe 1 pontoo proacuteximo recebe 2 pontos e assim por diante ateacute o topo do ranking As pontuaccedilotildees detodos os rankings satildeo contabilizadas e o candidato com maior pontuaccedilatildeo eacute eleito Deacordo com Lippman variaccedilotildees deste meacutetodo satildeo encontradas em uso na premiaccedilatildeo dediversos esportes como na seleccedilatildeo do MVP(Most Valuable Player) da MLB(principal ligade beisebol dos EUA) e no Trofeacuteu Heisman de futebol americano universitaacuterio

                                          251 Exemplo

                                          Neste exemplo seratildeo aproveitados os mesmos rankings apresentados na tabela 3 Porserem 4 candidatos o primeiro colocado de cada ranking receberaacute 3 pontos o segundo 2pontos o terceiro 1 e o quarto 0 Assim o nuacutemero maacuteximo de pontos que um candidatopode atingir eacute igual a 300(se ficar na primeira posiccedilatildeo em todos os rankings) e o nuacutemerototal de pontos no sistema eacute 600 O nuacutemero maacuteximo de pontos que um candidato podeatingir eacute calculado com

                                          (cminus 1)times e

                                          Sendo c igual ao nuacutemero de candidatos e e o nuacutemero de eleitores Por sua vez onuacutemero total de pontos no sistema eacute

                                          26

                                          (cminus 1)times c2

                                          times e

                                          A contagem final dos pontos eacute apresentada na tabela 7 abaixo

                                          Tabela 7 ndash Resultado BCCandidatos Total de pontos

                                          A 146B 181C 126D 147

                                          O candidato eleito eacute o B com 181 pontos ou aproximadamente 60 da pontuaccedilatildeomaacutexima

                                          252 Vantagens e Desvantagens do BC

                                          Em comparaccedilatildeo com os meacutetodos abordados anteriormente que apenas consideramas primeiras opccedilotildees de cada eleitor este meacutetodo regularmente escolhe candidatos comaceitaccedilatildeo mais ampla ao inveacutes de uma preferecircncia direta dos eleitores (Electoral ReformSociety 2017b)

                                          Ele tambeacutem encoraja uma abordagem estrateacutegica por parte dos partidos onde seriade seu interesse nomear mais de um candidato para concorrer pois quanto mais candi-datos estatildeo no paacutereo maior eacute a pontuaccedilatildeo dos primeiros colocados Logo a nomeaccedilatildeo decandidatos menos populares pode beneficiar os principais candidatos de um partido

                                          253 Voto Uacutetil no BC

                                          Existem duas estrateacutegias aplicaacuteveis a esse sistema A primeira denominada compromi-sing de maneira similar a outros meacutetodos de votaccedilatildeo se resume em ranquear em primeirolugar um dos candidatos que estejam liderando as eleiccedilotildees mesmo que este natildeo seja suapreferecircncia real A segunda estrateacutegia burying eacute o oposto esta se baseia em ranquearem uacuteltimo lugar um dos candidatos liacutederes mesmo que este natildeo seja o seu candidato demaior desgosto Ambas estrateacutegias podem ser aplicadas ao mesmo tempo por um eleitor

                                          26 SCORE VOTING SYSTEM

                                          Score Voting ou Range Voting como tambeacutem eacute conhecido eacute mais um meacutetodo quetenta trazer maior liberdade de expressatildeo aos eleitores Assim como o Borda Counteste sistema funciona baseado na pontuaccedilatildeo dos candidatos no entanto ao inveacutes dessapontuaccedilatildeo ser relativa agrave posiccedilatildeo do candidato no ranking de cada eleitor este por sua veztem completa liberdade de atribuir qualquer quantidade de pontos aos candidatos dentro

                                          27

                                          de determinada escala Um eleitor pode dar o mesmo nuacutemero de pontos para diferentescandidatos e apoacutes o somatoacuterio de todas as pontuaccedilotildees o candidato com a pontuaccedilatildeo maisalta eacute eleito Incorporado ao escopo poliacutetico o SVS eacute utilizado no Partido Pirata Alematildeobem como em diversas organizaccedilotildees tais como o Fedora Project e Mozilla e tambeacutem emvariados esportes oliacutempicos e reality shows como o American Idol aponta Hamlin (2015)

                                          261 Exemplo

                                          Neste exemplo temos apresentados na tabela 8 abaixo 4 perfis distintos de eleitorese suas respectivas atribuiccedilotildees de pontos aos 4 candidatos Cada eleitor pode atribuirqualquer pontuaccedilatildeo a um candidato dentro da escala de -10 a 10 O resultado da eleiccedilatildeoapoacutes a soma de todos os pontos por candidato se encontra na tabela 9 onde o candidatoA eacute eleito com um total de 605 pontos

                                          Tabela 8 ndash Exemplo SVS

                                          Perfil A B C D Ndeg de eleitores1 10 -1 5 2 362 6 9 -3 4 253 2 0 8 4 224 3 3 3 10 17

                                          Tabela 9 ndash Resultado SVSCandidatos Total de pontos

                                          A 605B 240C 332D 430

                                          262 Vantagens e Desvantagens do SVS

                                          A grande vantagem do SVS eacute como ele proporciona aos eleitores expressar de maneiramuito proacutexima potencialmente exata suas impressotildees poliacuteticas de cada candidato Eleeacute ainda mais expressivo que o AVS Dessa maneira o spoiler effect tambeacutem se torna nuloao passo que toda intenccedilatildeo de voto eacute precisamente representada neste sistema

                                          Assim como outros meacutetodos eleitorais este sofre igualmente dos males produzidos pelovoto taacutetico Sua principal desvantagem eacute discutida na seccedilatildeo abaixo

                                          263 Voto Uacutetil no SVS

                                          Da mesma maneira que no Approval Voting atraveacutes do bullet voting o SVS tambeacutempode ser convertido em uma eleiccedilatildeo sob o meacutetodo FPTP em um cenaacuterio com um grande

                                          28

                                          volume de eleitores maliciosos O voto uacutetil sob este sistema se manifesta pontuando-seapenas um candidato com uma nota positiva e todos os outros com as notas mais baixasda escala Se todos os eleitores se aproveitarem dessa abordagem natildeo existiraacute distinccedilatildeoefetiva entre uma eleiccedilatildeo sob SVS e FPTP Essencialmente cada eleitor estaacute votando emapenas um candidato Essa eacute a principal desvantagem do SVS e ela consegue eliminarsua principal vantagem dar ao eleitor um poder maior de expressatildeo

                                          27 BLOC VOTE

                                          O Bloc Vote eacute um meacutetodo utilizado para a eleiccedilatildeo de candidatos a cargos no governocom mais de uma vacacircncia Pode ser considerado um meio-termo entre o FPTP e oAVS pois os eleitores podem votar em mais de um candidato poreacutem satildeo limitados pelonuacutemero de vagas Em uma eleiccedilatildeo com duas vagas por exemplo cada eleitor selecionaraacutedois candidatos ou menos Sensatamente o candidato mais votado eacute eleito Ele possuialgumas utilizaccedilotildees em eleiccedilotildees locais em algumas partes da Inglaterra (Electoral ReformSociety 2017a)

                                          271 Exemplo

                                          Neste exemplo dois candidatos seratildeo eleitos logo cada eleitor votaraacute em no maacuteximodois candidatos A distribuiccedilatildeo de votos pode ser conferida na tabela 10 e o resultado dacontagem de votos na tabela 11 abaixo Os candidatos eleitos satildeo o C totalizando 78do maacuteximo de votos possiacuteveis para um candidato e o A com 43

                                          Tabela 10 ndash Exemplo BV

                                          Aprovaccedilotildees Ndeg de eleitoresAC 20AB 16BC 19BD 6CA 7CD 15DC 17

                                          Tabela 11 ndash Resultado BVCandidatos Total de votos

                                          A 43B 41C 78D 38

                                          29

                                          272 Voto Uacutetil no BV

                                          Neste sistema eacute possiacutevel que um eleitor evite votar em sua primeira opccedilatildeo quandoeste natildeo tem chances de vitoacuteria e se fazendo isto ele diminuiraacute as chances de algum outrocandidato de seu desgosto ganhar Poreacutem o sistema previne um outro tipo de voto uacutetilEm eleiccedilotildees com mais de uma vaga onde os eleitores soacute podem votar em um candidatose um eleitor sabe que sua primeira opccedilatildeo tambeacutem eacute a primeira opccedilatildeo da maior parteda populaccedilatildeo e portanto muito provavelmente seraacute um dos candidatos eleitos eacute possiacutevelque ele arrisque votar em uma segunda opccedilatildeo sua na esperanccedila de a longo prazo elegersuas duas principais opccedilotildees de voto Com os eleitores podendo votar no nuacutemero exato devagas disponiacuteveis esse tipo de pensamento taacutetico perde o sentido

                                          30

                                          3 O SIMULADOR

                                          Para este trabalho foi implementado um simulador eleitoral na forma de uma aplicaccedilatildeoweb para que a interaccedilatildeo do usuaacuterio fosse facilitada Veremos a seguir como se daacute suautilizaccedilatildeo de forma geral

                                          Figura 2 ndash Captura de tela 1

                                          Figura 3 ndash Captura de tela 2

                                          A primeira opccedilatildeo encontrada pelo usuaacuterio eacute a escolha de quais sistemas de votaccedilatildeo se-ratildeo simulados (Figura 2) Todos eles podem ser selecionados para rodar simultaneamentePoreacutem natildeo eacute permitido rodar uma simulaccedilatildeo do Bloc Vote para uma eleiccedilatildeo onde apenasum candidato eacute eleito aleacutem disso natildeo existe implementaccedilatildeo dos meacutetodos TRS e IRV para

                                          31

                                          eleiccedilotildees com mais de um candidato eleito jaacute que eles se comportariam exatamente comono FPTP

                                          A maioria das linguagens de programaccedilatildeo senatildeo todas possuem um gerador de nuacuteme-ros pseudoaleatoacuterios que fornece a possibilidade de definir uma seed para o gerador Estaseed funciona como um ponto de partida para a geraccedilatildeo dos nuacutemero e portanto todasimulaccedilatildeo que rodar com a mesma seed sempre teraacute os mesmos resultados Se nenhumvalor for fornecido pelo usuaacuterio o tempo atual do sistema eacute utilizado As opccedilotildees subse-quentes satildeo a escolha do nuacutemero de eleitores gerados e o nuacutemero de vagas (Figura 3) Senenhum valor for fornecido o nuacutemero de eleitores padratildeo utilizado eacute 1000 e o nuacutemero devagas igual a 1

                                          Figura 4 ndash Captura de tela 3

                                          Este simulador possui dois modos para a criaccedilatildeo dos rankings dos eleitores No modoManipulate (Figura 4) primeiramente se define o nuacutemero de candidatos atraveacutes do campode entrada ao lado do tiacutetulo Candidates ou alternativamente pode-se adicionar candida-tos um a um atraveacutes do sinal de mais na parte inferior da paacutegina Para cada candidatoeacute possiacutevel definir a porcentagem de seus eleitores que optaraacute pelo voto taacutetico e pelovoto de minoria Tambeacutem eacute possiacutevel alterar o nome dos candidatos se for do interessedo usuaacuterio

                                          32

                                          Figura 5 ndash Captura de tela 4

                                          Figura 6 ndash Captura de tela 5

                                          33

                                          Figura 7 ndash Captura de tela 6

                                          Apoacutes a criaccedilatildeo dos candidatos o usuaacuterio pode criar perfis de eleitores que definiratildeo demaneira exata como partes da populaccedilatildeo iraacute votar (Figura 5) Em cada perfil se defineo valor em porcentos da populaccedilatildeo votante que o adotaraacute e a nota de cada candidatoTambeacutem eacute possiacutevel nomear cada perfil livremente

                                          No modo Generate (Figura 6) eacute onde o gerador de nuacutemeros pseudoaleatoacuterios eacute usadoNesse modo ao inveacutes do usuaacuterio criar perfis de eleitores ele define qual seraacute a distribuiccedilatildeoadotada para a geraccedilatildeo de notas de cada candidato Essas distribuiccedilotildees seratildeo mais bemdetalhadas no Capiacutetulo 5 Da mesma maneira que no modo Manipulate nesse modotambeacutem eacute possiacutevel definir os valores para os dois tipos de voto uacutetil os votos taacuteticos eos votos de minoria No primeiro estatildeo incluiacutedas as estrateacutegias de mudanccedila de votoespeciacuteficas de cada sistema como o bullet voting no AVS e SVS ou quando a preferecircnciade um eleitor claramente natildeo possui chances de vitoacuteria e ele muda seu voto para um doscandidatos que esteja na lideranccedila o que ocorre no FPTP e TRS O voto de minoriase apresenta apenas no FPTP em eleiccedilotildees onde mais de um candidato eacute eleito Se apreferecircncia de um eleitor claramente lidera a eleiccedilatildeo por ser tambeacutem a preferecircncia damaior parte da populaccedilatildeo esse eleitor pode mudar o seu voto para uma segunda opccedilatildeona esperanccedila de eleger dois de seus candidatos favoritos

                                          Por fim em ambos os modos o usuaacuterio tem a opccedilatildeo de definir coalizotildees entre oscandidatos se o sistema TRS estiver habilitado pois as coalizotildees apenas se manifestamnesse sistema Essas coalizotildees alteraratildeo as notas dos candidatos dependendo dos outroscandidatos pertencentes a elas (Figura 7)

                                          A aplicaccedilatildeo pode ser encontrada na paacutegina httpelectionsimpythonanywherecom

                                          34

                                          4 CENAacuteRIOS PERTINENTES

                                          Para todos os cenaacuterios deste capiacutetulo seraacute usada a seed do simulador igual a 100 e apopulaccedilatildeo de eleitores igual a 1000 para que exista consistecircncia na anaacutelise e tambeacutem paraque possa haver replicaccedilatildeo dos resultados se necessaacuterio

                                          41 CENAacuteRIO 1 VOTO TAacuteTICO

                                          Neste exemplo teremos quatro candidatos Ana Beto Carla e Diego Ana e Betoseratildeo gerados a partir da distribuiccedilatildeo Neutral (Figura 47) Carla da distribuiccedilatildeo Disliked(Figura 51) e Diego da Hated (Figura 55) Para a simulaccedilatildeo com a seed 100 o melhorcandidato a ser eleito ou seja aquele que maximiza a meacutedia das notas dos eleitores eacute oBeto com uma meacutedia de 0073 Para cada sistema seratildeo comparados os resultados semvoto taacutetico aos com 20 de voto taacutetico a favor da Ana Abaixo se encontram osresultados para o sistema FPTP

                                          Figura 8 ndash FPTP - Cenaacuterio 1 sem voto taacutetico

                                          Figura 9 ndash TRS segundo turno - Cenaacuterio 1 sem voto taacutetico

                                          35

                                          Figura 10 ndash IRV primeiro turno - Cenaacuterio 1

                                          Figura 11 ndash IRV segundo turno - Cenaacuterio 1

                                          Figura 12 ndash IRV terceiro turno - Cenaacuterio 1

                                          36

                                          Figura 13 ndash AVS - Cenaacuterio 1 sem voto taacutetico

                                          Figura 14 ndash BC - Cenaacuterio 1 sem voto taacutetico

                                          Figura 15 ndash SVS - Cenaacuterio 1 sem voto taacutetico

                                          37

                                          Nesse cenaacuterio sem voto taacutetico o uacutenico sistema que natildeo elege o Beto eacute o AVS Todosos outros elegem o melhor candidato Ou seja apesar de Beto ter uma melhor meacutediadas notas dos eleitores existem mais eleitores que ranqueiam Ana com uma nota acimade 0 No entanto apenas 20 dos eleitores de Diego e Carla que preferem a Ana aoinveacutes do Beto satildeo o suficiente para fazer Beto natildeo ser eleito se eles decidirem abandonarsua primeira opccedilatildeo e votar na Ana Considerando a vantagem que os votos taacuteticosproporcionam agrave Ana esta eacute eleita em todos os sistemas menos o TRS e o IRV

                                          Figura 16 ndash FPTP - Cenaacuterio 1 - 20 de voto taacutetico na Ana

                                          Figura 17 ndash TRS segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                          38

                                          Figura 18 ndash IRV primeiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                          Figura 19 ndash IRV segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                          Figura 20 ndash IRV terceiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                          39

                                          Figura 21 ndash AVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                                          Figura 22 ndash BC - Cenaacuterio 1 20 de voto taacutetico na Ana

                                          Figura 23 ndash SVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                                          40

                                          Eacute claro que se os eleitores que preferem o Beto tambeacutem votassem de maneira estra-teacutegica a situaccedilatildeo se equilibraria e haveria o mesmo niacutevel de concorrecircncia entre os doiscandidatos que ocorre quando natildeo haacute voto taacutetico Poreacutem no Borda Count esse equiliacute-brio pode natildeo acontecer e as estrateacutegias de compromising e burying podem acabar saindopela culatra se uma porcentagem elevada dos eleitores as adotarem Abaixo encontram-seos resultados para esse sistema quando 100 dos eleitores de Carla e Diego se comportammaliciosamente

                                          Figura 24 ndash BC - Cenaacuterio 1 100 de voto taacutetico na Ana e Beto

                                          Por causa do uso demasiado da estrateacutegia burying Ana e Beto perdem muitos pontose isso abre espaccedilo para uma vitoacuteria da Carla No entanto para porcentagens menores que100 o Beto ainda eacute o vencedor

                                          Essas duas estrateacutegias tambeacutem foram implementadas nesse simulador para o sistemaIRV e eacute possiacutevel ver como ele eacute resistente a elas Para que seja possiacutevel mudar os resultadosde uma eleiccedilatildeo sob o IRV eacute necessaacuterio mudar a ordem de eliminaccedilatildeo dos candidatos paraque o seu candidato preferido acabe enfrentando um candidato mais fraco nas rodadasfinais Isso natildeo ocorre com compromising e burying No proacuteximo cenaacuterio seraacute analisadacomo eacute possiacutevel modificar os resultados de uma eleiccedilatildeo sob o IRV

                                          Esses resultados podem ser replicados acessando os linksSem votos taacuteticos lthttpelectionsimpythonanywherecomdirect_res1111110

                                          --[0021][22Ana2222Beto222022Carla2222Diego22]------100gt

                                          Com 20 de voto taacutetico lthttpelectionsimpythonanywherecomdirect_res1111110--[0021][22Ana222022Beto2222Carla2222Diego22]1-[02000]---100gt

                                          Com 100 de voto taacuteticona Ana e Beto lthttpelectionsimpythonanywherecomdirect_res0000100--[0021][22Ana222022Beto222022Carla2222Diego22]1-[101000]---100gt

                                          41

                                          42 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV

                                          Neste cenaacuterio teremos Ana Carla e Beto concorrendo e trecircs perfis distintos que apoiamcada candidato As distribuiccedilotildees de notas dos perfis se encontram na tabela abaixo

                                          Tabela 12 ndash Distribuiccedilatildeo de notas - Cenaacuterio 2

                                          Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                          deeleitores

                                          1 10 5 0 422 0 10 5 303 5 0 10 28

                                          Com essas distribuiccedilotildees Carla eacute eliminada na primeira rodada e seus 28 de votossatildeo transferidos para a segunda opccedilatildeo de seus eleitores Ana que eacute eleita com 70 dosvotos e uma meacutedia de 56

                                          Figura 25 ndash IRV primeiro turno - Cenaacuterio 2

                                          Figura 26 ndash IRV segundo turno - Cenaacuterio 2

                                          42

                                          Cientes desse provaacutevel futuro cenaacuterio onde Ana eacute eleita uma pequena parte dos elei-tores de Beto estrategicamente o abandona e decide apoiar Carla na esperanccedila de leva-laao segundo turno contra Ana As novas distribuiccedilotildees de notas se encontram na tabelaabaixo com essa porccedilatildeo de eleitores representada pelo perfil 4

                                          Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2

                                          Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                          deeleitores

                                          1 10 5 0 422 0 10 5 283 5 0 10 284 0 8 10 2

                                          Essa mudanccedila estrateacutegica de voto altera a ordem de eliminaccedilotildees do sistema com Betosendo o primeiro a ser eliminado Com isso seus votos satildeo naturalmente transferidos paraCarla que derrota Ana no segundo turno com 58 dos votos

                                          Figura 27 ndash IRV primeiro turno com voto taacutetico - Cenaacuterio 2

                                          Figura 28 ndash IRV segundo turno com voto taacutetico - Cenaacuterio 2

                                          43

                                          Percebendo que a eleiccedilatildeo de Beto natildeo era provaacutevel seus eleitores conseguiram aomenos impedir a eleiccedilatildeo do pior candidato para eles Mas para isso foi necessaacuterio queeles tivessem a informaccedilatildeo de como os outros eleitores votariam Uma aproximaccedilatildeo dessasinformaccedilotildees poderia ser obtida em um cenaacuterio real com poucos candidatos atraveacutes depesquisas eleitorais poreacutem se o nuacutemero de candidatos eacute significativo uma noccedilatildeo completadas distribuiccedilotildees dos rankings dos eleitores se torna muito menos viaacutevel e dificulta aformulaccedilatildeo de estrateacutegias para alterar a ordem em que os candidatos satildeo eliminados

                                          Esses resultados podem ser replicados acessando os linksSem voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana22

                                          22Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                          Com voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana

                                          2222Beto2222Carla22]-----42Voter20Profile2001020520028Voter20Profile2010201020528Voter20Profile202520020102Voter20Profile20302082010100gt

                                          43 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE

                                          O interessante dos sistemas IRV e TRS eacute que os resultados do cenaacuterio anterior po-deriam ter sido obtidos ao inveacutes do voto taacutetico pela sua natildeo-monotonicidade Seriapossiacutevel que a Carla derrotasse a Ana no segundo turno atraveacutes do proacuteprio aumento depopularidade da Ana Assumindo que essa popularizaccedilatildeo ocorresse entre os candidatosdo perfil 2 onde 3 passasse a apoiar a Ana ao inveacutes do Beto as novas distribuiccedilotildeesseguiriam a tabela abaixo

                                          Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                          Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                          deeleitores

                                          1 10 5 0 452 0 10 5 273 5 0 10 28

                                          Dessa maneira Beto agora com uma porcentagem dos eleitores menor do que a deCarla seraacute eliminado na primeira rodada e como seus eleitores tecircm a Carla como segundaopccedilatildeo ela receberaacute todos os seus votos e seraacute eleita na segunda rodada As rodadas doIRV podem ser vistas nas figuras 29 e 30

                                          44

                                          Figura 29 ndash IRV primeiro turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                          Figura 30 ndash IRV segundo turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                          Tabela 15 ndash Resultados do Cenaacuterio 3Candidato

                                          eleitoMeacutedia das

                                          notasAntes da

                                          popularizaccedilatildeode Ana

                                          Ana 56

                                          Apoacutespopularizaccedilatildeo

                                          de AnaCarla 415

                                          Os efeitos dessa caracteriacutestica se refletem na satisfaccedilatildeo meacutedia da populaccedilatildeo A Ana eacuteclaramente a melhor candidata e mesmo com o seu ganho de popularidade (ou devido aele) a Carla eacute eleita

                                          Esses resultados podem ser replicados acessando os linksAntes da popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecom

                                          direct_res0010000---[22Ana2222Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                          45

                                          Apoacutes popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana2222Beto2222Carla22]-----45Voter20Profile2001020520027Voter20Profile2010201020528Voter20Profile20252002010100gt

                                          44 CENAacuteRIO 4 COALIZOtildeES

                                          O TRS por ser organizado em dois turnos separados normalmente a semanas dedistacircncia um do outro acaba abrindo brecha agrave mudanccedila de opiniatildeo por parte dos eleitorese o desenvolvimento de novas estrateacutegias por parte dos candidatos tais como a coalizatildeocom candidatos jaacute eliminados Com isso em mente nesse cenaacuterio teremos novamenteos quatro candidatos Ana Beto Carla e Diego Os trecircs primeiros seratildeo gerados dadistribuiccedilatildeo Neutral e Diego da distribuiccedilatildeo Disliked

                                          Figura 31 ndash TRS turno 1 - Cenaacuterio 4

                                          No TRS normal Ana Beto e Carla possuem com essas distribuiccedilotildees quantidades devotos muito proacuteximas com Beto e Carla indo para o segundo turno Carla estaacute 10 votosatraacutes de Beto e decide aproveitar o espaccedilo de tempo entre os dois turnos para tentaragregar mais votos Com isso Carla se aproxima de Diego e juntos formam uma coalizatildeoNo entanto com sua baixa popularidade Diego acaba ferindo a reputaccedilatildeo de Carla etorna o segundo turno muito mais faacutecil para Beto (Figura 33) Se Carla tivesse buscado osuporte de Ana por outro lado ela se veria vitoriosa no segundo turno e com uma amplavantagem sobre o Beto (Figura 34) Ou ateacute mesmo sem buscar uma coalizatildeo mesmosendo uma corrida apertada Carla teria naturalmente sido eleita (Figura 32)

                                          Esses resultados podem ser replicados acessando os linksSem coalizotildees lthttpelectionsimpythonanywherecomdirect_res0100000

                                          --[0002][22Ana222022Beto2222Carla2222Diego22]------100gt

                                          46

                                          Figura 32 ndash TRS turno 2 - Cenaacuterio 4

                                          Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4

                                          Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4

                                          47

                                          Coalizatildeo Carla e Diego lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2203Carla20Diego-100gt

                                          Coalizatildeo Carla e Ana lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2200Carla20Ana-100gt

                                          45 CENAacuteRIO 5 DILEMA DO PRISIONEIRO

                                          Neste cenaacuterio temos uma eleiccedilatildeo de uma vaga com trecircs candidatos concorrentes e trecircsperfis distintos de eleitores que seguiratildeo as seguintes distribuiccedilotildees

                                          Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5

                                          Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                          deeleitores

                                          1 10 -10 5 362 -10 10 5 343 -10 -10 5 30

                                          Esse contexto nos remete ao notaacutevel dilema do prisioneiro Nele dois prisioneiroscuacutemplices satildeo interrogados individualmente sem poder se comunicar um com o outro ecada um enfrenta o dilema de delatar ou natildeo o seu parceiro Se os dois prisioneirosdecidem se manter calados sobre o crime ambos satildeo sentenciados a um ano de prisatildeo Seapenas um deles dedurar o outro o traidor sai livre enquanto seu parceiro eacute condenadoa trecircs anos Se ambos dedurarem um ao outro eles satildeo condenados juntos a dois anosde prisatildeo Esse dilema eacute uma ideia claacutessica presente no estudo da teoria dos jogos sendooriginalmente elaborada por Merrill Flood e Melvin Dresher em 1950 e mais tarde sendonomeada de dilema dos prisioneiros por Albert W Tucker (POUNDSTONE 1992)

                                          O que esse dilema nos mostra eacute a tentaccedilatildeo que o indiviacuteduo deteacutem se sua racionalizaccedilatildeoestiver voltada para seus proacuteprios interesses e somente eles em oposiccedilatildeo a pensar no bemdo grupo como um todo Neste cenaacuterio encontramos dois grupos de eleitores expressiva-mente opostos os perfis 1 e 2 Se qualquer uma das preferecircncias desses perfis fosse eleitaisso significaria uma alta rejeiccedilatildeo de maior parte da populaccedilatildeo No entanto eles possuema segunda opccedilatildeo em comum a Carla que por sua vez eacute a preferecircncia do terceiro perfilPortanto a eleiccedilatildeo da Carla seria logicamente o resultado oacutetimo

                                          Mesmo assim a Ana eacute eleita nos dois sistemas acima o que natildeo parece justo poispela tabela 16 eacute evidente que apenas 36 da populaccedilatildeo a aprova enquanto que os outros64 a reprovam ao maacuteximo O sistema IRV se comporta de maneira idecircntica ao TRS

                                          48

                                          Figura 35 ndash FPTP - Cenaacuterio 5

                                          Figura 36 ndash TRS segundo turno - Cenaacuterio 5

                                          nesta situaccedilatildeo Com esse resultado a meacutedia das notas eacute -28 No entanto os trecircs sistemasseguintes nos apresentam resultados diferentes

                                          Tabela 17 ndash Resultados do Cenaacuterio 5

                                          Sistema Candidatoeleito

                                          Meacutedia dasnotas

                                          FPTP Ana -28TRS Ana -28IRV Ana -28AVS Carla 50BC Carla 50SVS Carla 50

                                          49

                                          Figura 37 ndash AVS - Cenaacuterio 5

                                          Figura 38 ndash BC - Cenaacuterio 5

                                          Tanto o AVS quanto o Borda Count e o SVS satildeo sistemas que consideram todasas opiniotildees de cada eleitor ao mesmo tempo e por isso satildeo capazes de eleger o melhorcandidato nesta situaccedilatildeo diferentemente do TRS que natildeo absorve completamente todosentimento do eleitor por todos os candidatos e o IRV que apesar de ser bem expressivoquebra esse processo em inuacutemeras rodadas o que permite a perda de informaccedilatildeo ao longodelas

                                          Esses resultados podem ser replicados acessando o linklthttpelectionsimpythonanywherecomdirect_res1111110---[22Ana

                                          222022Beto222022Carla22]-----36Voter20Profile2001020-1020534Voter20Profile201-10201020530Voter20Profile202-1020-10205100gt

                                          50

                                          Figura 39 ndash SVS - Cenaacuterio 5

                                          46 CENAacuteRIO 6 VOTO DE MINORIA

                                          Neste cenaacuterio temos uma eleiccedilatildeo com quatro candidatos e duas vagas A Ana seraacutea preferecircncia de uma extensa parte da populaccedilatildeo (distribuiccedilatildeo Loved Figura 53) Betoe Carla seratildeo candidatos razoavelmente populares (distribuiccedilatildeo Neutral Figura 47) eDiego seraacute a preferecircncia de apenas um pequeno grupo especiacutefico e rejeitado pela maioria(distribuiccedilatildeo Disliked Figura 51) Eacute intuitivo esperar que os dois candidatos eleitos seratildeoa Ana e ou o Beto ou a Carla e isso eacute exatamente o que ocorre na figura 40 no sistemaFPTP sem voto de minoria

                                          Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria

                                          Eacute evidente a discrepacircncia da quantidade de votos da Ana para os outros candidatose apesar de Beto e Carla serem mais populares que Diego os trecircs natildeo se encontrammuito afastados Poreacutem se a pequena fraccedilatildeo de candidatos que possuem a Ana como

                                          51

                                          Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego

                                          preferecircncia e Diego como segunda opccedilatildeo optarem pelo voto de minoria a situaccedilatildeo mudacompletamente (Figura 41) Assim apesar de extensamente rejeitado Diego conquistaa segunda vaga e a meacutedia das notas despenca de 2929 para 0505 No entanto aindaexiste um cenaacuterio pior Se os outros grupos de eleitores pensarem da mesma forma eevitarem votar na Ana achando que sua eleiccedilatildeo jaacute estaacute assegurada apenas 80 de votode minoria para esses grupos jaacute eacute o suficiente para eliminaacute-la das eleiccedilotildees (Figura 42)Com a Ana eliminada a meacutedia das notas cai ainda mais para 0058

                                          Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego

                                          O sistema Bloc Vote eacute uma das soluccedilotildees para o voto de minoria Permitindo queos eleitores votem no mesmo nuacutemero de candidatos que de vagas a serem preenchidasnatildeo existe o iacutempeto a esse tipo de voto estrateacutegico O resultado desse sistema portantoretorna a meacutedia das notas a casa dos 29 (Figura 43) Os sistemas AVS Borda Count eSVS tambeacutem impedem a presenccedila do voto de minoria e atingem resultados semelhantes

                                          52

                                          Figura 43 ndash BV - Cenaacuterio 6

                                          Tabela 18 ndash Resultados do Cenaacuterio 6

                                          Sistema Candidatoseleitos

                                          Meacutedia dasnotas

                                          FPTP sem voto de minoriaAna eBeto 2929

                                          FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

                                          FPTP com 80 de voto de minoriaBeto eCarla 0058

                                          Bloc VoteAna eCarla 2913

                                          Esses resultados podem ser replicados acessando os links

                                          Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

                                          100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

                                          80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

                                          53

                                          5 COMO FUNCIONA O SIMULADOR

                                          O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

                                          51 CLASSE ELECTIONS

                                          Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

                                          bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

                                          Figura 44 ndash estrutura candidates

                                          bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

                                          bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

                                          Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

                                          Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

                                          54

                                          Figura 45 ndash estrutura voters

                                          Figura 46 ndash estrutura votes

                                          daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

                                          Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

                                          55

                                          Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

                                          Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

                                          na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

                                          56

                                          Figura 49 ndash PDF - Distribuiccedilatildeo Liked

                                          Figura 50 ndash CDF - Distribuiccedilatildeo Liked

                                          (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

                                          Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

                                          57

                                          Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

                                          Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

                                          candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

                                          Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

                                          58

                                          Figura 53 ndash PDF - Distribuiccedilatildeo Loved

                                          Figura 54 ndash CDF - Distribuiccedilatildeo Loved

                                          funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

                                          59

                                          Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                                          Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                                          Meacutedia das Notas sumei

                                          sumvj nij

                                          etimes v

                                          Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                                          Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                                          60

                                          Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                                          Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                                          52 CLASSE FIRSTPASTTHEPOST

                                          Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                                          Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                                          61

                                          Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                                          Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                                          mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                                          62

                                          53 CLASSE TWOROUNDSYSTEM

                                          A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                                          54 CLASSE INSTANTRUNOFFVOTING

                                          A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                                          Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                                          63

                                          cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                                          55 CLASSE APPROVALVOTING

                                          Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                                          56 CLASSE BORDACOUNT

                                          Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                                          57 CLASSE SCOREVOTING

                                          De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                                          64

                                          58 CLASSE BLOCVOTE

                                          O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                                          59 TECNOLOGIAS UTILIZADAS

                                          A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                                          Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                                          O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                                          Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                                          65

                                          6 CONCLUSAtildeO

                                          Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                                          Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                                          Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                                          Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                                          Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                                          66

                                          REFEREcircNCIAS

                                          AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                                          Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                                          Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                                          Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                                          HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                                          LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                                          ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                                          Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                                          POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                                          The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                                          67

                                          APEcircNDICES

                                          APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                          Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                          if(not len(selfvoter_profiles))

                                          for voter in range(selfN_VOTERS)

                                          candidates_rank = dict()

                                          for candidate in reversed(range(selfN_CANDIDATES))

                                          if(selfBIAS_VECTOR[candidate]==4)

                                          candidates_rank[candidate] = self_sortear(selfloved)

                                          elif(selfBIAS_VECTOR[candidate]==3)

                                          candidates_rank[candidate] = self_sortear(selfliked)

                                          elif(selfBIAS_VECTOR[candidate]==2)

                                          candidates_rank[candidate] = self_sortear(selfdisliked)

                                          elif(selfBIAS_VECTOR[candidate]==1)

                                          candidates_rank[candidate] = self_sortear(selfhated)

                                          elif(selfBIAS_VECTOR[candidate]==-1)

                                          candidates_rank[candidate] = self_sortear(selfpolarizer

                                          )

                                          elif(selfBIAS_VECTOR[candidate]==-2)

                                          candidates_rank[candidate] = self_sortear(self

                                          more_polarizer)

                                          else

                                          candidates_rank[candidate] = self_sortear(selfneutral)

                                          selfvotersappend(candidates_rank)

                                          else

                                          ranges = []

                                          ranks = []

                                          for prof in selfvoter_profiles

                                          rangesappend(int(prof[pop_percentage]))

                                          rank =

                                          for index score in enumerate(prof[scores])

                                          rank[index] = score

                                          ranksappend(rank)

                                          for index _range in enumerate(ranges)

                                          for _ in range(int(selfN_VOTERS(_range100)))

                                          selfvotersappend(ranks[index])

                                          68

                                          APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                          Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                          for i in range(selfN_CANDIDATES)

                                          selfcandidates[i] = 0

                                          selfvotes[i] = set()

                                          APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                          Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                          for candidate in range(selfN_CANDIDATES)

                                          rating_sum = 0

                                          for voter in selfvoters

                                          rating_sum += voter[candidate]

                                          selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                          APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                          Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                          if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                          return selfcalculate_mean(winners)

                                          else

                                          chose_best = True if winners[0] == selfbest_candidate else

                                          False

                                          return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                          69

                                          APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                          Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                          rating_sum = 0

                                          for voter in selfvoters

                                          for candidate in winners

                                          rating_sum += voter[candidate]

                                          return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                          APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                          Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                          for i in range(1 selfN_VACANCIES + 2)

                                          selfleading_candidatesappend(selfsorted_candidates[-i][self

                                          CANDIDATE_INDEX])

                                          APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                          Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                          for leader in selfelecrounds[-1]

                                          selfleading_candidatesappend(leader[0])

                                          70

                                          APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                          Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                          self_account_for_coalitions()

                                          for voter in selfvoters

                                          selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                          (1)))

                                          temp = []

                                          for voter in selfsorted_voters

                                          new_dict = defaultdict(list)

                                          for k in voter

                                          new_dict[k[1]]append(k[0])

                                          tempappend(new_dict)

                                          selfsorted_voters = []

                                          for voter_index current_voter in enumerate(temp)

                                          new_voter = []

                                          for rating candidate_indexes in current_voteritems()

                                          if len(current_voter[rating]) gt 1

                                          shuffle(current_voter[rating])

                                          for e in candidate_indexes

                                          new_voterappend((e rating))

                                          else

                                          new_voterappend((candidate_indexes[0] rating))

                                          selfsorted_votersappend(new_voter)

                                          selfcandidates[new_voter[-1][0]] += 1

                                          selfvotes[new_voter[-1][0]]add(voter_index)

                                          71

                                          APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                          Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                          for candidate in selfvotes_copy

                                          if candidate not in selfelecleading_candidates

                                          for voter_index in selfvotes_copy[candidate]

                                          for index _candidate in enumerate(reversed(selfelec

                                          sorted_voters[voter_index]))

                                          if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                          leading_candidates

                                          if randomrandom() lt selfelec

                                          tactical_vote_percentages[_candidate[selfelec

                                          CANDIDATE_INDEX]]

                                          selfrankings_changed[voter_index] = copy

                                          deepcopy(selfelecsorted_voters[voter_index])

                                          selfrankings_changed[voter_index][-(index + 1)]

                                          selfrankings_changed[voter_index][-1] = self

                                          rankings_changed[voter_index][-1] self

                                          rankings_changed[voter_index][-(index + 1)]

                                          selfcandidates[candidate] -= 1

                                          selfcandidates[_candidate[selfelec

                                          CANDIDATE_INDEX]] += 1

                                          selfvotes[candidate]remove(voter_index)

                                          selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                          ]]add(voter_index)

                                          break

                                          break

                                          72

                                          APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                          Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                          half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                          for candidate in selfelecleading_candidates

                                          if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                          continue

                                          for voter_index in selfvotes_copy[candidate]

                                          if voter_index in selfrankings_changed

                                          ranking = selfrankings_changed[voter_index]

                                          else

                                          ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                          ])

                                          for index _candidate in enumerate(reversed(ranking))

                                          if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                          leading_candidates or (_candidate[selfelec

                                          CANDIDATE_INDEX] in selfelecleading_candidates and

                                          selfelecleading_candidatesindex(_candidate[selfelec

                                          CANDIDATE_INDEX]) gt= half_vacancies)

                                          if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                          if randomrandom() lt selfelec

                                          minority_vote_percentages[_candidate[selfelec

                                          CANDIDATE_INDEX]]

                                          selfcandidates[candidate] -= 1

                                          selfcandidates[_candidate[selfelec

                                          CANDIDATE_INDEX]] += 1

                                          break

                                          break

                                          break

                                          73

                                          APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                          Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                          self_account_for_coalitions()

                                          for candidate in selfvotes

                                          if candidate = selfwinner and candidate = selfsecond_place

                                          for voter_index in selfvotes[candidate]

                                          if voter_index in selfrankings_changed

                                          ranking = selfrankings_changed[voter_index]

                                          else

                                          ranking = copydeepcopy(selfelecsorted_voters[

                                          voter_index])

                                          for index2 candidate in enumerate(reversed(ranking))

                                          if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                          selfcandidates[selfwinner] += 1

                                          selfvotes[selfwinner]add(voter_index)

                                          break

                                          elif candidate[selfelecCANDIDATE_INDEX] == self

                                          second_place

                                          selfcandidates[selfsecond_place] += 1

                                          selfvotes[selfsecond_place]add(voter_index)

                                          break

                                          selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                          winners = []

                                          vacancies = selfelecN_VACANCIES

                                          for candidate in reversed(selfsorted_candidates)

                                          if vacancies == 0

                                          break

                                          winnersappend(candidate[0])

                                          vacancies -= 1

                                          mean chose_best = selfelecget_mean(winners = winners)

                                          74

                                          APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                          Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                          for voter_index voter in enumerate(selfelecsorted_voters)

                                          voter_dict = dict()

                                          og_voter_dict = dict()

                                          for tup in voter

                                          voter_dict[tup[0]] = tup[1]

                                          og_voter_dict[tup[0]] = tup[1]

                                          for coalition in selfeleccoalitions

                                          for candidate in coalition

                                          add_to_score = 0

                                          for candidate2 in coalition

                                          if candidate == candidate2

                                          continue

                                          half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                          if half lt 0

                                          add_to_score += mathceil(half)

                                          else

                                          add_to_score += mathfloor(half)

                                          if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                          voter_dict[candidate[rsquovaluersquo]] = 10

                                          elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                          voter_dict[candidate[rsquovaluersquo]] = -10

                                          else

                                          voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                          selfrankings_changed[voter_index] = []

                                          for candidate in voter_dict

                                          selfrankings_changed[voter_index]append((candidate voter_dict[

                                          candidate]))

                                          selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                          voter_index] key=lambda x x[1])

                                          75

                                          APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                          Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                          selfelecroundsappend(selfsorted_candidates[_round])

                                          if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                          N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                          N_VACANCIES - 1)

                                          return 2

                                          elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                          N_VOTERS gt 05)

                                          return 1

                                          else

                                          selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                          CANDIDATE_INDEX])

                                          for voter_index in selfvotes[selfsorted_candidates[_round][self

                                          elecCANDIDATE_INDEX]]

                                          if voter_index in selfrankings_changed

                                          for candidate in reversed(selfrankings_changed[voter_index

                                          ])

                                          if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                          excluded

                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                          ]] += 1

                                          selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                          add(voter_index)

                                          break

                                          else

                                          continue

                                          else

                                          for candidate in reversed(selfelecsorted_voters[

                                          voter_index])

                                          if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                          excluded

                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                          ]] += 1

                                          selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                          add(voter_index)

                                          break

                                          else

                                          continue

                                          selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                          return 0

                                          76

                                          APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                          Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                          for index in range(selfelecN_CANDIDATES)

                                          selfcandidates[index] = 0

                                          for voter in selfelecsorted_voters

                                          for candidate in reversed(voter)

                                          if candidate[selfelecCANDIDATE_SCORE] gt 0

                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                          else

                                          break

                                          APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                          Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                          for index in range(selfelecN_CANDIDATES)

                                          selfcandidates[index] = 0

                                          for voter in selfelecsorted_voters

                                          if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                          elecCANDIDATE_INDEX]]

                                          selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                          else

                                          for candidate in reversed(voter)

                                          if candidate[selfelecCANDIDATE_SCORE] gt 0

                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                          else

                                          break

                                          77

                                          APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                          Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                          pos = set()

                                          for index perc in enumerate(selfelectactical_vote_percentages)

                                          if perc gt 0

                                          posadd(index)

                                          for candidate in selfeleccandidates

                                          if candidate not in selfleading_candidates

                                          for voter_index in selfvotes[candidate]

                                          raised = None

                                          for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                          ])

                                          if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                          leading_candidates

                                          if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                          if randomrandom() lt selfelectactical_vote_percentages[

                                          candidate_tuple[selfelecCANDIDATE_INDEX]]

                                          ranking = [None]selfelecN_CANDIDATES

                                          ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                          selfelecvoters[voter_index][candidate_tuple[selfelec

                                          CANDIDATE_INDEX]])

                                          raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                          break

                                          break

                                          break

                                          if raised = None

                                          for _candidate in selfleading_candidates

                                          if _candidate = ranking[-1][0]

                                          ranking[0] = (_candidate selfelecvoters[voter_index][

                                          _candidate])

                                          buried = _candidate

                                          break

                                          i = 1

                                          for candidate_tuple in selfelecsorted_voters[voter_index]

                                          if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                          buried]

                                          continue

                                          else

                                          ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                          selfelecvoters[voter_index][candidate_tuple[selfelec

                                          CANDIDATE_INDEX]])

                                          i += 1

                                          selfrankings_changed[voter_index] = ranking

                                          78

                                          APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                          Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                          for voter_index in selfvotes[candidate]

                                          if randomrandom() lt selfelectactical_vote_percentages[candidate

                                          ]

                                          for _candidate in selfleading_candidates

                                          if _candidate = candidate

                                          ranking = [None]selfelecN_CANDIDATES

                                          ranking[0] = (_candidate selfelecvoters[voter_index][

                                          _candidate])

                                          buried = _candidate

                                          break

                                          i = 1

                                          for candidate_tuple in selfelecsorted_voters[voter_index]

                                          if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                          continue

                                          else

                                          ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                          selfelecvoters[voter_index][candidate_tuple[selfelec

                                          CANDIDATE_INDEX]])

                                          i += 1

                                          selfrankings_changed[voter_index] = ranking

                                          79

                                          APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                          Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                          for index in range(selfelecN_CANDIDATES)

                                          selfcandidates[index] = 0

                                          for voter_index voter in enumerate(selfelecsorted_voters)

                                          score = 0

                                          if voter_index in selfrankings_changed

                                          for candidate in selfrankings_changed[voter_index]

                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                          score += 1

                                          else

                                          for candidate in voter

                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                          score += 1

                                          APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                          Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                          for voter_index voter in enumerate(selfelecsorted_voters)

                                          if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                          elecCANDIDATE_INDEX]]

                                          selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                          sorted_voters[voter_index])

                                          for candidate_index candidate in enumerate(reversed(voter))

                                          if candidate_index == 0

                                          selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                          voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                          else

                                          selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                          voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                          80

                                          APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                          Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                          for index in range(selfelecN_CANDIDATES)

                                          selfcandidates[index] = 0

                                          for voter_index voter in enumerate(selfelecsorted_voters)

                                          if voter_index in selfrankings_changed

                                          for candidate in selfrankings_changed[voter_index]

                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                          selfelecCANDIDATE_RANK]

                                          else

                                          for candidate in voter

                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                          selfelecCANDIDATE_RANK]

                                          APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                          Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                          for index in range(selfelecN_CANDIDATES)

                                          selfcandidates[index] = 0

                                          for voter in selfelecsorted_voters

                                          votes = selfelecN_VACANCIES

                                          for candidate in reversed(voter)

                                          if votes == 0

                                          break

                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                          votes -= 1

                                          • Folha de aprovaccedilatildeo
                                          • Agradecimentos
                                          • Epiacutegrafe
                                          • Resumo
                                          • Abstract
                                          • Lista de ilustraccedilotildees
                                          • Lista de Coacutedigos
                                          • Lista de tabelas
                                          • Lista de abreviaturas e siglas
                                          • Sumaacuterio
                                          • INTRODUCcedilAtildeO
                                            • MOTIVACcedilAtildeO E OBJETIVO
                                            • MEacuteTODO
                                            • ESTRUTURA
                                              • SISTEMAS ELEITORAIS
                                                • FISRT PAST THE POST
                                                  • Exemplo
                                                  • Vantagens e Desvantagens do FPTP
                                                  • Voto Uacutetil no FPTP
                                                    • TWO-ROUND SYSTEM
                                                      • Exemplo
                                                      • Vantagens e Desvantagens do TRS
                                                      • Voto Uacutetil no TRS
                                                        • INSTANT-RUNOFF VOTING
                                                          • Exemplo
                                                          • Vantagens e Desvantagens do IRV
                                                          • Voto Uacutetil no IRV
                                                            • APPROVAL VOTING SYSTEM
                                                              • Exemplo
                                                              • Vantagens e Desvantagens do AVS
                                                              • Voto Uacutetil no AVS
                                                                • THE BORDA COUNT
                                                                  • Exemplo
                                                                  • Vantagens e Desvantagens do BC
                                                                  • Voto Uacutetil no BC
                                                                    • SCORE VOTING SYSTEM
                                                                      • Exemplo
                                                                      • Vantagens e Desvantagens do SVS
                                                                      • Voto Uacutetil no SVS
                                                                        • BLOC VOTE
                                                                          • Exemplo
                                                                          • Voto Uacutetil no BV
                                                                              • O SIMULADOR
                                                                              • CENAacuteRIOS PERTINENTES
                                                                                • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                • CENAacuteRIO 4 COALIZOtildeES
                                                                                • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                  • COMO FUNCIONA O SIMULADOR
                                                                                    • CLASSE Elections
                                                                                    • CLASSE FirstPastThePost
                                                                                    • CLASSE TwoRoundSystem
                                                                                    • CLASSE InstantRunoffVoting
                                                                                    • CLASSE ApprovalVoting
                                                                                    • CLASSE BordaCount
                                                                                    • CLASSE ScoreVoting
                                                                                    • CLASSE BlocVote
                                                                                    • TECNOLOGIAS UTILIZADAS
                                                                                      • CONCLUSAtildeO
                                                                                      • Referecircncias
                                                                                      • Meacutetodo create_voters
                                                                                      • Meacutetodo create_candidates
                                                                                      • Meacutetodo calculate_means
                                                                                      • Meacutetodo get_mean
                                                                                      • Meacutetodo calculate_mean
                                                                                      • Meacutetodo set_leading_candidates
                                                                                      • Meacutetodo irv_set_leading_candidates
                                                                                      • Meacutetodo sort_ranks
                                                                                      • Meacutetodo fptp_count_tactical_votes
                                                                                      • Meacutetodo fptp_count_minority_votes
                                                                                      • Meacutetodo trs_second_round
                                                                                      • Meacutetodo trs_account_for_coalitions
                                                                                      • Meacutetodo irv_count_votes
                                                                                      • Meacutetodo avs_count_votes
                                                                                      • Meacutetodo avs_count_votes_with_tactical
                                                                                      • Meacutetodo irv_apply_tactical_votes
                                                                                      • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                      • Meacutetodo bc_sum_candidates_scores
                                                                                      • Meacutetodo svs_apply_tactical_votes
                                                                                      • Meacutetodo svs_sum_candidates_scores
                                                                                      • Meacutetodo bv_count_votes

                                            22

                                            isso natildeo ocorrer o candidato menos votado eacute eliminado das eleiccedilotildees e seus votos satildeotransferidos para a segunda opccedilatildeo de cada um de seus eleitores Esse procedimento serepete eliminando o candidato menos votado a cada rodada ateacute que algum dos candidatospossuam a maioridade dos votos

                                            231 Exemplo

                                            Na tabela 3 pode-se verificar a distribuiccedilatildeo de votos por perfil de eleitor e na tabela4 vecirc-se o desenvolvimento do IRV para essas distribuiccedilotildees O candidato D eacute o menosvotado e por consequecircncia eacute o primeiro a ser eliminado A segunda opccedilatildeo de todos oseleitores que votaram no candidato D eacute o candidato C por isso este recebe todos os votosdistribuiacutedos na segunda rodada Com isso o candidato B eacute eliminado com 25 dos votos eos candidatos A e C concorrem na uacuteltima rodada Mesmo com o candidato C na lideranccedilana segunda rodada a maior parte dos eleitores do B tem como preferecircncia o candidatoA por isso A eacute eleito com 55 dos votos contra 45 do C

                                            Tabela 3 ndash Exemplo IRV

                                            Rankings Ndeg de eleitoresABCD 20ABDC 16BDAC 19BDCA 6CABD 7CDBA 15DCAB 5DCBA 12

                                            Tabela 4 ndash Desenvolvimento do IRVTurnos D C B A

                                            1 17 22 25 362 eliminado 39 25 363 eliminado 45 eliminado 55

                                            232 Vantagens e Desvantagens do IRV

                                            Assim como no TRS a pluralidade eacute irrelevante no IRV e um candidato soacute eacute eleitocom a maioridade dos votos dando maior legitimidade ao mandato deste No entantopode-se argumentar que o IRV faz isso com mais eficiecircncia pois natildeo requer a execuccedilatildeode mais de uma rodada de votaccedilotildees Isso diminui os custos das eleiccedilotildees como um todoao mesmo tempo que proporciona um nuacutemero menor de isenccedilotildees por parte dos eleitoresdevido ao desgaste de todo o processo eleitoral

                                            23

                                            Aleacutem disso candidatos de partidos menores tendem a receber mais votos do queno FPTP e portanto satildeo mais encorajados a se candidatar Com uma lista maior decandidatos eleitores desfrutam de uma variedade maior de opccedilotildees de voto Contudomesmo com mais candidatos menos populares o spoiler effect mencionado anteriormentetambeacutem natildeo possui espaccedilo nesse sistema de votaccedilatildeo Partidos menores natildeo tem comoroubar votos de partidos maiores visto que esses votos eventualmente seratildeo transferidosde volta a eles durante o desenvolvimento das rodadas do IRV

                                            Em virtude de sua estrutura acredita-se que esse meacutetodo tende a encorajar os can-didatos tambeacutem a elaborar suas campanhas de forma mais abrangente ampliando suainfluecircncia para mais do que apenas um grupo especiacutefico de maneira que ele consiga agre-gar votos de segunda ou terceira opccedilatildeo aleacutem dos votos de seus eleitores principais

                                            A principal desvantagem do IRV eacute o fato de ele ainda natildeo ser amplamente utilizado aoredor do mundo Essa falta de familiaridade do sistema pode causar confusatildeo ao eleitorcomum em suas primeiras ocorrecircncias No entanto nos paiacuteses em que este eacute utilizadonatildeo parece haver confusatildeo entre os eleitores Aleacutem disso na maioria dos casos haveraacute umcusto potencialmente alto da substituiccedilatildeo ou alteraccedilatildeo dos sistemas das urnas eletrocircnicaspara que seja possiacutevel haver a implementaccedilatildeo do meacutetodo

                                            Aleacutem disso assim como o TRS este sistema tambeacutem possui natildeo-monotonicidade ouseja um candidato pode ser prejudicado ao ser ranqueado mais alto enquanto que outropode se beneficiar sendo ranqueado mais baixo pelos eleitores (ORNSTEIN 2018) issopode ocorrer quando esse ranqueamento causa alteraccedilotildees na ordem em que os candidatossatildeo eliminados Essa caracteriacutestica se manifesta em fenocircmenos complexos e especiacuteficos epor isso um exemplo de sua ocorrecircncia seraacute abordada em detalhes na seccedilatildeo 43

                                            233 Voto Uacutetil no IRV

                                            Como os sistemas de votaccedilatildeo anteriores o IRV natildeo eacute completamente imune ao vototaacutetico No entanto este meacutetodo se mostra bem resistente a eles quando comparado aoutros meacutetodos como o FPTP e o Borda Count (Bartholdi John J III and Orlin JamesB 1990) Distintivamente o IRV requer um maior esforccedilo do eleitor para elaborar umaestrateacutegia que melhor ajuste os resultados da eleiccedilatildeo de acordo com a sua preferecircnciaAleacutem disso eacute necessaacuterio que ele tenha informaccedilatildeo suficiente sobre os rankings de outroseleitores naturalmente obtida atraveacutes de pesquisas eleitorais

                                            Existe tambeacutem a possibilidade de ocorrer uma exaustatildeo dos votos quando natildeo haacuteo completo preenchimento do ranking por parte dos eleitores Nessas ocasiotildees o votonatildeo pode continuar a ser transferido a outros candidatos e ele eacute descartado Isso afetaa legitimidade do mandato do candidato eleito pois o resultado final natildeo representaraacute100 da populaccedilatildeo votante Essas ocorrecircncias no entanto podem ser minimizadas comuma melhor educaccedilatildeo eleitoral ou como foi implementado na Austraacutelia requerer que osrankings incluam uma totalidade dos candidatos concorrentes

                                            24

                                            24 APPROVAL VOTING SYSTEM

                                            No meacutetodo Approval Voting os eleitores natildeo satildeo limitados pelo nuacutemero de candidatosem que podem votar por isso approval cada eleitor pode votar em todos os candidatos osquais ele aprova Apoacutes as votaccedilotildees o candidato com a maior quantidade de votos eacute eleitoSegundo Hamlin (2015) a cidade de Fargo na Dakota do Norte se tornou a primeiracidade nos EUA a colocar em praacutetica este sistema em suas eleiccedilotildees gerais em novembrode 2018 AVS tambeacutem eacute utilizado para eleger o secretaacuterio-geral das Naccedilotildees Unidas e emdiversas outras organizaccedilotildees

                                            241 Exemplo

                                            Na tabela 5 abaixo pode-se encontrar 8 perfis de eleitores com seus candidatos apro-vados e quantidade de eleitores que se encaixam no perfil Na tabela 6 temos o resultadoda contabilizaccedilatildeo dos votos destes perfis O candidato mais popular eacute o B que se encontraaprovado em 5 perfis distintos totalizando 60 votos ou aproximadamente 32

                                            Tabela 5 ndash Exemplo AVS

                                            Aprovaccedilotildees Ndeg de eleitoresA 20AB 16B 19

                                            BDC 6CAB 7CD 15DC 5DCB 12

                                            Tabela 6 ndash Resultado AVSCandidatos Total de votos

                                            A 43B 60C 45D 38

                                            242 Vantagens e Desvantagens do AVS

                                            Aleacutem de simples este meacutetodo permite um niacutevel maior de expressividade aos eleitoresOnde no FPTP e TRS eles satildeo limitados pelo seu uacutenico voto aqui os eleitores tecircm aliberdade de demonstrar exatamente quais candidatos consideram aptos ou aceitaacuteveis aocargo

                                            25

                                            Outro efeito dessa liberdade trazida pelo AVS eacute a dizimaccedilatildeo do spoiler effect Can-didatos de partidos menores natildeo tem como roubar votos de partidos maiores nessesistema ambos os candidatos contabilizariam o voto

                                            243 Voto Uacutetil no AVS

                                            O tipo de voto uacutetil no AVS eacute denominado bullet voting Segundo The Center forElection Science (2015) esta taacutetica envolve simplesmente ignorar a possibilidade de votarem mais de um candidato e votar apenas em sua primeira opccedilatildeo Um eleitor pode serlevado a adotar essa estrateacutegia quando percebe que sua preferecircncia pode ser prejudicadacom o voto em alguma segunda opccedilatildeo sua Em um cenaacuterio extremo onde 100 doseleitores adotam esta estrateacutegia as eleiccedilotildees satildeo convertidas a um simples First Past ThePost

                                            25 THE BORDA COUNT

                                            Este meacutetodo carrega o nome em homenagem a seu criador Jean-Charles de Bordaque o desenvolveu em 1770 (LIPPMAN 2012) A contagem de Borda utiliza a abordagemde ranqueamento dos candidatos poreacutem de maneira diferente ao IRV Este eacute um sistemaque atribui uma pontuaccedilatildeo aos candidatos com base nestes rankings O candidato na basedo ranking natildeo recebe pontos o candidato imediatamente acima deste recebe 1 pontoo proacuteximo recebe 2 pontos e assim por diante ateacute o topo do ranking As pontuaccedilotildees detodos os rankings satildeo contabilizadas e o candidato com maior pontuaccedilatildeo eacute eleito Deacordo com Lippman variaccedilotildees deste meacutetodo satildeo encontradas em uso na premiaccedilatildeo dediversos esportes como na seleccedilatildeo do MVP(Most Valuable Player) da MLB(principal ligade beisebol dos EUA) e no Trofeacuteu Heisman de futebol americano universitaacuterio

                                            251 Exemplo

                                            Neste exemplo seratildeo aproveitados os mesmos rankings apresentados na tabela 3 Porserem 4 candidatos o primeiro colocado de cada ranking receberaacute 3 pontos o segundo 2pontos o terceiro 1 e o quarto 0 Assim o nuacutemero maacuteximo de pontos que um candidatopode atingir eacute igual a 300(se ficar na primeira posiccedilatildeo em todos os rankings) e o nuacutemerototal de pontos no sistema eacute 600 O nuacutemero maacuteximo de pontos que um candidato podeatingir eacute calculado com

                                            (cminus 1)times e

                                            Sendo c igual ao nuacutemero de candidatos e e o nuacutemero de eleitores Por sua vez onuacutemero total de pontos no sistema eacute

                                            26

                                            (cminus 1)times c2

                                            times e

                                            A contagem final dos pontos eacute apresentada na tabela 7 abaixo

                                            Tabela 7 ndash Resultado BCCandidatos Total de pontos

                                            A 146B 181C 126D 147

                                            O candidato eleito eacute o B com 181 pontos ou aproximadamente 60 da pontuaccedilatildeomaacutexima

                                            252 Vantagens e Desvantagens do BC

                                            Em comparaccedilatildeo com os meacutetodos abordados anteriormente que apenas consideramas primeiras opccedilotildees de cada eleitor este meacutetodo regularmente escolhe candidatos comaceitaccedilatildeo mais ampla ao inveacutes de uma preferecircncia direta dos eleitores (Electoral ReformSociety 2017b)

                                            Ele tambeacutem encoraja uma abordagem estrateacutegica por parte dos partidos onde seriade seu interesse nomear mais de um candidato para concorrer pois quanto mais candi-datos estatildeo no paacutereo maior eacute a pontuaccedilatildeo dos primeiros colocados Logo a nomeaccedilatildeo decandidatos menos populares pode beneficiar os principais candidatos de um partido

                                            253 Voto Uacutetil no BC

                                            Existem duas estrateacutegias aplicaacuteveis a esse sistema A primeira denominada compromi-sing de maneira similar a outros meacutetodos de votaccedilatildeo se resume em ranquear em primeirolugar um dos candidatos que estejam liderando as eleiccedilotildees mesmo que este natildeo seja suapreferecircncia real A segunda estrateacutegia burying eacute o oposto esta se baseia em ranquearem uacuteltimo lugar um dos candidatos liacutederes mesmo que este natildeo seja o seu candidato demaior desgosto Ambas estrateacutegias podem ser aplicadas ao mesmo tempo por um eleitor

                                            26 SCORE VOTING SYSTEM

                                            Score Voting ou Range Voting como tambeacutem eacute conhecido eacute mais um meacutetodo quetenta trazer maior liberdade de expressatildeo aos eleitores Assim como o Borda Counteste sistema funciona baseado na pontuaccedilatildeo dos candidatos no entanto ao inveacutes dessapontuaccedilatildeo ser relativa agrave posiccedilatildeo do candidato no ranking de cada eleitor este por sua veztem completa liberdade de atribuir qualquer quantidade de pontos aos candidatos dentro

                                            27

                                            de determinada escala Um eleitor pode dar o mesmo nuacutemero de pontos para diferentescandidatos e apoacutes o somatoacuterio de todas as pontuaccedilotildees o candidato com a pontuaccedilatildeo maisalta eacute eleito Incorporado ao escopo poliacutetico o SVS eacute utilizado no Partido Pirata Alematildeobem como em diversas organizaccedilotildees tais como o Fedora Project e Mozilla e tambeacutem emvariados esportes oliacutempicos e reality shows como o American Idol aponta Hamlin (2015)

                                            261 Exemplo

                                            Neste exemplo temos apresentados na tabela 8 abaixo 4 perfis distintos de eleitorese suas respectivas atribuiccedilotildees de pontos aos 4 candidatos Cada eleitor pode atribuirqualquer pontuaccedilatildeo a um candidato dentro da escala de -10 a 10 O resultado da eleiccedilatildeoapoacutes a soma de todos os pontos por candidato se encontra na tabela 9 onde o candidatoA eacute eleito com um total de 605 pontos

                                            Tabela 8 ndash Exemplo SVS

                                            Perfil A B C D Ndeg de eleitores1 10 -1 5 2 362 6 9 -3 4 253 2 0 8 4 224 3 3 3 10 17

                                            Tabela 9 ndash Resultado SVSCandidatos Total de pontos

                                            A 605B 240C 332D 430

                                            262 Vantagens e Desvantagens do SVS

                                            A grande vantagem do SVS eacute como ele proporciona aos eleitores expressar de maneiramuito proacutexima potencialmente exata suas impressotildees poliacuteticas de cada candidato Eleeacute ainda mais expressivo que o AVS Dessa maneira o spoiler effect tambeacutem se torna nuloao passo que toda intenccedilatildeo de voto eacute precisamente representada neste sistema

                                            Assim como outros meacutetodos eleitorais este sofre igualmente dos males produzidos pelovoto taacutetico Sua principal desvantagem eacute discutida na seccedilatildeo abaixo

                                            263 Voto Uacutetil no SVS

                                            Da mesma maneira que no Approval Voting atraveacutes do bullet voting o SVS tambeacutempode ser convertido em uma eleiccedilatildeo sob o meacutetodo FPTP em um cenaacuterio com um grande

                                            28

                                            volume de eleitores maliciosos O voto uacutetil sob este sistema se manifesta pontuando-seapenas um candidato com uma nota positiva e todos os outros com as notas mais baixasda escala Se todos os eleitores se aproveitarem dessa abordagem natildeo existiraacute distinccedilatildeoefetiva entre uma eleiccedilatildeo sob SVS e FPTP Essencialmente cada eleitor estaacute votando emapenas um candidato Essa eacute a principal desvantagem do SVS e ela consegue eliminarsua principal vantagem dar ao eleitor um poder maior de expressatildeo

                                            27 BLOC VOTE

                                            O Bloc Vote eacute um meacutetodo utilizado para a eleiccedilatildeo de candidatos a cargos no governocom mais de uma vacacircncia Pode ser considerado um meio-termo entre o FPTP e oAVS pois os eleitores podem votar em mais de um candidato poreacutem satildeo limitados pelonuacutemero de vagas Em uma eleiccedilatildeo com duas vagas por exemplo cada eleitor selecionaraacutedois candidatos ou menos Sensatamente o candidato mais votado eacute eleito Ele possuialgumas utilizaccedilotildees em eleiccedilotildees locais em algumas partes da Inglaterra (Electoral ReformSociety 2017a)

                                            271 Exemplo

                                            Neste exemplo dois candidatos seratildeo eleitos logo cada eleitor votaraacute em no maacuteximodois candidatos A distribuiccedilatildeo de votos pode ser conferida na tabela 10 e o resultado dacontagem de votos na tabela 11 abaixo Os candidatos eleitos satildeo o C totalizando 78do maacuteximo de votos possiacuteveis para um candidato e o A com 43

                                            Tabela 10 ndash Exemplo BV

                                            Aprovaccedilotildees Ndeg de eleitoresAC 20AB 16BC 19BD 6CA 7CD 15DC 17

                                            Tabela 11 ndash Resultado BVCandidatos Total de votos

                                            A 43B 41C 78D 38

                                            29

                                            272 Voto Uacutetil no BV

                                            Neste sistema eacute possiacutevel que um eleitor evite votar em sua primeira opccedilatildeo quandoeste natildeo tem chances de vitoacuteria e se fazendo isto ele diminuiraacute as chances de algum outrocandidato de seu desgosto ganhar Poreacutem o sistema previne um outro tipo de voto uacutetilEm eleiccedilotildees com mais de uma vaga onde os eleitores soacute podem votar em um candidatose um eleitor sabe que sua primeira opccedilatildeo tambeacutem eacute a primeira opccedilatildeo da maior parteda populaccedilatildeo e portanto muito provavelmente seraacute um dos candidatos eleitos eacute possiacutevelque ele arrisque votar em uma segunda opccedilatildeo sua na esperanccedila de a longo prazo elegersuas duas principais opccedilotildees de voto Com os eleitores podendo votar no nuacutemero exato devagas disponiacuteveis esse tipo de pensamento taacutetico perde o sentido

                                            30

                                            3 O SIMULADOR

                                            Para este trabalho foi implementado um simulador eleitoral na forma de uma aplicaccedilatildeoweb para que a interaccedilatildeo do usuaacuterio fosse facilitada Veremos a seguir como se daacute suautilizaccedilatildeo de forma geral

                                            Figura 2 ndash Captura de tela 1

                                            Figura 3 ndash Captura de tela 2

                                            A primeira opccedilatildeo encontrada pelo usuaacuterio eacute a escolha de quais sistemas de votaccedilatildeo se-ratildeo simulados (Figura 2) Todos eles podem ser selecionados para rodar simultaneamentePoreacutem natildeo eacute permitido rodar uma simulaccedilatildeo do Bloc Vote para uma eleiccedilatildeo onde apenasum candidato eacute eleito aleacutem disso natildeo existe implementaccedilatildeo dos meacutetodos TRS e IRV para

                                            31

                                            eleiccedilotildees com mais de um candidato eleito jaacute que eles se comportariam exatamente comono FPTP

                                            A maioria das linguagens de programaccedilatildeo senatildeo todas possuem um gerador de nuacuteme-ros pseudoaleatoacuterios que fornece a possibilidade de definir uma seed para o gerador Estaseed funciona como um ponto de partida para a geraccedilatildeo dos nuacutemero e portanto todasimulaccedilatildeo que rodar com a mesma seed sempre teraacute os mesmos resultados Se nenhumvalor for fornecido pelo usuaacuterio o tempo atual do sistema eacute utilizado As opccedilotildees subse-quentes satildeo a escolha do nuacutemero de eleitores gerados e o nuacutemero de vagas (Figura 3) Senenhum valor for fornecido o nuacutemero de eleitores padratildeo utilizado eacute 1000 e o nuacutemero devagas igual a 1

                                            Figura 4 ndash Captura de tela 3

                                            Este simulador possui dois modos para a criaccedilatildeo dos rankings dos eleitores No modoManipulate (Figura 4) primeiramente se define o nuacutemero de candidatos atraveacutes do campode entrada ao lado do tiacutetulo Candidates ou alternativamente pode-se adicionar candida-tos um a um atraveacutes do sinal de mais na parte inferior da paacutegina Para cada candidatoeacute possiacutevel definir a porcentagem de seus eleitores que optaraacute pelo voto taacutetico e pelovoto de minoria Tambeacutem eacute possiacutevel alterar o nome dos candidatos se for do interessedo usuaacuterio

                                            32

                                            Figura 5 ndash Captura de tela 4

                                            Figura 6 ndash Captura de tela 5

                                            33

                                            Figura 7 ndash Captura de tela 6

                                            Apoacutes a criaccedilatildeo dos candidatos o usuaacuterio pode criar perfis de eleitores que definiratildeo demaneira exata como partes da populaccedilatildeo iraacute votar (Figura 5) Em cada perfil se defineo valor em porcentos da populaccedilatildeo votante que o adotaraacute e a nota de cada candidatoTambeacutem eacute possiacutevel nomear cada perfil livremente

                                            No modo Generate (Figura 6) eacute onde o gerador de nuacutemeros pseudoaleatoacuterios eacute usadoNesse modo ao inveacutes do usuaacuterio criar perfis de eleitores ele define qual seraacute a distribuiccedilatildeoadotada para a geraccedilatildeo de notas de cada candidato Essas distribuiccedilotildees seratildeo mais bemdetalhadas no Capiacutetulo 5 Da mesma maneira que no modo Manipulate nesse modotambeacutem eacute possiacutevel definir os valores para os dois tipos de voto uacutetil os votos taacuteticos eos votos de minoria No primeiro estatildeo incluiacutedas as estrateacutegias de mudanccedila de votoespeciacuteficas de cada sistema como o bullet voting no AVS e SVS ou quando a preferecircnciade um eleitor claramente natildeo possui chances de vitoacuteria e ele muda seu voto para um doscandidatos que esteja na lideranccedila o que ocorre no FPTP e TRS O voto de minoriase apresenta apenas no FPTP em eleiccedilotildees onde mais de um candidato eacute eleito Se apreferecircncia de um eleitor claramente lidera a eleiccedilatildeo por ser tambeacutem a preferecircncia damaior parte da populaccedilatildeo esse eleitor pode mudar o seu voto para uma segunda opccedilatildeona esperanccedila de eleger dois de seus candidatos favoritos

                                            Por fim em ambos os modos o usuaacuterio tem a opccedilatildeo de definir coalizotildees entre oscandidatos se o sistema TRS estiver habilitado pois as coalizotildees apenas se manifestamnesse sistema Essas coalizotildees alteraratildeo as notas dos candidatos dependendo dos outroscandidatos pertencentes a elas (Figura 7)

                                            A aplicaccedilatildeo pode ser encontrada na paacutegina httpelectionsimpythonanywherecom

                                            34

                                            4 CENAacuteRIOS PERTINENTES

                                            Para todos os cenaacuterios deste capiacutetulo seraacute usada a seed do simulador igual a 100 e apopulaccedilatildeo de eleitores igual a 1000 para que exista consistecircncia na anaacutelise e tambeacutem paraque possa haver replicaccedilatildeo dos resultados se necessaacuterio

                                            41 CENAacuteRIO 1 VOTO TAacuteTICO

                                            Neste exemplo teremos quatro candidatos Ana Beto Carla e Diego Ana e Betoseratildeo gerados a partir da distribuiccedilatildeo Neutral (Figura 47) Carla da distribuiccedilatildeo Disliked(Figura 51) e Diego da Hated (Figura 55) Para a simulaccedilatildeo com a seed 100 o melhorcandidato a ser eleito ou seja aquele que maximiza a meacutedia das notas dos eleitores eacute oBeto com uma meacutedia de 0073 Para cada sistema seratildeo comparados os resultados semvoto taacutetico aos com 20 de voto taacutetico a favor da Ana Abaixo se encontram osresultados para o sistema FPTP

                                            Figura 8 ndash FPTP - Cenaacuterio 1 sem voto taacutetico

                                            Figura 9 ndash TRS segundo turno - Cenaacuterio 1 sem voto taacutetico

                                            35

                                            Figura 10 ndash IRV primeiro turno - Cenaacuterio 1

                                            Figura 11 ndash IRV segundo turno - Cenaacuterio 1

                                            Figura 12 ndash IRV terceiro turno - Cenaacuterio 1

                                            36

                                            Figura 13 ndash AVS - Cenaacuterio 1 sem voto taacutetico

                                            Figura 14 ndash BC - Cenaacuterio 1 sem voto taacutetico

                                            Figura 15 ndash SVS - Cenaacuterio 1 sem voto taacutetico

                                            37

                                            Nesse cenaacuterio sem voto taacutetico o uacutenico sistema que natildeo elege o Beto eacute o AVS Todosos outros elegem o melhor candidato Ou seja apesar de Beto ter uma melhor meacutediadas notas dos eleitores existem mais eleitores que ranqueiam Ana com uma nota acimade 0 No entanto apenas 20 dos eleitores de Diego e Carla que preferem a Ana aoinveacutes do Beto satildeo o suficiente para fazer Beto natildeo ser eleito se eles decidirem abandonarsua primeira opccedilatildeo e votar na Ana Considerando a vantagem que os votos taacuteticosproporcionam agrave Ana esta eacute eleita em todos os sistemas menos o TRS e o IRV

                                            Figura 16 ndash FPTP - Cenaacuterio 1 - 20 de voto taacutetico na Ana

                                            Figura 17 ndash TRS segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                            38

                                            Figura 18 ndash IRV primeiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                            Figura 19 ndash IRV segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                            Figura 20 ndash IRV terceiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                            39

                                            Figura 21 ndash AVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                                            Figura 22 ndash BC - Cenaacuterio 1 20 de voto taacutetico na Ana

                                            Figura 23 ndash SVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                                            40

                                            Eacute claro que se os eleitores que preferem o Beto tambeacutem votassem de maneira estra-teacutegica a situaccedilatildeo se equilibraria e haveria o mesmo niacutevel de concorrecircncia entre os doiscandidatos que ocorre quando natildeo haacute voto taacutetico Poreacutem no Borda Count esse equiliacute-brio pode natildeo acontecer e as estrateacutegias de compromising e burying podem acabar saindopela culatra se uma porcentagem elevada dos eleitores as adotarem Abaixo encontram-seos resultados para esse sistema quando 100 dos eleitores de Carla e Diego se comportammaliciosamente

                                            Figura 24 ndash BC - Cenaacuterio 1 100 de voto taacutetico na Ana e Beto

                                            Por causa do uso demasiado da estrateacutegia burying Ana e Beto perdem muitos pontose isso abre espaccedilo para uma vitoacuteria da Carla No entanto para porcentagens menores que100 o Beto ainda eacute o vencedor

                                            Essas duas estrateacutegias tambeacutem foram implementadas nesse simulador para o sistemaIRV e eacute possiacutevel ver como ele eacute resistente a elas Para que seja possiacutevel mudar os resultadosde uma eleiccedilatildeo sob o IRV eacute necessaacuterio mudar a ordem de eliminaccedilatildeo dos candidatos paraque o seu candidato preferido acabe enfrentando um candidato mais fraco nas rodadasfinais Isso natildeo ocorre com compromising e burying No proacuteximo cenaacuterio seraacute analisadacomo eacute possiacutevel modificar os resultados de uma eleiccedilatildeo sob o IRV

                                            Esses resultados podem ser replicados acessando os linksSem votos taacuteticos lthttpelectionsimpythonanywherecomdirect_res1111110

                                            --[0021][22Ana2222Beto222022Carla2222Diego22]------100gt

                                            Com 20 de voto taacutetico lthttpelectionsimpythonanywherecomdirect_res1111110--[0021][22Ana222022Beto2222Carla2222Diego22]1-[02000]---100gt

                                            Com 100 de voto taacuteticona Ana e Beto lthttpelectionsimpythonanywherecomdirect_res0000100--[0021][22Ana222022Beto222022Carla2222Diego22]1-[101000]---100gt

                                            41

                                            42 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV

                                            Neste cenaacuterio teremos Ana Carla e Beto concorrendo e trecircs perfis distintos que apoiamcada candidato As distribuiccedilotildees de notas dos perfis se encontram na tabela abaixo

                                            Tabela 12 ndash Distribuiccedilatildeo de notas - Cenaacuterio 2

                                            Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                            deeleitores

                                            1 10 5 0 422 0 10 5 303 5 0 10 28

                                            Com essas distribuiccedilotildees Carla eacute eliminada na primeira rodada e seus 28 de votossatildeo transferidos para a segunda opccedilatildeo de seus eleitores Ana que eacute eleita com 70 dosvotos e uma meacutedia de 56

                                            Figura 25 ndash IRV primeiro turno - Cenaacuterio 2

                                            Figura 26 ndash IRV segundo turno - Cenaacuterio 2

                                            42

                                            Cientes desse provaacutevel futuro cenaacuterio onde Ana eacute eleita uma pequena parte dos elei-tores de Beto estrategicamente o abandona e decide apoiar Carla na esperanccedila de leva-laao segundo turno contra Ana As novas distribuiccedilotildees de notas se encontram na tabelaabaixo com essa porccedilatildeo de eleitores representada pelo perfil 4

                                            Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2

                                            Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                            deeleitores

                                            1 10 5 0 422 0 10 5 283 5 0 10 284 0 8 10 2

                                            Essa mudanccedila estrateacutegica de voto altera a ordem de eliminaccedilotildees do sistema com Betosendo o primeiro a ser eliminado Com isso seus votos satildeo naturalmente transferidos paraCarla que derrota Ana no segundo turno com 58 dos votos

                                            Figura 27 ndash IRV primeiro turno com voto taacutetico - Cenaacuterio 2

                                            Figura 28 ndash IRV segundo turno com voto taacutetico - Cenaacuterio 2

                                            43

                                            Percebendo que a eleiccedilatildeo de Beto natildeo era provaacutevel seus eleitores conseguiram aomenos impedir a eleiccedilatildeo do pior candidato para eles Mas para isso foi necessaacuterio queeles tivessem a informaccedilatildeo de como os outros eleitores votariam Uma aproximaccedilatildeo dessasinformaccedilotildees poderia ser obtida em um cenaacuterio real com poucos candidatos atraveacutes depesquisas eleitorais poreacutem se o nuacutemero de candidatos eacute significativo uma noccedilatildeo completadas distribuiccedilotildees dos rankings dos eleitores se torna muito menos viaacutevel e dificulta aformulaccedilatildeo de estrateacutegias para alterar a ordem em que os candidatos satildeo eliminados

                                            Esses resultados podem ser replicados acessando os linksSem voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana22

                                            22Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                            Com voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana

                                            2222Beto2222Carla22]-----42Voter20Profile2001020520028Voter20Profile2010201020528Voter20Profile202520020102Voter20Profile20302082010100gt

                                            43 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE

                                            O interessante dos sistemas IRV e TRS eacute que os resultados do cenaacuterio anterior po-deriam ter sido obtidos ao inveacutes do voto taacutetico pela sua natildeo-monotonicidade Seriapossiacutevel que a Carla derrotasse a Ana no segundo turno atraveacutes do proacuteprio aumento depopularidade da Ana Assumindo que essa popularizaccedilatildeo ocorresse entre os candidatosdo perfil 2 onde 3 passasse a apoiar a Ana ao inveacutes do Beto as novas distribuiccedilotildeesseguiriam a tabela abaixo

                                            Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                            Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                            deeleitores

                                            1 10 5 0 452 0 10 5 273 5 0 10 28

                                            Dessa maneira Beto agora com uma porcentagem dos eleitores menor do que a deCarla seraacute eliminado na primeira rodada e como seus eleitores tecircm a Carla como segundaopccedilatildeo ela receberaacute todos os seus votos e seraacute eleita na segunda rodada As rodadas doIRV podem ser vistas nas figuras 29 e 30

                                            44

                                            Figura 29 ndash IRV primeiro turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                            Figura 30 ndash IRV segundo turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                            Tabela 15 ndash Resultados do Cenaacuterio 3Candidato

                                            eleitoMeacutedia das

                                            notasAntes da

                                            popularizaccedilatildeode Ana

                                            Ana 56

                                            Apoacutespopularizaccedilatildeo

                                            de AnaCarla 415

                                            Os efeitos dessa caracteriacutestica se refletem na satisfaccedilatildeo meacutedia da populaccedilatildeo A Ana eacuteclaramente a melhor candidata e mesmo com o seu ganho de popularidade (ou devido aele) a Carla eacute eleita

                                            Esses resultados podem ser replicados acessando os linksAntes da popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecom

                                            direct_res0010000---[22Ana2222Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                            45

                                            Apoacutes popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana2222Beto2222Carla22]-----45Voter20Profile2001020520027Voter20Profile2010201020528Voter20Profile20252002010100gt

                                            44 CENAacuteRIO 4 COALIZOtildeES

                                            O TRS por ser organizado em dois turnos separados normalmente a semanas dedistacircncia um do outro acaba abrindo brecha agrave mudanccedila de opiniatildeo por parte dos eleitorese o desenvolvimento de novas estrateacutegias por parte dos candidatos tais como a coalizatildeocom candidatos jaacute eliminados Com isso em mente nesse cenaacuterio teremos novamenteos quatro candidatos Ana Beto Carla e Diego Os trecircs primeiros seratildeo gerados dadistribuiccedilatildeo Neutral e Diego da distribuiccedilatildeo Disliked

                                            Figura 31 ndash TRS turno 1 - Cenaacuterio 4

                                            No TRS normal Ana Beto e Carla possuem com essas distribuiccedilotildees quantidades devotos muito proacuteximas com Beto e Carla indo para o segundo turno Carla estaacute 10 votosatraacutes de Beto e decide aproveitar o espaccedilo de tempo entre os dois turnos para tentaragregar mais votos Com isso Carla se aproxima de Diego e juntos formam uma coalizatildeoNo entanto com sua baixa popularidade Diego acaba ferindo a reputaccedilatildeo de Carla etorna o segundo turno muito mais faacutecil para Beto (Figura 33) Se Carla tivesse buscado osuporte de Ana por outro lado ela se veria vitoriosa no segundo turno e com uma amplavantagem sobre o Beto (Figura 34) Ou ateacute mesmo sem buscar uma coalizatildeo mesmosendo uma corrida apertada Carla teria naturalmente sido eleita (Figura 32)

                                            Esses resultados podem ser replicados acessando os linksSem coalizotildees lthttpelectionsimpythonanywherecomdirect_res0100000

                                            --[0002][22Ana222022Beto2222Carla2222Diego22]------100gt

                                            46

                                            Figura 32 ndash TRS turno 2 - Cenaacuterio 4

                                            Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4

                                            Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4

                                            47

                                            Coalizatildeo Carla e Diego lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2203Carla20Diego-100gt

                                            Coalizatildeo Carla e Ana lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2200Carla20Ana-100gt

                                            45 CENAacuteRIO 5 DILEMA DO PRISIONEIRO

                                            Neste cenaacuterio temos uma eleiccedilatildeo de uma vaga com trecircs candidatos concorrentes e trecircsperfis distintos de eleitores que seguiratildeo as seguintes distribuiccedilotildees

                                            Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5

                                            Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                            deeleitores

                                            1 10 -10 5 362 -10 10 5 343 -10 -10 5 30

                                            Esse contexto nos remete ao notaacutevel dilema do prisioneiro Nele dois prisioneiroscuacutemplices satildeo interrogados individualmente sem poder se comunicar um com o outro ecada um enfrenta o dilema de delatar ou natildeo o seu parceiro Se os dois prisioneirosdecidem se manter calados sobre o crime ambos satildeo sentenciados a um ano de prisatildeo Seapenas um deles dedurar o outro o traidor sai livre enquanto seu parceiro eacute condenadoa trecircs anos Se ambos dedurarem um ao outro eles satildeo condenados juntos a dois anosde prisatildeo Esse dilema eacute uma ideia claacutessica presente no estudo da teoria dos jogos sendooriginalmente elaborada por Merrill Flood e Melvin Dresher em 1950 e mais tarde sendonomeada de dilema dos prisioneiros por Albert W Tucker (POUNDSTONE 1992)

                                            O que esse dilema nos mostra eacute a tentaccedilatildeo que o indiviacuteduo deteacutem se sua racionalizaccedilatildeoestiver voltada para seus proacuteprios interesses e somente eles em oposiccedilatildeo a pensar no bemdo grupo como um todo Neste cenaacuterio encontramos dois grupos de eleitores expressiva-mente opostos os perfis 1 e 2 Se qualquer uma das preferecircncias desses perfis fosse eleitaisso significaria uma alta rejeiccedilatildeo de maior parte da populaccedilatildeo No entanto eles possuema segunda opccedilatildeo em comum a Carla que por sua vez eacute a preferecircncia do terceiro perfilPortanto a eleiccedilatildeo da Carla seria logicamente o resultado oacutetimo

                                            Mesmo assim a Ana eacute eleita nos dois sistemas acima o que natildeo parece justo poispela tabela 16 eacute evidente que apenas 36 da populaccedilatildeo a aprova enquanto que os outros64 a reprovam ao maacuteximo O sistema IRV se comporta de maneira idecircntica ao TRS

                                            48

                                            Figura 35 ndash FPTP - Cenaacuterio 5

                                            Figura 36 ndash TRS segundo turno - Cenaacuterio 5

                                            nesta situaccedilatildeo Com esse resultado a meacutedia das notas eacute -28 No entanto os trecircs sistemasseguintes nos apresentam resultados diferentes

                                            Tabela 17 ndash Resultados do Cenaacuterio 5

                                            Sistema Candidatoeleito

                                            Meacutedia dasnotas

                                            FPTP Ana -28TRS Ana -28IRV Ana -28AVS Carla 50BC Carla 50SVS Carla 50

                                            49

                                            Figura 37 ndash AVS - Cenaacuterio 5

                                            Figura 38 ndash BC - Cenaacuterio 5

                                            Tanto o AVS quanto o Borda Count e o SVS satildeo sistemas que consideram todasas opiniotildees de cada eleitor ao mesmo tempo e por isso satildeo capazes de eleger o melhorcandidato nesta situaccedilatildeo diferentemente do TRS que natildeo absorve completamente todosentimento do eleitor por todos os candidatos e o IRV que apesar de ser bem expressivoquebra esse processo em inuacutemeras rodadas o que permite a perda de informaccedilatildeo ao longodelas

                                            Esses resultados podem ser replicados acessando o linklthttpelectionsimpythonanywherecomdirect_res1111110---[22Ana

                                            222022Beto222022Carla22]-----36Voter20Profile2001020-1020534Voter20Profile201-10201020530Voter20Profile202-1020-10205100gt

                                            50

                                            Figura 39 ndash SVS - Cenaacuterio 5

                                            46 CENAacuteRIO 6 VOTO DE MINORIA

                                            Neste cenaacuterio temos uma eleiccedilatildeo com quatro candidatos e duas vagas A Ana seraacutea preferecircncia de uma extensa parte da populaccedilatildeo (distribuiccedilatildeo Loved Figura 53) Betoe Carla seratildeo candidatos razoavelmente populares (distribuiccedilatildeo Neutral Figura 47) eDiego seraacute a preferecircncia de apenas um pequeno grupo especiacutefico e rejeitado pela maioria(distribuiccedilatildeo Disliked Figura 51) Eacute intuitivo esperar que os dois candidatos eleitos seratildeoa Ana e ou o Beto ou a Carla e isso eacute exatamente o que ocorre na figura 40 no sistemaFPTP sem voto de minoria

                                            Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria

                                            Eacute evidente a discrepacircncia da quantidade de votos da Ana para os outros candidatose apesar de Beto e Carla serem mais populares que Diego os trecircs natildeo se encontrammuito afastados Poreacutem se a pequena fraccedilatildeo de candidatos que possuem a Ana como

                                            51

                                            Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego

                                            preferecircncia e Diego como segunda opccedilatildeo optarem pelo voto de minoria a situaccedilatildeo mudacompletamente (Figura 41) Assim apesar de extensamente rejeitado Diego conquistaa segunda vaga e a meacutedia das notas despenca de 2929 para 0505 No entanto aindaexiste um cenaacuterio pior Se os outros grupos de eleitores pensarem da mesma forma eevitarem votar na Ana achando que sua eleiccedilatildeo jaacute estaacute assegurada apenas 80 de votode minoria para esses grupos jaacute eacute o suficiente para eliminaacute-la das eleiccedilotildees (Figura 42)Com a Ana eliminada a meacutedia das notas cai ainda mais para 0058

                                            Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego

                                            O sistema Bloc Vote eacute uma das soluccedilotildees para o voto de minoria Permitindo queos eleitores votem no mesmo nuacutemero de candidatos que de vagas a serem preenchidasnatildeo existe o iacutempeto a esse tipo de voto estrateacutegico O resultado desse sistema portantoretorna a meacutedia das notas a casa dos 29 (Figura 43) Os sistemas AVS Borda Count eSVS tambeacutem impedem a presenccedila do voto de minoria e atingem resultados semelhantes

                                            52

                                            Figura 43 ndash BV - Cenaacuterio 6

                                            Tabela 18 ndash Resultados do Cenaacuterio 6

                                            Sistema Candidatoseleitos

                                            Meacutedia dasnotas

                                            FPTP sem voto de minoriaAna eBeto 2929

                                            FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

                                            FPTP com 80 de voto de minoriaBeto eCarla 0058

                                            Bloc VoteAna eCarla 2913

                                            Esses resultados podem ser replicados acessando os links

                                            Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

                                            100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

                                            80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

                                            53

                                            5 COMO FUNCIONA O SIMULADOR

                                            O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

                                            51 CLASSE ELECTIONS

                                            Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

                                            bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

                                            Figura 44 ndash estrutura candidates

                                            bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

                                            bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

                                            Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

                                            Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

                                            54

                                            Figura 45 ndash estrutura voters

                                            Figura 46 ndash estrutura votes

                                            daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

                                            Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

                                            55

                                            Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

                                            Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

                                            na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

                                            56

                                            Figura 49 ndash PDF - Distribuiccedilatildeo Liked

                                            Figura 50 ndash CDF - Distribuiccedilatildeo Liked

                                            (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

                                            Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

                                            57

                                            Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

                                            Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

                                            candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

                                            Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

                                            58

                                            Figura 53 ndash PDF - Distribuiccedilatildeo Loved

                                            Figura 54 ndash CDF - Distribuiccedilatildeo Loved

                                            funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

                                            59

                                            Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                                            Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                                            Meacutedia das Notas sumei

                                            sumvj nij

                                            etimes v

                                            Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                                            Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                                            60

                                            Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                                            Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                                            52 CLASSE FIRSTPASTTHEPOST

                                            Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                                            Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                                            61

                                            Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                                            Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                                            mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                                            62

                                            53 CLASSE TWOROUNDSYSTEM

                                            A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                                            54 CLASSE INSTANTRUNOFFVOTING

                                            A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                                            Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                                            63

                                            cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                                            55 CLASSE APPROVALVOTING

                                            Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                                            56 CLASSE BORDACOUNT

                                            Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                                            57 CLASSE SCOREVOTING

                                            De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                                            64

                                            58 CLASSE BLOCVOTE

                                            O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                                            59 TECNOLOGIAS UTILIZADAS

                                            A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                                            Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                                            O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                                            Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                                            65

                                            6 CONCLUSAtildeO

                                            Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                                            Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                                            Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                                            Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                                            Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                                            66

                                            REFEREcircNCIAS

                                            AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                                            Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                                            Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                                            Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                                            HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                                            LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                                            ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                                            Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                                            POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                                            The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                                            67

                                            APEcircNDICES

                                            APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                            Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                            if(not len(selfvoter_profiles))

                                            for voter in range(selfN_VOTERS)

                                            candidates_rank = dict()

                                            for candidate in reversed(range(selfN_CANDIDATES))

                                            if(selfBIAS_VECTOR[candidate]==4)

                                            candidates_rank[candidate] = self_sortear(selfloved)

                                            elif(selfBIAS_VECTOR[candidate]==3)

                                            candidates_rank[candidate] = self_sortear(selfliked)

                                            elif(selfBIAS_VECTOR[candidate]==2)

                                            candidates_rank[candidate] = self_sortear(selfdisliked)

                                            elif(selfBIAS_VECTOR[candidate]==1)

                                            candidates_rank[candidate] = self_sortear(selfhated)

                                            elif(selfBIAS_VECTOR[candidate]==-1)

                                            candidates_rank[candidate] = self_sortear(selfpolarizer

                                            )

                                            elif(selfBIAS_VECTOR[candidate]==-2)

                                            candidates_rank[candidate] = self_sortear(self

                                            more_polarizer)

                                            else

                                            candidates_rank[candidate] = self_sortear(selfneutral)

                                            selfvotersappend(candidates_rank)

                                            else

                                            ranges = []

                                            ranks = []

                                            for prof in selfvoter_profiles

                                            rangesappend(int(prof[pop_percentage]))

                                            rank =

                                            for index score in enumerate(prof[scores])

                                            rank[index] = score

                                            ranksappend(rank)

                                            for index _range in enumerate(ranges)

                                            for _ in range(int(selfN_VOTERS(_range100)))

                                            selfvotersappend(ranks[index])

                                            68

                                            APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                            Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                            for i in range(selfN_CANDIDATES)

                                            selfcandidates[i] = 0

                                            selfvotes[i] = set()

                                            APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                            Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                            for candidate in range(selfN_CANDIDATES)

                                            rating_sum = 0

                                            for voter in selfvoters

                                            rating_sum += voter[candidate]

                                            selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                            APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                            Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                            if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                            return selfcalculate_mean(winners)

                                            else

                                            chose_best = True if winners[0] == selfbest_candidate else

                                            False

                                            return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                            69

                                            APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                            Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                            rating_sum = 0

                                            for voter in selfvoters

                                            for candidate in winners

                                            rating_sum += voter[candidate]

                                            return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                            APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                            Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                            for i in range(1 selfN_VACANCIES + 2)

                                            selfleading_candidatesappend(selfsorted_candidates[-i][self

                                            CANDIDATE_INDEX])

                                            APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                            Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                            for leader in selfelecrounds[-1]

                                            selfleading_candidatesappend(leader[0])

                                            70

                                            APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                            Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                            self_account_for_coalitions()

                                            for voter in selfvoters

                                            selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                            (1)))

                                            temp = []

                                            for voter in selfsorted_voters

                                            new_dict = defaultdict(list)

                                            for k in voter

                                            new_dict[k[1]]append(k[0])

                                            tempappend(new_dict)

                                            selfsorted_voters = []

                                            for voter_index current_voter in enumerate(temp)

                                            new_voter = []

                                            for rating candidate_indexes in current_voteritems()

                                            if len(current_voter[rating]) gt 1

                                            shuffle(current_voter[rating])

                                            for e in candidate_indexes

                                            new_voterappend((e rating))

                                            else

                                            new_voterappend((candidate_indexes[0] rating))

                                            selfsorted_votersappend(new_voter)

                                            selfcandidates[new_voter[-1][0]] += 1

                                            selfvotes[new_voter[-1][0]]add(voter_index)

                                            71

                                            APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                            Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                            for candidate in selfvotes_copy

                                            if candidate not in selfelecleading_candidates

                                            for voter_index in selfvotes_copy[candidate]

                                            for index _candidate in enumerate(reversed(selfelec

                                            sorted_voters[voter_index]))

                                            if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                            leading_candidates

                                            if randomrandom() lt selfelec

                                            tactical_vote_percentages[_candidate[selfelec

                                            CANDIDATE_INDEX]]

                                            selfrankings_changed[voter_index] = copy

                                            deepcopy(selfelecsorted_voters[voter_index])

                                            selfrankings_changed[voter_index][-(index + 1)]

                                            selfrankings_changed[voter_index][-1] = self

                                            rankings_changed[voter_index][-1] self

                                            rankings_changed[voter_index][-(index + 1)]

                                            selfcandidates[candidate] -= 1

                                            selfcandidates[_candidate[selfelec

                                            CANDIDATE_INDEX]] += 1

                                            selfvotes[candidate]remove(voter_index)

                                            selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                            ]]add(voter_index)

                                            break

                                            break

                                            72

                                            APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                            Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                            half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                            for candidate in selfelecleading_candidates

                                            if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                            continue

                                            for voter_index in selfvotes_copy[candidate]

                                            if voter_index in selfrankings_changed

                                            ranking = selfrankings_changed[voter_index]

                                            else

                                            ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                            ])

                                            for index _candidate in enumerate(reversed(ranking))

                                            if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                            leading_candidates or (_candidate[selfelec

                                            CANDIDATE_INDEX] in selfelecleading_candidates and

                                            selfelecleading_candidatesindex(_candidate[selfelec

                                            CANDIDATE_INDEX]) gt= half_vacancies)

                                            if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                            if randomrandom() lt selfelec

                                            minority_vote_percentages[_candidate[selfelec

                                            CANDIDATE_INDEX]]

                                            selfcandidates[candidate] -= 1

                                            selfcandidates[_candidate[selfelec

                                            CANDIDATE_INDEX]] += 1

                                            break

                                            break

                                            break

                                            73

                                            APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                            Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                            self_account_for_coalitions()

                                            for candidate in selfvotes

                                            if candidate = selfwinner and candidate = selfsecond_place

                                            for voter_index in selfvotes[candidate]

                                            if voter_index in selfrankings_changed

                                            ranking = selfrankings_changed[voter_index]

                                            else

                                            ranking = copydeepcopy(selfelecsorted_voters[

                                            voter_index])

                                            for index2 candidate in enumerate(reversed(ranking))

                                            if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                            selfcandidates[selfwinner] += 1

                                            selfvotes[selfwinner]add(voter_index)

                                            break

                                            elif candidate[selfelecCANDIDATE_INDEX] == self

                                            second_place

                                            selfcandidates[selfsecond_place] += 1

                                            selfvotes[selfsecond_place]add(voter_index)

                                            break

                                            selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                            winners = []

                                            vacancies = selfelecN_VACANCIES

                                            for candidate in reversed(selfsorted_candidates)

                                            if vacancies == 0

                                            break

                                            winnersappend(candidate[0])

                                            vacancies -= 1

                                            mean chose_best = selfelecget_mean(winners = winners)

                                            74

                                            APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                            Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                            for voter_index voter in enumerate(selfelecsorted_voters)

                                            voter_dict = dict()

                                            og_voter_dict = dict()

                                            for tup in voter

                                            voter_dict[tup[0]] = tup[1]

                                            og_voter_dict[tup[0]] = tup[1]

                                            for coalition in selfeleccoalitions

                                            for candidate in coalition

                                            add_to_score = 0

                                            for candidate2 in coalition

                                            if candidate == candidate2

                                            continue

                                            half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                            if half lt 0

                                            add_to_score += mathceil(half)

                                            else

                                            add_to_score += mathfloor(half)

                                            if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                            voter_dict[candidate[rsquovaluersquo]] = 10

                                            elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                            voter_dict[candidate[rsquovaluersquo]] = -10

                                            else

                                            voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                            selfrankings_changed[voter_index] = []

                                            for candidate in voter_dict

                                            selfrankings_changed[voter_index]append((candidate voter_dict[

                                            candidate]))

                                            selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                            voter_index] key=lambda x x[1])

                                            75

                                            APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                            Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                            selfelecroundsappend(selfsorted_candidates[_round])

                                            if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                            N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                            N_VACANCIES - 1)

                                            return 2

                                            elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                            N_VOTERS gt 05)

                                            return 1

                                            else

                                            selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                            CANDIDATE_INDEX])

                                            for voter_index in selfvotes[selfsorted_candidates[_round][self

                                            elecCANDIDATE_INDEX]]

                                            if voter_index in selfrankings_changed

                                            for candidate in reversed(selfrankings_changed[voter_index

                                            ])

                                            if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                            excluded

                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                            ]] += 1

                                            selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                            add(voter_index)

                                            break

                                            else

                                            continue

                                            else

                                            for candidate in reversed(selfelecsorted_voters[

                                            voter_index])

                                            if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                            excluded

                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                            ]] += 1

                                            selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                            add(voter_index)

                                            break

                                            else

                                            continue

                                            selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                            return 0

                                            76

                                            APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                            Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                            for index in range(selfelecN_CANDIDATES)

                                            selfcandidates[index] = 0

                                            for voter in selfelecsorted_voters

                                            for candidate in reversed(voter)

                                            if candidate[selfelecCANDIDATE_SCORE] gt 0

                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                            else

                                            break

                                            APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                            Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                            for index in range(selfelecN_CANDIDATES)

                                            selfcandidates[index] = 0

                                            for voter in selfelecsorted_voters

                                            if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                            elecCANDIDATE_INDEX]]

                                            selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                            else

                                            for candidate in reversed(voter)

                                            if candidate[selfelecCANDIDATE_SCORE] gt 0

                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                            else

                                            break

                                            77

                                            APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                            Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                            pos = set()

                                            for index perc in enumerate(selfelectactical_vote_percentages)

                                            if perc gt 0

                                            posadd(index)

                                            for candidate in selfeleccandidates

                                            if candidate not in selfleading_candidates

                                            for voter_index in selfvotes[candidate]

                                            raised = None

                                            for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                            ])

                                            if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                            leading_candidates

                                            if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                            if randomrandom() lt selfelectactical_vote_percentages[

                                            candidate_tuple[selfelecCANDIDATE_INDEX]]

                                            ranking = [None]selfelecN_CANDIDATES

                                            ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                            selfelecvoters[voter_index][candidate_tuple[selfelec

                                            CANDIDATE_INDEX]])

                                            raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                            break

                                            break

                                            break

                                            if raised = None

                                            for _candidate in selfleading_candidates

                                            if _candidate = ranking[-1][0]

                                            ranking[0] = (_candidate selfelecvoters[voter_index][

                                            _candidate])

                                            buried = _candidate

                                            break

                                            i = 1

                                            for candidate_tuple in selfelecsorted_voters[voter_index]

                                            if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                            buried]

                                            continue

                                            else

                                            ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                            selfelecvoters[voter_index][candidate_tuple[selfelec

                                            CANDIDATE_INDEX]])

                                            i += 1

                                            selfrankings_changed[voter_index] = ranking

                                            78

                                            APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                            Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                            for voter_index in selfvotes[candidate]

                                            if randomrandom() lt selfelectactical_vote_percentages[candidate

                                            ]

                                            for _candidate in selfleading_candidates

                                            if _candidate = candidate

                                            ranking = [None]selfelecN_CANDIDATES

                                            ranking[0] = (_candidate selfelecvoters[voter_index][

                                            _candidate])

                                            buried = _candidate

                                            break

                                            i = 1

                                            for candidate_tuple in selfelecsorted_voters[voter_index]

                                            if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                            continue

                                            else

                                            ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                            selfelecvoters[voter_index][candidate_tuple[selfelec

                                            CANDIDATE_INDEX]])

                                            i += 1

                                            selfrankings_changed[voter_index] = ranking

                                            79

                                            APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                            Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                            for index in range(selfelecN_CANDIDATES)

                                            selfcandidates[index] = 0

                                            for voter_index voter in enumerate(selfelecsorted_voters)

                                            score = 0

                                            if voter_index in selfrankings_changed

                                            for candidate in selfrankings_changed[voter_index]

                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                            score += 1

                                            else

                                            for candidate in voter

                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                            score += 1

                                            APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                            Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                            for voter_index voter in enumerate(selfelecsorted_voters)

                                            if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                            elecCANDIDATE_INDEX]]

                                            selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                            sorted_voters[voter_index])

                                            for candidate_index candidate in enumerate(reversed(voter))

                                            if candidate_index == 0

                                            selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                            voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                            else

                                            selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                            voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                            80

                                            APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                            Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                            for index in range(selfelecN_CANDIDATES)

                                            selfcandidates[index] = 0

                                            for voter_index voter in enumerate(selfelecsorted_voters)

                                            if voter_index in selfrankings_changed

                                            for candidate in selfrankings_changed[voter_index]

                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                            selfelecCANDIDATE_RANK]

                                            else

                                            for candidate in voter

                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                            selfelecCANDIDATE_RANK]

                                            APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                            Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                            for index in range(selfelecN_CANDIDATES)

                                            selfcandidates[index] = 0

                                            for voter in selfelecsorted_voters

                                            votes = selfelecN_VACANCIES

                                            for candidate in reversed(voter)

                                            if votes == 0

                                            break

                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                            votes -= 1

                                            • Folha de aprovaccedilatildeo
                                            • Agradecimentos
                                            • Epiacutegrafe
                                            • Resumo
                                            • Abstract
                                            • Lista de ilustraccedilotildees
                                            • Lista de Coacutedigos
                                            • Lista de tabelas
                                            • Lista de abreviaturas e siglas
                                            • Sumaacuterio
                                            • INTRODUCcedilAtildeO
                                              • MOTIVACcedilAtildeO E OBJETIVO
                                              • MEacuteTODO
                                              • ESTRUTURA
                                                • SISTEMAS ELEITORAIS
                                                  • FISRT PAST THE POST
                                                    • Exemplo
                                                    • Vantagens e Desvantagens do FPTP
                                                    • Voto Uacutetil no FPTP
                                                      • TWO-ROUND SYSTEM
                                                        • Exemplo
                                                        • Vantagens e Desvantagens do TRS
                                                        • Voto Uacutetil no TRS
                                                          • INSTANT-RUNOFF VOTING
                                                            • Exemplo
                                                            • Vantagens e Desvantagens do IRV
                                                            • Voto Uacutetil no IRV
                                                              • APPROVAL VOTING SYSTEM
                                                                • Exemplo
                                                                • Vantagens e Desvantagens do AVS
                                                                • Voto Uacutetil no AVS
                                                                  • THE BORDA COUNT
                                                                    • Exemplo
                                                                    • Vantagens e Desvantagens do BC
                                                                    • Voto Uacutetil no BC
                                                                      • SCORE VOTING SYSTEM
                                                                        • Exemplo
                                                                        • Vantagens e Desvantagens do SVS
                                                                        • Voto Uacutetil no SVS
                                                                          • BLOC VOTE
                                                                            • Exemplo
                                                                            • Voto Uacutetil no BV
                                                                                • O SIMULADOR
                                                                                • CENAacuteRIOS PERTINENTES
                                                                                  • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                  • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                  • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                  • CENAacuteRIO 4 COALIZOtildeES
                                                                                  • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                  • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                    • COMO FUNCIONA O SIMULADOR
                                                                                      • CLASSE Elections
                                                                                      • CLASSE FirstPastThePost
                                                                                      • CLASSE TwoRoundSystem
                                                                                      • CLASSE InstantRunoffVoting
                                                                                      • CLASSE ApprovalVoting
                                                                                      • CLASSE BordaCount
                                                                                      • CLASSE ScoreVoting
                                                                                      • CLASSE BlocVote
                                                                                      • TECNOLOGIAS UTILIZADAS
                                                                                        • CONCLUSAtildeO
                                                                                        • Referecircncias
                                                                                        • Meacutetodo create_voters
                                                                                        • Meacutetodo create_candidates
                                                                                        • Meacutetodo calculate_means
                                                                                        • Meacutetodo get_mean
                                                                                        • Meacutetodo calculate_mean
                                                                                        • Meacutetodo set_leading_candidates
                                                                                        • Meacutetodo irv_set_leading_candidates
                                                                                        • Meacutetodo sort_ranks
                                                                                        • Meacutetodo fptp_count_tactical_votes
                                                                                        • Meacutetodo fptp_count_minority_votes
                                                                                        • Meacutetodo trs_second_round
                                                                                        • Meacutetodo trs_account_for_coalitions
                                                                                        • Meacutetodo irv_count_votes
                                                                                        • Meacutetodo avs_count_votes
                                                                                        • Meacutetodo avs_count_votes_with_tactical
                                                                                        • Meacutetodo irv_apply_tactical_votes
                                                                                        • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                        • Meacutetodo bc_sum_candidates_scores
                                                                                        • Meacutetodo svs_apply_tactical_votes
                                                                                        • Meacutetodo svs_sum_candidates_scores
                                                                                        • Meacutetodo bv_count_votes

                                              23

                                              Aleacutem disso candidatos de partidos menores tendem a receber mais votos do queno FPTP e portanto satildeo mais encorajados a se candidatar Com uma lista maior decandidatos eleitores desfrutam de uma variedade maior de opccedilotildees de voto Contudomesmo com mais candidatos menos populares o spoiler effect mencionado anteriormentetambeacutem natildeo possui espaccedilo nesse sistema de votaccedilatildeo Partidos menores natildeo tem comoroubar votos de partidos maiores visto que esses votos eventualmente seratildeo transferidosde volta a eles durante o desenvolvimento das rodadas do IRV

                                              Em virtude de sua estrutura acredita-se que esse meacutetodo tende a encorajar os can-didatos tambeacutem a elaborar suas campanhas de forma mais abrangente ampliando suainfluecircncia para mais do que apenas um grupo especiacutefico de maneira que ele consiga agre-gar votos de segunda ou terceira opccedilatildeo aleacutem dos votos de seus eleitores principais

                                              A principal desvantagem do IRV eacute o fato de ele ainda natildeo ser amplamente utilizado aoredor do mundo Essa falta de familiaridade do sistema pode causar confusatildeo ao eleitorcomum em suas primeiras ocorrecircncias No entanto nos paiacuteses em que este eacute utilizadonatildeo parece haver confusatildeo entre os eleitores Aleacutem disso na maioria dos casos haveraacute umcusto potencialmente alto da substituiccedilatildeo ou alteraccedilatildeo dos sistemas das urnas eletrocircnicaspara que seja possiacutevel haver a implementaccedilatildeo do meacutetodo

                                              Aleacutem disso assim como o TRS este sistema tambeacutem possui natildeo-monotonicidade ouseja um candidato pode ser prejudicado ao ser ranqueado mais alto enquanto que outropode se beneficiar sendo ranqueado mais baixo pelos eleitores (ORNSTEIN 2018) issopode ocorrer quando esse ranqueamento causa alteraccedilotildees na ordem em que os candidatossatildeo eliminados Essa caracteriacutestica se manifesta em fenocircmenos complexos e especiacuteficos epor isso um exemplo de sua ocorrecircncia seraacute abordada em detalhes na seccedilatildeo 43

                                              233 Voto Uacutetil no IRV

                                              Como os sistemas de votaccedilatildeo anteriores o IRV natildeo eacute completamente imune ao vototaacutetico No entanto este meacutetodo se mostra bem resistente a eles quando comparado aoutros meacutetodos como o FPTP e o Borda Count (Bartholdi John J III and Orlin JamesB 1990) Distintivamente o IRV requer um maior esforccedilo do eleitor para elaborar umaestrateacutegia que melhor ajuste os resultados da eleiccedilatildeo de acordo com a sua preferecircnciaAleacutem disso eacute necessaacuterio que ele tenha informaccedilatildeo suficiente sobre os rankings de outroseleitores naturalmente obtida atraveacutes de pesquisas eleitorais

                                              Existe tambeacutem a possibilidade de ocorrer uma exaustatildeo dos votos quando natildeo haacuteo completo preenchimento do ranking por parte dos eleitores Nessas ocasiotildees o votonatildeo pode continuar a ser transferido a outros candidatos e ele eacute descartado Isso afetaa legitimidade do mandato do candidato eleito pois o resultado final natildeo representaraacute100 da populaccedilatildeo votante Essas ocorrecircncias no entanto podem ser minimizadas comuma melhor educaccedilatildeo eleitoral ou como foi implementado na Austraacutelia requerer que osrankings incluam uma totalidade dos candidatos concorrentes

                                              24

                                              24 APPROVAL VOTING SYSTEM

                                              No meacutetodo Approval Voting os eleitores natildeo satildeo limitados pelo nuacutemero de candidatosem que podem votar por isso approval cada eleitor pode votar em todos os candidatos osquais ele aprova Apoacutes as votaccedilotildees o candidato com a maior quantidade de votos eacute eleitoSegundo Hamlin (2015) a cidade de Fargo na Dakota do Norte se tornou a primeiracidade nos EUA a colocar em praacutetica este sistema em suas eleiccedilotildees gerais em novembrode 2018 AVS tambeacutem eacute utilizado para eleger o secretaacuterio-geral das Naccedilotildees Unidas e emdiversas outras organizaccedilotildees

                                              241 Exemplo

                                              Na tabela 5 abaixo pode-se encontrar 8 perfis de eleitores com seus candidatos apro-vados e quantidade de eleitores que se encaixam no perfil Na tabela 6 temos o resultadoda contabilizaccedilatildeo dos votos destes perfis O candidato mais popular eacute o B que se encontraaprovado em 5 perfis distintos totalizando 60 votos ou aproximadamente 32

                                              Tabela 5 ndash Exemplo AVS

                                              Aprovaccedilotildees Ndeg de eleitoresA 20AB 16B 19

                                              BDC 6CAB 7CD 15DC 5DCB 12

                                              Tabela 6 ndash Resultado AVSCandidatos Total de votos

                                              A 43B 60C 45D 38

                                              242 Vantagens e Desvantagens do AVS

                                              Aleacutem de simples este meacutetodo permite um niacutevel maior de expressividade aos eleitoresOnde no FPTP e TRS eles satildeo limitados pelo seu uacutenico voto aqui os eleitores tecircm aliberdade de demonstrar exatamente quais candidatos consideram aptos ou aceitaacuteveis aocargo

                                              25

                                              Outro efeito dessa liberdade trazida pelo AVS eacute a dizimaccedilatildeo do spoiler effect Can-didatos de partidos menores natildeo tem como roubar votos de partidos maiores nessesistema ambos os candidatos contabilizariam o voto

                                              243 Voto Uacutetil no AVS

                                              O tipo de voto uacutetil no AVS eacute denominado bullet voting Segundo The Center forElection Science (2015) esta taacutetica envolve simplesmente ignorar a possibilidade de votarem mais de um candidato e votar apenas em sua primeira opccedilatildeo Um eleitor pode serlevado a adotar essa estrateacutegia quando percebe que sua preferecircncia pode ser prejudicadacom o voto em alguma segunda opccedilatildeo sua Em um cenaacuterio extremo onde 100 doseleitores adotam esta estrateacutegia as eleiccedilotildees satildeo convertidas a um simples First Past ThePost

                                              25 THE BORDA COUNT

                                              Este meacutetodo carrega o nome em homenagem a seu criador Jean-Charles de Bordaque o desenvolveu em 1770 (LIPPMAN 2012) A contagem de Borda utiliza a abordagemde ranqueamento dos candidatos poreacutem de maneira diferente ao IRV Este eacute um sistemaque atribui uma pontuaccedilatildeo aos candidatos com base nestes rankings O candidato na basedo ranking natildeo recebe pontos o candidato imediatamente acima deste recebe 1 pontoo proacuteximo recebe 2 pontos e assim por diante ateacute o topo do ranking As pontuaccedilotildees detodos os rankings satildeo contabilizadas e o candidato com maior pontuaccedilatildeo eacute eleito Deacordo com Lippman variaccedilotildees deste meacutetodo satildeo encontradas em uso na premiaccedilatildeo dediversos esportes como na seleccedilatildeo do MVP(Most Valuable Player) da MLB(principal ligade beisebol dos EUA) e no Trofeacuteu Heisman de futebol americano universitaacuterio

                                              251 Exemplo

                                              Neste exemplo seratildeo aproveitados os mesmos rankings apresentados na tabela 3 Porserem 4 candidatos o primeiro colocado de cada ranking receberaacute 3 pontos o segundo 2pontos o terceiro 1 e o quarto 0 Assim o nuacutemero maacuteximo de pontos que um candidatopode atingir eacute igual a 300(se ficar na primeira posiccedilatildeo em todos os rankings) e o nuacutemerototal de pontos no sistema eacute 600 O nuacutemero maacuteximo de pontos que um candidato podeatingir eacute calculado com

                                              (cminus 1)times e

                                              Sendo c igual ao nuacutemero de candidatos e e o nuacutemero de eleitores Por sua vez onuacutemero total de pontos no sistema eacute

                                              26

                                              (cminus 1)times c2

                                              times e

                                              A contagem final dos pontos eacute apresentada na tabela 7 abaixo

                                              Tabela 7 ndash Resultado BCCandidatos Total de pontos

                                              A 146B 181C 126D 147

                                              O candidato eleito eacute o B com 181 pontos ou aproximadamente 60 da pontuaccedilatildeomaacutexima

                                              252 Vantagens e Desvantagens do BC

                                              Em comparaccedilatildeo com os meacutetodos abordados anteriormente que apenas consideramas primeiras opccedilotildees de cada eleitor este meacutetodo regularmente escolhe candidatos comaceitaccedilatildeo mais ampla ao inveacutes de uma preferecircncia direta dos eleitores (Electoral ReformSociety 2017b)

                                              Ele tambeacutem encoraja uma abordagem estrateacutegica por parte dos partidos onde seriade seu interesse nomear mais de um candidato para concorrer pois quanto mais candi-datos estatildeo no paacutereo maior eacute a pontuaccedilatildeo dos primeiros colocados Logo a nomeaccedilatildeo decandidatos menos populares pode beneficiar os principais candidatos de um partido

                                              253 Voto Uacutetil no BC

                                              Existem duas estrateacutegias aplicaacuteveis a esse sistema A primeira denominada compromi-sing de maneira similar a outros meacutetodos de votaccedilatildeo se resume em ranquear em primeirolugar um dos candidatos que estejam liderando as eleiccedilotildees mesmo que este natildeo seja suapreferecircncia real A segunda estrateacutegia burying eacute o oposto esta se baseia em ranquearem uacuteltimo lugar um dos candidatos liacutederes mesmo que este natildeo seja o seu candidato demaior desgosto Ambas estrateacutegias podem ser aplicadas ao mesmo tempo por um eleitor

                                              26 SCORE VOTING SYSTEM

                                              Score Voting ou Range Voting como tambeacutem eacute conhecido eacute mais um meacutetodo quetenta trazer maior liberdade de expressatildeo aos eleitores Assim como o Borda Counteste sistema funciona baseado na pontuaccedilatildeo dos candidatos no entanto ao inveacutes dessapontuaccedilatildeo ser relativa agrave posiccedilatildeo do candidato no ranking de cada eleitor este por sua veztem completa liberdade de atribuir qualquer quantidade de pontos aos candidatos dentro

                                              27

                                              de determinada escala Um eleitor pode dar o mesmo nuacutemero de pontos para diferentescandidatos e apoacutes o somatoacuterio de todas as pontuaccedilotildees o candidato com a pontuaccedilatildeo maisalta eacute eleito Incorporado ao escopo poliacutetico o SVS eacute utilizado no Partido Pirata Alematildeobem como em diversas organizaccedilotildees tais como o Fedora Project e Mozilla e tambeacutem emvariados esportes oliacutempicos e reality shows como o American Idol aponta Hamlin (2015)

                                              261 Exemplo

                                              Neste exemplo temos apresentados na tabela 8 abaixo 4 perfis distintos de eleitorese suas respectivas atribuiccedilotildees de pontos aos 4 candidatos Cada eleitor pode atribuirqualquer pontuaccedilatildeo a um candidato dentro da escala de -10 a 10 O resultado da eleiccedilatildeoapoacutes a soma de todos os pontos por candidato se encontra na tabela 9 onde o candidatoA eacute eleito com um total de 605 pontos

                                              Tabela 8 ndash Exemplo SVS

                                              Perfil A B C D Ndeg de eleitores1 10 -1 5 2 362 6 9 -3 4 253 2 0 8 4 224 3 3 3 10 17

                                              Tabela 9 ndash Resultado SVSCandidatos Total de pontos

                                              A 605B 240C 332D 430

                                              262 Vantagens e Desvantagens do SVS

                                              A grande vantagem do SVS eacute como ele proporciona aos eleitores expressar de maneiramuito proacutexima potencialmente exata suas impressotildees poliacuteticas de cada candidato Eleeacute ainda mais expressivo que o AVS Dessa maneira o spoiler effect tambeacutem se torna nuloao passo que toda intenccedilatildeo de voto eacute precisamente representada neste sistema

                                              Assim como outros meacutetodos eleitorais este sofre igualmente dos males produzidos pelovoto taacutetico Sua principal desvantagem eacute discutida na seccedilatildeo abaixo

                                              263 Voto Uacutetil no SVS

                                              Da mesma maneira que no Approval Voting atraveacutes do bullet voting o SVS tambeacutempode ser convertido em uma eleiccedilatildeo sob o meacutetodo FPTP em um cenaacuterio com um grande

                                              28

                                              volume de eleitores maliciosos O voto uacutetil sob este sistema se manifesta pontuando-seapenas um candidato com uma nota positiva e todos os outros com as notas mais baixasda escala Se todos os eleitores se aproveitarem dessa abordagem natildeo existiraacute distinccedilatildeoefetiva entre uma eleiccedilatildeo sob SVS e FPTP Essencialmente cada eleitor estaacute votando emapenas um candidato Essa eacute a principal desvantagem do SVS e ela consegue eliminarsua principal vantagem dar ao eleitor um poder maior de expressatildeo

                                              27 BLOC VOTE

                                              O Bloc Vote eacute um meacutetodo utilizado para a eleiccedilatildeo de candidatos a cargos no governocom mais de uma vacacircncia Pode ser considerado um meio-termo entre o FPTP e oAVS pois os eleitores podem votar em mais de um candidato poreacutem satildeo limitados pelonuacutemero de vagas Em uma eleiccedilatildeo com duas vagas por exemplo cada eleitor selecionaraacutedois candidatos ou menos Sensatamente o candidato mais votado eacute eleito Ele possuialgumas utilizaccedilotildees em eleiccedilotildees locais em algumas partes da Inglaterra (Electoral ReformSociety 2017a)

                                              271 Exemplo

                                              Neste exemplo dois candidatos seratildeo eleitos logo cada eleitor votaraacute em no maacuteximodois candidatos A distribuiccedilatildeo de votos pode ser conferida na tabela 10 e o resultado dacontagem de votos na tabela 11 abaixo Os candidatos eleitos satildeo o C totalizando 78do maacuteximo de votos possiacuteveis para um candidato e o A com 43

                                              Tabela 10 ndash Exemplo BV

                                              Aprovaccedilotildees Ndeg de eleitoresAC 20AB 16BC 19BD 6CA 7CD 15DC 17

                                              Tabela 11 ndash Resultado BVCandidatos Total de votos

                                              A 43B 41C 78D 38

                                              29

                                              272 Voto Uacutetil no BV

                                              Neste sistema eacute possiacutevel que um eleitor evite votar em sua primeira opccedilatildeo quandoeste natildeo tem chances de vitoacuteria e se fazendo isto ele diminuiraacute as chances de algum outrocandidato de seu desgosto ganhar Poreacutem o sistema previne um outro tipo de voto uacutetilEm eleiccedilotildees com mais de uma vaga onde os eleitores soacute podem votar em um candidatose um eleitor sabe que sua primeira opccedilatildeo tambeacutem eacute a primeira opccedilatildeo da maior parteda populaccedilatildeo e portanto muito provavelmente seraacute um dos candidatos eleitos eacute possiacutevelque ele arrisque votar em uma segunda opccedilatildeo sua na esperanccedila de a longo prazo elegersuas duas principais opccedilotildees de voto Com os eleitores podendo votar no nuacutemero exato devagas disponiacuteveis esse tipo de pensamento taacutetico perde o sentido

                                              30

                                              3 O SIMULADOR

                                              Para este trabalho foi implementado um simulador eleitoral na forma de uma aplicaccedilatildeoweb para que a interaccedilatildeo do usuaacuterio fosse facilitada Veremos a seguir como se daacute suautilizaccedilatildeo de forma geral

                                              Figura 2 ndash Captura de tela 1

                                              Figura 3 ndash Captura de tela 2

                                              A primeira opccedilatildeo encontrada pelo usuaacuterio eacute a escolha de quais sistemas de votaccedilatildeo se-ratildeo simulados (Figura 2) Todos eles podem ser selecionados para rodar simultaneamentePoreacutem natildeo eacute permitido rodar uma simulaccedilatildeo do Bloc Vote para uma eleiccedilatildeo onde apenasum candidato eacute eleito aleacutem disso natildeo existe implementaccedilatildeo dos meacutetodos TRS e IRV para

                                              31

                                              eleiccedilotildees com mais de um candidato eleito jaacute que eles se comportariam exatamente comono FPTP

                                              A maioria das linguagens de programaccedilatildeo senatildeo todas possuem um gerador de nuacuteme-ros pseudoaleatoacuterios que fornece a possibilidade de definir uma seed para o gerador Estaseed funciona como um ponto de partida para a geraccedilatildeo dos nuacutemero e portanto todasimulaccedilatildeo que rodar com a mesma seed sempre teraacute os mesmos resultados Se nenhumvalor for fornecido pelo usuaacuterio o tempo atual do sistema eacute utilizado As opccedilotildees subse-quentes satildeo a escolha do nuacutemero de eleitores gerados e o nuacutemero de vagas (Figura 3) Senenhum valor for fornecido o nuacutemero de eleitores padratildeo utilizado eacute 1000 e o nuacutemero devagas igual a 1

                                              Figura 4 ndash Captura de tela 3

                                              Este simulador possui dois modos para a criaccedilatildeo dos rankings dos eleitores No modoManipulate (Figura 4) primeiramente se define o nuacutemero de candidatos atraveacutes do campode entrada ao lado do tiacutetulo Candidates ou alternativamente pode-se adicionar candida-tos um a um atraveacutes do sinal de mais na parte inferior da paacutegina Para cada candidatoeacute possiacutevel definir a porcentagem de seus eleitores que optaraacute pelo voto taacutetico e pelovoto de minoria Tambeacutem eacute possiacutevel alterar o nome dos candidatos se for do interessedo usuaacuterio

                                              32

                                              Figura 5 ndash Captura de tela 4

                                              Figura 6 ndash Captura de tela 5

                                              33

                                              Figura 7 ndash Captura de tela 6

                                              Apoacutes a criaccedilatildeo dos candidatos o usuaacuterio pode criar perfis de eleitores que definiratildeo demaneira exata como partes da populaccedilatildeo iraacute votar (Figura 5) Em cada perfil se defineo valor em porcentos da populaccedilatildeo votante que o adotaraacute e a nota de cada candidatoTambeacutem eacute possiacutevel nomear cada perfil livremente

                                              No modo Generate (Figura 6) eacute onde o gerador de nuacutemeros pseudoaleatoacuterios eacute usadoNesse modo ao inveacutes do usuaacuterio criar perfis de eleitores ele define qual seraacute a distribuiccedilatildeoadotada para a geraccedilatildeo de notas de cada candidato Essas distribuiccedilotildees seratildeo mais bemdetalhadas no Capiacutetulo 5 Da mesma maneira que no modo Manipulate nesse modotambeacutem eacute possiacutevel definir os valores para os dois tipos de voto uacutetil os votos taacuteticos eos votos de minoria No primeiro estatildeo incluiacutedas as estrateacutegias de mudanccedila de votoespeciacuteficas de cada sistema como o bullet voting no AVS e SVS ou quando a preferecircnciade um eleitor claramente natildeo possui chances de vitoacuteria e ele muda seu voto para um doscandidatos que esteja na lideranccedila o que ocorre no FPTP e TRS O voto de minoriase apresenta apenas no FPTP em eleiccedilotildees onde mais de um candidato eacute eleito Se apreferecircncia de um eleitor claramente lidera a eleiccedilatildeo por ser tambeacutem a preferecircncia damaior parte da populaccedilatildeo esse eleitor pode mudar o seu voto para uma segunda opccedilatildeona esperanccedila de eleger dois de seus candidatos favoritos

                                              Por fim em ambos os modos o usuaacuterio tem a opccedilatildeo de definir coalizotildees entre oscandidatos se o sistema TRS estiver habilitado pois as coalizotildees apenas se manifestamnesse sistema Essas coalizotildees alteraratildeo as notas dos candidatos dependendo dos outroscandidatos pertencentes a elas (Figura 7)

                                              A aplicaccedilatildeo pode ser encontrada na paacutegina httpelectionsimpythonanywherecom

                                              34

                                              4 CENAacuteRIOS PERTINENTES

                                              Para todos os cenaacuterios deste capiacutetulo seraacute usada a seed do simulador igual a 100 e apopulaccedilatildeo de eleitores igual a 1000 para que exista consistecircncia na anaacutelise e tambeacutem paraque possa haver replicaccedilatildeo dos resultados se necessaacuterio

                                              41 CENAacuteRIO 1 VOTO TAacuteTICO

                                              Neste exemplo teremos quatro candidatos Ana Beto Carla e Diego Ana e Betoseratildeo gerados a partir da distribuiccedilatildeo Neutral (Figura 47) Carla da distribuiccedilatildeo Disliked(Figura 51) e Diego da Hated (Figura 55) Para a simulaccedilatildeo com a seed 100 o melhorcandidato a ser eleito ou seja aquele que maximiza a meacutedia das notas dos eleitores eacute oBeto com uma meacutedia de 0073 Para cada sistema seratildeo comparados os resultados semvoto taacutetico aos com 20 de voto taacutetico a favor da Ana Abaixo se encontram osresultados para o sistema FPTP

                                              Figura 8 ndash FPTP - Cenaacuterio 1 sem voto taacutetico

                                              Figura 9 ndash TRS segundo turno - Cenaacuterio 1 sem voto taacutetico

                                              35

                                              Figura 10 ndash IRV primeiro turno - Cenaacuterio 1

                                              Figura 11 ndash IRV segundo turno - Cenaacuterio 1

                                              Figura 12 ndash IRV terceiro turno - Cenaacuterio 1

                                              36

                                              Figura 13 ndash AVS - Cenaacuterio 1 sem voto taacutetico

                                              Figura 14 ndash BC - Cenaacuterio 1 sem voto taacutetico

                                              Figura 15 ndash SVS - Cenaacuterio 1 sem voto taacutetico

                                              37

                                              Nesse cenaacuterio sem voto taacutetico o uacutenico sistema que natildeo elege o Beto eacute o AVS Todosos outros elegem o melhor candidato Ou seja apesar de Beto ter uma melhor meacutediadas notas dos eleitores existem mais eleitores que ranqueiam Ana com uma nota acimade 0 No entanto apenas 20 dos eleitores de Diego e Carla que preferem a Ana aoinveacutes do Beto satildeo o suficiente para fazer Beto natildeo ser eleito se eles decidirem abandonarsua primeira opccedilatildeo e votar na Ana Considerando a vantagem que os votos taacuteticosproporcionam agrave Ana esta eacute eleita em todos os sistemas menos o TRS e o IRV

                                              Figura 16 ndash FPTP - Cenaacuterio 1 - 20 de voto taacutetico na Ana

                                              Figura 17 ndash TRS segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                              38

                                              Figura 18 ndash IRV primeiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                              Figura 19 ndash IRV segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                              Figura 20 ndash IRV terceiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                              39

                                              Figura 21 ndash AVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                                              Figura 22 ndash BC - Cenaacuterio 1 20 de voto taacutetico na Ana

                                              Figura 23 ndash SVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                                              40

                                              Eacute claro que se os eleitores que preferem o Beto tambeacutem votassem de maneira estra-teacutegica a situaccedilatildeo se equilibraria e haveria o mesmo niacutevel de concorrecircncia entre os doiscandidatos que ocorre quando natildeo haacute voto taacutetico Poreacutem no Borda Count esse equiliacute-brio pode natildeo acontecer e as estrateacutegias de compromising e burying podem acabar saindopela culatra se uma porcentagem elevada dos eleitores as adotarem Abaixo encontram-seos resultados para esse sistema quando 100 dos eleitores de Carla e Diego se comportammaliciosamente

                                              Figura 24 ndash BC - Cenaacuterio 1 100 de voto taacutetico na Ana e Beto

                                              Por causa do uso demasiado da estrateacutegia burying Ana e Beto perdem muitos pontose isso abre espaccedilo para uma vitoacuteria da Carla No entanto para porcentagens menores que100 o Beto ainda eacute o vencedor

                                              Essas duas estrateacutegias tambeacutem foram implementadas nesse simulador para o sistemaIRV e eacute possiacutevel ver como ele eacute resistente a elas Para que seja possiacutevel mudar os resultadosde uma eleiccedilatildeo sob o IRV eacute necessaacuterio mudar a ordem de eliminaccedilatildeo dos candidatos paraque o seu candidato preferido acabe enfrentando um candidato mais fraco nas rodadasfinais Isso natildeo ocorre com compromising e burying No proacuteximo cenaacuterio seraacute analisadacomo eacute possiacutevel modificar os resultados de uma eleiccedilatildeo sob o IRV

                                              Esses resultados podem ser replicados acessando os linksSem votos taacuteticos lthttpelectionsimpythonanywherecomdirect_res1111110

                                              --[0021][22Ana2222Beto222022Carla2222Diego22]------100gt

                                              Com 20 de voto taacutetico lthttpelectionsimpythonanywherecomdirect_res1111110--[0021][22Ana222022Beto2222Carla2222Diego22]1-[02000]---100gt

                                              Com 100 de voto taacuteticona Ana e Beto lthttpelectionsimpythonanywherecomdirect_res0000100--[0021][22Ana222022Beto222022Carla2222Diego22]1-[101000]---100gt

                                              41

                                              42 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV

                                              Neste cenaacuterio teremos Ana Carla e Beto concorrendo e trecircs perfis distintos que apoiamcada candidato As distribuiccedilotildees de notas dos perfis se encontram na tabela abaixo

                                              Tabela 12 ndash Distribuiccedilatildeo de notas - Cenaacuterio 2

                                              Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                              deeleitores

                                              1 10 5 0 422 0 10 5 303 5 0 10 28

                                              Com essas distribuiccedilotildees Carla eacute eliminada na primeira rodada e seus 28 de votossatildeo transferidos para a segunda opccedilatildeo de seus eleitores Ana que eacute eleita com 70 dosvotos e uma meacutedia de 56

                                              Figura 25 ndash IRV primeiro turno - Cenaacuterio 2

                                              Figura 26 ndash IRV segundo turno - Cenaacuterio 2

                                              42

                                              Cientes desse provaacutevel futuro cenaacuterio onde Ana eacute eleita uma pequena parte dos elei-tores de Beto estrategicamente o abandona e decide apoiar Carla na esperanccedila de leva-laao segundo turno contra Ana As novas distribuiccedilotildees de notas se encontram na tabelaabaixo com essa porccedilatildeo de eleitores representada pelo perfil 4

                                              Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2

                                              Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                              deeleitores

                                              1 10 5 0 422 0 10 5 283 5 0 10 284 0 8 10 2

                                              Essa mudanccedila estrateacutegica de voto altera a ordem de eliminaccedilotildees do sistema com Betosendo o primeiro a ser eliminado Com isso seus votos satildeo naturalmente transferidos paraCarla que derrota Ana no segundo turno com 58 dos votos

                                              Figura 27 ndash IRV primeiro turno com voto taacutetico - Cenaacuterio 2

                                              Figura 28 ndash IRV segundo turno com voto taacutetico - Cenaacuterio 2

                                              43

                                              Percebendo que a eleiccedilatildeo de Beto natildeo era provaacutevel seus eleitores conseguiram aomenos impedir a eleiccedilatildeo do pior candidato para eles Mas para isso foi necessaacuterio queeles tivessem a informaccedilatildeo de como os outros eleitores votariam Uma aproximaccedilatildeo dessasinformaccedilotildees poderia ser obtida em um cenaacuterio real com poucos candidatos atraveacutes depesquisas eleitorais poreacutem se o nuacutemero de candidatos eacute significativo uma noccedilatildeo completadas distribuiccedilotildees dos rankings dos eleitores se torna muito menos viaacutevel e dificulta aformulaccedilatildeo de estrateacutegias para alterar a ordem em que os candidatos satildeo eliminados

                                              Esses resultados podem ser replicados acessando os linksSem voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana22

                                              22Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                              Com voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana

                                              2222Beto2222Carla22]-----42Voter20Profile2001020520028Voter20Profile2010201020528Voter20Profile202520020102Voter20Profile20302082010100gt

                                              43 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE

                                              O interessante dos sistemas IRV e TRS eacute que os resultados do cenaacuterio anterior po-deriam ter sido obtidos ao inveacutes do voto taacutetico pela sua natildeo-monotonicidade Seriapossiacutevel que a Carla derrotasse a Ana no segundo turno atraveacutes do proacuteprio aumento depopularidade da Ana Assumindo que essa popularizaccedilatildeo ocorresse entre os candidatosdo perfil 2 onde 3 passasse a apoiar a Ana ao inveacutes do Beto as novas distribuiccedilotildeesseguiriam a tabela abaixo

                                              Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                              Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                              deeleitores

                                              1 10 5 0 452 0 10 5 273 5 0 10 28

                                              Dessa maneira Beto agora com uma porcentagem dos eleitores menor do que a deCarla seraacute eliminado na primeira rodada e como seus eleitores tecircm a Carla como segundaopccedilatildeo ela receberaacute todos os seus votos e seraacute eleita na segunda rodada As rodadas doIRV podem ser vistas nas figuras 29 e 30

                                              44

                                              Figura 29 ndash IRV primeiro turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                              Figura 30 ndash IRV segundo turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                              Tabela 15 ndash Resultados do Cenaacuterio 3Candidato

                                              eleitoMeacutedia das

                                              notasAntes da

                                              popularizaccedilatildeode Ana

                                              Ana 56

                                              Apoacutespopularizaccedilatildeo

                                              de AnaCarla 415

                                              Os efeitos dessa caracteriacutestica se refletem na satisfaccedilatildeo meacutedia da populaccedilatildeo A Ana eacuteclaramente a melhor candidata e mesmo com o seu ganho de popularidade (ou devido aele) a Carla eacute eleita

                                              Esses resultados podem ser replicados acessando os linksAntes da popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecom

                                              direct_res0010000---[22Ana2222Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                              45

                                              Apoacutes popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana2222Beto2222Carla22]-----45Voter20Profile2001020520027Voter20Profile2010201020528Voter20Profile20252002010100gt

                                              44 CENAacuteRIO 4 COALIZOtildeES

                                              O TRS por ser organizado em dois turnos separados normalmente a semanas dedistacircncia um do outro acaba abrindo brecha agrave mudanccedila de opiniatildeo por parte dos eleitorese o desenvolvimento de novas estrateacutegias por parte dos candidatos tais como a coalizatildeocom candidatos jaacute eliminados Com isso em mente nesse cenaacuterio teremos novamenteos quatro candidatos Ana Beto Carla e Diego Os trecircs primeiros seratildeo gerados dadistribuiccedilatildeo Neutral e Diego da distribuiccedilatildeo Disliked

                                              Figura 31 ndash TRS turno 1 - Cenaacuterio 4

                                              No TRS normal Ana Beto e Carla possuem com essas distribuiccedilotildees quantidades devotos muito proacuteximas com Beto e Carla indo para o segundo turno Carla estaacute 10 votosatraacutes de Beto e decide aproveitar o espaccedilo de tempo entre os dois turnos para tentaragregar mais votos Com isso Carla se aproxima de Diego e juntos formam uma coalizatildeoNo entanto com sua baixa popularidade Diego acaba ferindo a reputaccedilatildeo de Carla etorna o segundo turno muito mais faacutecil para Beto (Figura 33) Se Carla tivesse buscado osuporte de Ana por outro lado ela se veria vitoriosa no segundo turno e com uma amplavantagem sobre o Beto (Figura 34) Ou ateacute mesmo sem buscar uma coalizatildeo mesmosendo uma corrida apertada Carla teria naturalmente sido eleita (Figura 32)

                                              Esses resultados podem ser replicados acessando os linksSem coalizotildees lthttpelectionsimpythonanywherecomdirect_res0100000

                                              --[0002][22Ana222022Beto2222Carla2222Diego22]------100gt

                                              46

                                              Figura 32 ndash TRS turno 2 - Cenaacuterio 4

                                              Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4

                                              Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4

                                              47

                                              Coalizatildeo Carla e Diego lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2203Carla20Diego-100gt

                                              Coalizatildeo Carla e Ana lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2200Carla20Ana-100gt

                                              45 CENAacuteRIO 5 DILEMA DO PRISIONEIRO

                                              Neste cenaacuterio temos uma eleiccedilatildeo de uma vaga com trecircs candidatos concorrentes e trecircsperfis distintos de eleitores que seguiratildeo as seguintes distribuiccedilotildees

                                              Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5

                                              Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                              deeleitores

                                              1 10 -10 5 362 -10 10 5 343 -10 -10 5 30

                                              Esse contexto nos remete ao notaacutevel dilema do prisioneiro Nele dois prisioneiroscuacutemplices satildeo interrogados individualmente sem poder se comunicar um com o outro ecada um enfrenta o dilema de delatar ou natildeo o seu parceiro Se os dois prisioneirosdecidem se manter calados sobre o crime ambos satildeo sentenciados a um ano de prisatildeo Seapenas um deles dedurar o outro o traidor sai livre enquanto seu parceiro eacute condenadoa trecircs anos Se ambos dedurarem um ao outro eles satildeo condenados juntos a dois anosde prisatildeo Esse dilema eacute uma ideia claacutessica presente no estudo da teoria dos jogos sendooriginalmente elaborada por Merrill Flood e Melvin Dresher em 1950 e mais tarde sendonomeada de dilema dos prisioneiros por Albert W Tucker (POUNDSTONE 1992)

                                              O que esse dilema nos mostra eacute a tentaccedilatildeo que o indiviacuteduo deteacutem se sua racionalizaccedilatildeoestiver voltada para seus proacuteprios interesses e somente eles em oposiccedilatildeo a pensar no bemdo grupo como um todo Neste cenaacuterio encontramos dois grupos de eleitores expressiva-mente opostos os perfis 1 e 2 Se qualquer uma das preferecircncias desses perfis fosse eleitaisso significaria uma alta rejeiccedilatildeo de maior parte da populaccedilatildeo No entanto eles possuema segunda opccedilatildeo em comum a Carla que por sua vez eacute a preferecircncia do terceiro perfilPortanto a eleiccedilatildeo da Carla seria logicamente o resultado oacutetimo

                                              Mesmo assim a Ana eacute eleita nos dois sistemas acima o que natildeo parece justo poispela tabela 16 eacute evidente que apenas 36 da populaccedilatildeo a aprova enquanto que os outros64 a reprovam ao maacuteximo O sistema IRV se comporta de maneira idecircntica ao TRS

                                              48

                                              Figura 35 ndash FPTP - Cenaacuterio 5

                                              Figura 36 ndash TRS segundo turno - Cenaacuterio 5

                                              nesta situaccedilatildeo Com esse resultado a meacutedia das notas eacute -28 No entanto os trecircs sistemasseguintes nos apresentam resultados diferentes

                                              Tabela 17 ndash Resultados do Cenaacuterio 5

                                              Sistema Candidatoeleito

                                              Meacutedia dasnotas

                                              FPTP Ana -28TRS Ana -28IRV Ana -28AVS Carla 50BC Carla 50SVS Carla 50

                                              49

                                              Figura 37 ndash AVS - Cenaacuterio 5

                                              Figura 38 ndash BC - Cenaacuterio 5

                                              Tanto o AVS quanto o Borda Count e o SVS satildeo sistemas que consideram todasas opiniotildees de cada eleitor ao mesmo tempo e por isso satildeo capazes de eleger o melhorcandidato nesta situaccedilatildeo diferentemente do TRS que natildeo absorve completamente todosentimento do eleitor por todos os candidatos e o IRV que apesar de ser bem expressivoquebra esse processo em inuacutemeras rodadas o que permite a perda de informaccedilatildeo ao longodelas

                                              Esses resultados podem ser replicados acessando o linklthttpelectionsimpythonanywherecomdirect_res1111110---[22Ana

                                              222022Beto222022Carla22]-----36Voter20Profile2001020-1020534Voter20Profile201-10201020530Voter20Profile202-1020-10205100gt

                                              50

                                              Figura 39 ndash SVS - Cenaacuterio 5

                                              46 CENAacuteRIO 6 VOTO DE MINORIA

                                              Neste cenaacuterio temos uma eleiccedilatildeo com quatro candidatos e duas vagas A Ana seraacutea preferecircncia de uma extensa parte da populaccedilatildeo (distribuiccedilatildeo Loved Figura 53) Betoe Carla seratildeo candidatos razoavelmente populares (distribuiccedilatildeo Neutral Figura 47) eDiego seraacute a preferecircncia de apenas um pequeno grupo especiacutefico e rejeitado pela maioria(distribuiccedilatildeo Disliked Figura 51) Eacute intuitivo esperar que os dois candidatos eleitos seratildeoa Ana e ou o Beto ou a Carla e isso eacute exatamente o que ocorre na figura 40 no sistemaFPTP sem voto de minoria

                                              Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria

                                              Eacute evidente a discrepacircncia da quantidade de votos da Ana para os outros candidatose apesar de Beto e Carla serem mais populares que Diego os trecircs natildeo se encontrammuito afastados Poreacutem se a pequena fraccedilatildeo de candidatos que possuem a Ana como

                                              51

                                              Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego

                                              preferecircncia e Diego como segunda opccedilatildeo optarem pelo voto de minoria a situaccedilatildeo mudacompletamente (Figura 41) Assim apesar de extensamente rejeitado Diego conquistaa segunda vaga e a meacutedia das notas despenca de 2929 para 0505 No entanto aindaexiste um cenaacuterio pior Se os outros grupos de eleitores pensarem da mesma forma eevitarem votar na Ana achando que sua eleiccedilatildeo jaacute estaacute assegurada apenas 80 de votode minoria para esses grupos jaacute eacute o suficiente para eliminaacute-la das eleiccedilotildees (Figura 42)Com a Ana eliminada a meacutedia das notas cai ainda mais para 0058

                                              Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego

                                              O sistema Bloc Vote eacute uma das soluccedilotildees para o voto de minoria Permitindo queos eleitores votem no mesmo nuacutemero de candidatos que de vagas a serem preenchidasnatildeo existe o iacutempeto a esse tipo de voto estrateacutegico O resultado desse sistema portantoretorna a meacutedia das notas a casa dos 29 (Figura 43) Os sistemas AVS Borda Count eSVS tambeacutem impedem a presenccedila do voto de minoria e atingem resultados semelhantes

                                              52

                                              Figura 43 ndash BV - Cenaacuterio 6

                                              Tabela 18 ndash Resultados do Cenaacuterio 6

                                              Sistema Candidatoseleitos

                                              Meacutedia dasnotas

                                              FPTP sem voto de minoriaAna eBeto 2929

                                              FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

                                              FPTP com 80 de voto de minoriaBeto eCarla 0058

                                              Bloc VoteAna eCarla 2913

                                              Esses resultados podem ser replicados acessando os links

                                              Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

                                              100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

                                              80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

                                              53

                                              5 COMO FUNCIONA O SIMULADOR

                                              O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

                                              51 CLASSE ELECTIONS

                                              Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

                                              bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

                                              Figura 44 ndash estrutura candidates

                                              bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

                                              bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

                                              Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

                                              Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

                                              54

                                              Figura 45 ndash estrutura voters

                                              Figura 46 ndash estrutura votes

                                              daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

                                              Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

                                              55

                                              Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

                                              Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

                                              na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

                                              56

                                              Figura 49 ndash PDF - Distribuiccedilatildeo Liked

                                              Figura 50 ndash CDF - Distribuiccedilatildeo Liked

                                              (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

                                              Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

                                              57

                                              Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

                                              Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

                                              candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

                                              Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

                                              58

                                              Figura 53 ndash PDF - Distribuiccedilatildeo Loved

                                              Figura 54 ndash CDF - Distribuiccedilatildeo Loved

                                              funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

                                              59

                                              Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                                              Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                                              Meacutedia das Notas sumei

                                              sumvj nij

                                              etimes v

                                              Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                                              Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                                              60

                                              Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                                              Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                                              52 CLASSE FIRSTPASTTHEPOST

                                              Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                                              Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                                              61

                                              Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                                              Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                                              mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                                              62

                                              53 CLASSE TWOROUNDSYSTEM

                                              A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                                              54 CLASSE INSTANTRUNOFFVOTING

                                              A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                                              Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                                              63

                                              cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                                              55 CLASSE APPROVALVOTING

                                              Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                                              56 CLASSE BORDACOUNT

                                              Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                                              57 CLASSE SCOREVOTING

                                              De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                                              64

                                              58 CLASSE BLOCVOTE

                                              O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                                              59 TECNOLOGIAS UTILIZADAS

                                              A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                                              Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                                              O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                                              Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                                              65

                                              6 CONCLUSAtildeO

                                              Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                                              Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                                              Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                                              Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                                              Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                                              66

                                              REFEREcircNCIAS

                                              AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                                              Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                                              Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                                              Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                                              HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                                              LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                                              ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                                              Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                                              POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                                              The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                                              67

                                              APEcircNDICES

                                              APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                              Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                              if(not len(selfvoter_profiles))

                                              for voter in range(selfN_VOTERS)

                                              candidates_rank = dict()

                                              for candidate in reversed(range(selfN_CANDIDATES))

                                              if(selfBIAS_VECTOR[candidate]==4)

                                              candidates_rank[candidate] = self_sortear(selfloved)

                                              elif(selfBIAS_VECTOR[candidate]==3)

                                              candidates_rank[candidate] = self_sortear(selfliked)

                                              elif(selfBIAS_VECTOR[candidate]==2)

                                              candidates_rank[candidate] = self_sortear(selfdisliked)

                                              elif(selfBIAS_VECTOR[candidate]==1)

                                              candidates_rank[candidate] = self_sortear(selfhated)

                                              elif(selfBIAS_VECTOR[candidate]==-1)

                                              candidates_rank[candidate] = self_sortear(selfpolarizer

                                              )

                                              elif(selfBIAS_VECTOR[candidate]==-2)

                                              candidates_rank[candidate] = self_sortear(self

                                              more_polarizer)

                                              else

                                              candidates_rank[candidate] = self_sortear(selfneutral)

                                              selfvotersappend(candidates_rank)

                                              else

                                              ranges = []

                                              ranks = []

                                              for prof in selfvoter_profiles

                                              rangesappend(int(prof[pop_percentage]))

                                              rank =

                                              for index score in enumerate(prof[scores])

                                              rank[index] = score

                                              ranksappend(rank)

                                              for index _range in enumerate(ranges)

                                              for _ in range(int(selfN_VOTERS(_range100)))

                                              selfvotersappend(ranks[index])

                                              68

                                              APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                              Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                              for i in range(selfN_CANDIDATES)

                                              selfcandidates[i] = 0

                                              selfvotes[i] = set()

                                              APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                              Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                              for candidate in range(selfN_CANDIDATES)

                                              rating_sum = 0

                                              for voter in selfvoters

                                              rating_sum += voter[candidate]

                                              selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                              APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                              Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                              if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                              return selfcalculate_mean(winners)

                                              else

                                              chose_best = True if winners[0] == selfbest_candidate else

                                              False

                                              return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                              69

                                              APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                              Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                              rating_sum = 0

                                              for voter in selfvoters

                                              for candidate in winners

                                              rating_sum += voter[candidate]

                                              return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                              APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                              Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                              for i in range(1 selfN_VACANCIES + 2)

                                              selfleading_candidatesappend(selfsorted_candidates[-i][self

                                              CANDIDATE_INDEX])

                                              APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                              Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                              for leader in selfelecrounds[-1]

                                              selfleading_candidatesappend(leader[0])

                                              70

                                              APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                              Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                              self_account_for_coalitions()

                                              for voter in selfvoters

                                              selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                              (1)))

                                              temp = []

                                              for voter in selfsorted_voters

                                              new_dict = defaultdict(list)

                                              for k in voter

                                              new_dict[k[1]]append(k[0])

                                              tempappend(new_dict)

                                              selfsorted_voters = []

                                              for voter_index current_voter in enumerate(temp)

                                              new_voter = []

                                              for rating candidate_indexes in current_voteritems()

                                              if len(current_voter[rating]) gt 1

                                              shuffle(current_voter[rating])

                                              for e in candidate_indexes

                                              new_voterappend((e rating))

                                              else

                                              new_voterappend((candidate_indexes[0] rating))

                                              selfsorted_votersappend(new_voter)

                                              selfcandidates[new_voter[-1][0]] += 1

                                              selfvotes[new_voter[-1][0]]add(voter_index)

                                              71

                                              APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                              Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                              for candidate in selfvotes_copy

                                              if candidate not in selfelecleading_candidates

                                              for voter_index in selfvotes_copy[candidate]

                                              for index _candidate in enumerate(reversed(selfelec

                                              sorted_voters[voter_index]))

                                              if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                              leading_candidates

                                              if randomrandom() lt selfelec

                                              tactical_vote_percentages[_candidate[selfelec

                                              CANDIDATE_INDEX]]

                                              selfrankings_changed[voter_index] = copy

                                              deepcopy(selfelecsorted_voters[voter_index])

                                              selfrankings_changed[voter_index][-(index + 1)]

                                              selfrankings_changed[voter_index][-1] = self

                                              rankings_changed[voter_index][-1] self

                                              rankings_changed[voter_index][-(index + 1)]

                                              selfcandidates[candidate] -= 1

                                              selfcandidates[_candidate[selfelec

                                              CANDIDATE_INDEX]] += 1

                                              selfvotes[candidate]remove(voter_index)

                                              selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                              ]]add(voter_index)

                                              break

                                              break

                                              72

                                              APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                              Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                              half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                              for candidate in selfelecleading_candidates

                                              if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                              continue

                                              for voter_index in selfvotes_copy[candidate]

                                              if voter_index in selfrankings_changed

                                              ranking = selfrankings_changed[voter_index]

                                              else

                                              ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                              ])

                                              for index _candidate in enumerate(reversed(ranking))

                                              if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                              leading_candidates or (_candidate[selfelec

                                              CANDIDATE_INDEX] in selfelecleading_candidates and

                                              selfelecleading_candidatesindex(_candidate[selfelec

                                              CANDIDATE_INDEX]) gt= half_vacancies)

                                              if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                              if randomrandom() lt selfelec

                                              minority_vote_percentages[_candidate[selfelec

                                              CANDIDATE_INDEX]]

                                              selfcandidates[candidate] -= 1

                                              selfcandidates[_candidate[selfelec

                                              CANDIDATE_INDEX]] += 1

                                              break

                                              break

                                              break

                                              73

                                              APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                              Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                              self_account_for_coalitions()

                                              for candidate in selfvotes

                                              if candidate = selfwinner and candidate = selfsecond_place

                                              for voter_index in selfvotes[candidate]

                                              if voter_index in selfrankings_changed

                                              ranking = selfrankings_changed[voter_index]

                                              else

                                              ranking = copydeepcopy(selfelecsorted_voters[

                                              voter_index])

                                              for index2 candidate in enumerate(reversed(ranking))

                                              if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                              selfcandidates[selfwinner] += 1

                                              selfvotes[selfwinner]add(voter_index)

                                              break

                                              elif candidate[selfelecCANDIDATE_INDEX] == self

                                              second_place

                                              selfcandidates[selfsecond_place] += 1

                                              selfvotes[selfsecond_place]add(voter_index)

                                              break

                                              selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                              winners = []

                                              vacancies = selfelecN_VACANCIES

                                              for candidate in reversed(selfsorted_candidates)

                                              if vacancies == 0

                                              break

                                              winnersappend(candidate[0])

                                              vacancies -= 1

                                              mean chose_best = selfelecget_mean(winners = winners)

                                              74

                                              APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                              Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                              for voter_index voter in enumerate(selfelecsorted_voters)

                                              voter_dict = dict()

                                              og_voter_dict = dict()

                                              for tup in voter

                                              voter_dict[tup[0]] = tup[1]

                                              og_voter_dict[tup[0]] = tup[1]

                                              for coalition in selfeleccoalitions

                                              for candidate in coalition

                                              add_to_score = 0

                                              for candidate2 in coalition

                                              if candidate == candidate2

                                              continue

                                              half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                              if half lt 0

                                              add_to_score += mathceil(half)

                                              else

                                              add_to_score += mathfloor(half)

                                              if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                              voter_dict[candidate[rsquovaluersquo]] = 10

                                              elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                              voter_dict[candidate[rsquovaluersquo]] = -10

                                              else

                                              voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                              selfrankings_changed[voter_index] = []

                                              for candidate in voter_dict

                                              selfrankings_changed[voter_index]append((candidate voter_dict[

                                              candidate]))

                                              selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                              voter_index] key=lambda x x[1])

                                              75

                                              APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                              Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                              selfelecroundsappend(selfsorted_candidates[_round])

                                              if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                              N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                              N_VACANCIES - 1)

                                              return 2

                                              elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                              N_VOTERS gt 05)

                                              return 1

                                              else

                                              selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                              CANDIDATE_INDEX])

                                              for voter_index in selfvotes[selfsorted_candidates[_round][self

                                              elecCANDIDATE_INDEX]]

                                              if voter_index in selfrankings_changed

                                              for candidate in reversed(selfrankings_changed[voter_index

                                              ])

                                              if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                              excluded

                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                              ]] += 1

                                              selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                              add(voter_index)

                                              break

                                              else

                                              continue

                                              else

                                              for candidate in reversed(selfelecsorted_voters[

                                              voter_index])

                                              if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                              excluded

                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                              ]] += 1

                                              selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                              add(voter_index)

                                              break

                                              else

                                              continue

                                              selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                              return 0

                                              76

                                              APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                              Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                              for index in range(selfelecN_CANDIDATES)

                                              selfcandidates[index] = 0

                                              for voter in selfelecsorted_voters

                                              for candidate in reversed(voter)

                                              if candidate[selfelecCANDIDATE_SCORE] gt 0

                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                              else

                                              break

                                              APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                              Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                              for index in range(selfelecN_CANDIDATES)

                                              selfcandidates[index] = 0

                                              for voter in selfelecsorted_voters

                                              if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                              elecCANDIDATE_INDEX]]

                                              selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                              else

                                              for candidate in reversed(voter)

                                              if candidate[selfelecCANDIDATE_SCORE] gt 0

                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                              else

                                              break

                                              77

                                              APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                              Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                              pos = set()

                                              for index perc in enumerate(selfelectactical_vote_percentages)

                                              if perc gt 0

                                              posadd(index)

                                              for candidate in selfeleccandidates

                                              if candidate not in selfleading_candidates

                                              for voter_index in selfvotes[candidate]

                                              raised = None

                                              for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                              ])

                                              if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                              leading_candidates

                                              if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                              if randomrandom() lt selfelectactical_vote_percentages[

                                              candidate_tuple[selfelecCANDIDATE_INDEX]]

                                              ranking = [None]selfelecN_CANDIDATES

                                              ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                              selfelecvoters[voter_index][candidate_tuple[selfelec

                                              CANDIDATE_INDEX]])

                                              raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                              break

                                              break

                                              break

                                              if raised = None

                                              for _candidate in selfleading_candidates

                                              if _candidate = ranking[-1][0]

                                              ranking[0] = (_candidate selfelecvoters[voter_index][

                                              _candidate])

                                              buried = _candidate

                                              break

                                              i = 1

                                              for candidate_tuple in selfelecsorted_voters[voter_index]

                                              if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                              buried]

                                              continue

                                              else

                                              ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                              selfelecvoters[voter_index][candidate_tuple[selfelec

                                              CANDIDATE_INDEX]])

                                              i += 1

                                              selfrankings_changed[voter_index] = ranking

                                              78

                                              APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                              Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                              for voter_index in selfvotes[candidate]

                                              if randomrandom() lt selfelectactical_vote_percentages[candidate

                                              ]

                                              for _candidate in selfleading_candidates

                                              if _candidate = candidate

                                              ranking = [None]selfelecN_CANDIDATES

                                              ranking[0] = (_candidate selfelecvoters[voter_index][

                                              _candidate])

                                              buried = _candidate

                                              break

                                              i = 1

                                              for candidate_tuple in selfelecsorted_voters[voter_index]

                                              if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                              continue

                                              else

                                              ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                              selfelecvoters[voter_index][candidate_tuple[selfelec

                                              CANDIDATE_INDEX]])

                                              i += 1

                                              selfrankings_changed[voter_index] = ranking

                                              79

                                              APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                              Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                              for index in range(selfelecN_CANDIDATES)

                                              selfcandidates[index] = 0

                                              for voter_index voter in enumerate(selfelecsorted_voters)

                                              score = 0

                                              if voter_index in selfrankings_changed

                                              for candidate in selfrankings_changed[voter_index]

                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                              score += 1

                                              else

                                              for candidate in voter

                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                              score += 1

                                              APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                              Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                              for voter_index voter in enumerate(selfelecsorted_voters)

                                              if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                              elecCANDIDATE_INDEX]]

                                              selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                              sorted_voters[voter_index])

                                              for candidate_index candidate in enumerate(reversed(voter))

                                              if candidate_index == 0

                                              selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                              voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                              else

                                              selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                              voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                              80

                                              APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                              Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                              for index in range(selfelecN_CANDIDATES)

                                              selfcandidates[index] = 0

                                              for voter_index voter in enumerate(selfelecsorted_voters)

                                              if voter_index in selfrankings_changed

                                              for candidate in selfrankings_changed[voter_index]

                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                              selfelecCANDIDATE_RANK]

                                              else

                                              for candidate in voter

                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                              selfelecCANDIDATE_RANK]

                                              APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                              Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                              for index in range(selfelecN_CANDIDATES)

                                              selfcandidates[index] = 0

                                              for voter in selfelecsorted_voters

                                              votes = selfelecN_VACANCIES

                                              for candidate in reversed(voter)

                                              if votes == 0

                                              break

                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                              votes -= 1

                                              • Folha de aprovaccedilatildeo
                                              • Agradecimentos
                                              • Epiacutegrafe
                                              • Resumo
                                              • Abstract
                                              • Lista de ilustraccedilotildees
                                              • Lista de Coacutedigos
                                              • Lista de tabelas
                                              • Lista de abreviaturas e siglas
                                              • Sumaacuterio
                                              • INTRODUCcedilAtildeO
                                                • MOTIVACcedilAtildeO E OBJETIVO
                                                • MEacuteTODO
                                                • ESTRUTURA
                                                  • SISTEMAS ELEITORAIS
                                                    • FISRT PAST THE POST
                                                      • Exemplo
                                                      • Vantagens e Desvantagens do FPTP
                                                      • Voto Uacutetil no FPTP
                                                        • TWO-ROUND SYSTEM
                                                          • Exemplo
                                                          • Vantagens e Desvantagens do TRS
                                                          • Voto Uacutetil no TRS
                                                            • INSTANT-RUNOFF VOTING
                                                              • Exemplo
                                                              • Vantagens e Desvantagens do IRV
                                                              • Voto Uacutetil no IRV
                                                                • APPROVAL VOTING SYSTEM
                                                                  • Exemplo
                                                                  • Vantagens e Desvantagens do AVS
                                                                  • Voto Uacutetil no AVS
                                                                    • THE BORDA COUNT
                                                                      • Exemplo
                                                                      • Vantagens e Desvantagens do BC
                                                                      • Voto Uacutetil no BC
                                                                        • SCORE VOTING SYSTEM
                                                                          • Exemplo
                                                                          • Vantagens e Desvantagens do SVS
                                                                          • Voto Uacutetil no SVS
                                                                            • BLOC VOTE
                                                                              • Exemplo
                                                                              • Voto Uacutetil no BV
                                                                                  • O SIMULADOR
                                                                                  • CENAacuteRIOS PERTINENTES
                                                                                    • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                    • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                    • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                    • CENAacuteRIO 4 COALIZOtildeES
                                                                                    • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                    • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                      • COMO FUNCIONA O SIMULADOR
                                                                                        • CLASSE Elections
                                                                                        • CLASSE FirstPastThePost
                                                                                        • CLASSE TwoRoundSystem
                                                                                        • CLASSE InstantRunoffVoting
                                                                                        • CLASSE ApprovalVoting
                                                                                        • CLASSE BordaCount
                                                                                        • CLASSE ScoreVoting
                                                                                        • CLASSE BlocVote
                                                                                        • TECNOLOGIAS UTILIZADAS
                                                                                          • CONCLUSAtildeO
                                                                                          • Referecircncias
                                                                                          • Meacutetodo create_voters
                                                                                          • Meacutetodo create_candidates
                                                                                          • Meacutetodo calculate_means
                                                                                          • Meacutetodo get_mean
                                                                                          • Meacutetodo calculate_mean
                                                                                          • Meacutetodo set_leading_candidates
                                                                                          • Meacutetodo irv_set_leading_candidates
                                                                                          • Meacutetodo sort_ranks
                                                                                          • Meacutetodo fptp_count_tactical_votes
                                                                                          • Meacutetodo fptp_count_minority_votes
                                                                                          • Meacutetodo trs_second_round
                                                                                          • Meacutetodo trs_account_for_coalitions
                                                                                          • Meacutetodo irv_count_votes
                                                                                          • Meacutetodo avs_count_votes
                                                                                          • Meacutetodo avs_count_votes_with_tactical
                                                                                          • Meacutetodo irv_apply_tactical_votes
                                                                                          • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                          • Meacutetodo bc_sum_candidates_scores
                                                                                          • Meacutetodo svs_apply_tactical_votes
                                                                                          • Meacutetodo svs_sum_candidates_scores
                                                                                          • Meacutetodo bv_count_votes

                                                24

                                                24 APPROVAL VOTING SYSTEM

                                                No meacutetodo Approval Voting os eleitores natildeo satildeo limitados pelo nuacutemero de candidatosem que podem votar por isso approval cada eleitor pode votar em todos os candidatos osquais ele aprova Apoacutes as votaccedilotildees o candidato com a maior quantidade de votos eacute eleitoSegundo Hamlin (2015) a cidade de Fargo na Dakota do Norte se tornou a primeiracidade nos EUA a colocar em praacutetica este sistema em suas eleiccedilotildees gerais em novembrode 2018 AVS tambeacutem eacute utilizado para eleger o secretaacuterio-geral das Naccedilotildees Unidas e emdiversas outras organizaccedilotildees

                                                241 Exemplo

                                                Na tabela 5 abaixo pode-se encontrar 8 perfis de eleitores com seus candidatos apro-vados e quantidade de eleitores que se encaixam no perfil Na tabela 6 temos o resultadoda contabilizaccedilatildeo dos votos destes perfis O candidato mais popular eacute o B que se encontraaprovado em 5 perfis distintos totalizando 60 votos ou aproximadamente 32

                                                Tabela 5 ndash Exemplo AVS

                                                Aprovaccedilotildees Ndeg de eleitoresA 20AB 16B 19

                                                BDC 6CAB 7CD 15DC 5DCB 12

                                                Tabela 6 ndash Resultado AVSCandidatos Total de votos

                                                A 43B 60C 45D 38

                                                242 Vantagens e Desvantagens do AVS

                                                Aleacutem de simples este meacutetodo permite um niacutevel maior de expressividade aos eleitoresOnde no FPTP e TRS eles satildeo limitados pelo seu uacutenico voto aqui os eleitores tecircm aliberdade de demonstrar exatamente quais candidatos consideram aptos ou aceitaacuteveis aocargo

                                                25

                                                Outro efeito dessa liberdade trazida pelo AVS eacute a dizimaccedilatildeo do spoiler effect Can-didatos de partidos menores natildeo tem como roubar votos de partidos maiores nessesistema ambos os candidatos contabilizariam o voto

                                                243 Voto Uacutetil no AVS

                                                O tipo de voto uacutetil no AVS eacute denominado bullet voting Segundo The Center forElection Science (2015) esta taacutetica envolve simplesmente ignorar a possibilidade de votarem mais de um candidato e votar apenas em sua primeira opccedilatildeo Um eleitor pode serlevado a adotar essa estrateacutegia quando percebe que sua preferecircncia pode ser prejudicadacom o voto em alguma segunda opccedilatildeo sua Em um cenaacuterio extremo onde 100 doseleitores adotam esta estrateacutegia as eleiccedilotildees satildeo convertidas a um simples First Past ThePost

                                                25 THE BORDA COUNT

                                                Este meacutetodo carrega o nome em homenagem a seu criador Jean-Charles de Bordaque o desenvolveu em 1770 (LIPPMAN 2012) A contagem de Borda utiliza a abordagemde ranqueamento dos candidatos poreacutem de maneira diferente ao IRV Este eacute um sistemaque atribui uma pontuaccedilatildeo aos candidatos com base nestes rankings O candidato na basedo ranking natildeo recebe pontos o candidato imediatamente acima deste recebe 1 pontoo proacuteximo recebe 2 pontos e assim por diante ateacute o topo do ranking As pontuaccedilotildees detodos os rankings satildeo contabilizadas e o candidato com maior pontuaccedilatildeo eacute eleito Deacordo com Lippman variaccedilotildees deste meacutetodo satildeo encontradas em uso na premiaccedilatildeo dediversos esportes como na seleccedilatildeo do MVP(Most Valuable Player) da MLB(principal ligade beisebol dos EUA) e no Trofeacuteu Heisman de futebol americano universitaacuterio

                                                251 Exemplo

                                                Neste exemplo seratildeo aproveitados os mesmos rankings apresentados na tabela 3 Porserem 4 candidatos o primeiro colocado de cada ranking receberaacute 3 pontos o segundo 2pontos o terceiro 1 e o quarto 0 Assim o nuacutemero maacuteximo de pontos que um candidatopode atingir eacute igual a 300(se ficar na primeira posiccedilatildeo em todos os rankings) e o nuacutemerototal de pontos no sistema eacute 600 O nuacutemero maacuteximo de pontos que um candidato podeatingir eacute calculado com

                                                (cminus 1)times e

                                                Sendo c igual ao nuacutemero de candidatos e e o nuacutemero de eleitores Por sua vez onuacutemero total de pontos no sistema eacute

                                                26

                                                (cminus 1)times c2

                                                times e

                                                A contagem final dos pontos eacute apresentada na tabela 7 abaixo

                                                Tabela 7 ndash Resultado BCCandidatos Total de pontos

                                                A 146B 181C 126D 147

                                                O candidato eleito eacute o B com 181 pontos ou aproximadamente 60 da pontuaccedilatildeomaacutexima

                                                252 Vantagens e Desvantagens do BC

                                                Em comparaccedilatildeo com os meacutetodos abordados anteriormente que apenas consideramas primeiras opccedilotildees de cada eleitor este meacutetodo regularmente escolhe candidatos comaceitaccedilatildeo mais ampla ao inveacutes de uma preferecircncia direta dos eleitores (Electoral ReformSociety 2017b)

                                                Ele tambeacutem encoraja uma abordagem estrateacutegica por parte dos partidos onde seriade seu interesse nomear mais de um candidato para concorrer pois quanto mais candi-datos estatildeo no paacutereo maior eacute a pontuaccedilatildeo dos primeiros colocados Logo a nomeaccedilatildeo decandidatos menos populares pode beneficiar os principais candidatos de um partido

                                                253 Voto Uacutetil no BC

                                                Existem duas estrateacutegias aplicaacuteveis a esse sistema A primeira denominada compromi-sing de maneira similar a outros meacutetodos de votaccedilatildeo se resume em ranquear em primeirolugar um dos candidatos que estejam liderando as eleiccedilotildees mesmo que este natildeo seja suapreferecircncia real A segunda estrateacutegia burying eacute o oposto esta se baseia em ranquearem uacuteltimo lugar um dos candidatos liacutederes mesmo que este natildeo seja o seu candidato demaior desgosto Ambas estrateacutegias podem ser aplicadas ao mesmo tempo por um eleitor

                                                26 SCORE VOTING SYSTEM

                                                Score Voting ou Range Voting como tambeacutem eacute conhecido eacute mais um meacutetodo quetenta trazer maior liberdade de expressatildeo aos eleitores Assim como o Borda Counteste sistema funciona baseado na pontuaccedilatildeo dos candidatos no entanto ao inveacutes dessapontuaccedilatildeo ser relativa agrave posiccedilatildeo do candidato no ranking de cada eleitor este por sua veztem completa liberdade de atribuir qualquer quantidade de pontos aos candidatos dentro

                                                27

                                                de determinada escala Um eleitor pode dar o mesmo nuacutemero de pontos para diferentescandidatos e apoacutes o somatoacuterio de todas as pontuaccedilotildees o candidato com a pontuaccedilatildeo maisalta eacute eleito Incorporado ao escopo poliacutetico o SVS eacute utilizado no Partido Pirata Alematildeobem como em diversas organizaccedilotildees tais como o Fedora Project e Mozilla e tambeacutem emvariados esportes oliacutempicos e reality shows como o American Idol aponta Hamlin (2015)

                                                261 Exemplo

                                                Neste exemplo temos apresentados na tabela 8 abaixo 4 perfis distintos de eleitorese suas respectivas atribuiccedilotildees de pontos aos 4 candidatos Cada eleitor pode atribuirqualquer pontuaccedilatildeo a um candidato dentro da escala de -10 a 10 O resultado da eleiccedilatildeoapoacutes a soma de todos os pontos por candidato se encontra na tabela 9 onde o candidatoA eacute eleito com um total de 605 pontos

                                                Tabela 8 ndash Exemplo SVS

                                                Perfil A B C D Ndeg de eleitores1 10 -1 5 2 362 6 9 -3 4 253 2 0 8 4 224 3 3 3 10 17

                                                Tabela 9 ndash Resultado SVSCandidatos Total de pontos

                                                A 605B 240C 332D 430

                                                262 Vantagens e Desvantagens do SVS

                                                A grande vantagem do SVS eacute como ele proporciona aos eleitores expressar de maneiramuito proacutexima potencialmente exata suas impressotildees poliacuteticas de cada candidato Eleeacute ainda mais expressivo que o AVS Dessa maneira o spoiler effect tambeacutem se torna nuloao passo que toda intenccedilatildeo de voto eacute precisamente representada neste sistema

                                                Assim como outros meacutetodos eleitorais este sofre igualmente dos males produzidos pelovoto taacutetico Sua principal desvantagem eacute discutida na seccedilatildeo abaixo

                                                263 Voto Uacutetil no SVS

                                                Da mesma maneira que no Approval Voting atraveacutes do bullet voting o SVS tambeacutempode ser convertido em uma eleiccedilatildeo sob o meacutetodo FPTP em um cenaacuterio com um grande

                                                28

                                                volume de eleitores maliciosos O voto uacutetil sob este sistema se manifesta pontuando-seapenas um candidato com uma nota positiva e todos os outros com as notas mais baixasda escala Se todos os eleitores se aproveitarem dessa abordagem natildeo existiraacute distinccedilatildeoefetiva entre uma eleiccedilatildeo sob SVS e FPTP Essencialmente cada eleitor estaacute votando emapenas um candidato Essa eacute a principal desvantagem do SVS e ela consegue eliminarsua principal vantagem dar ao eleitor um poder maior de expressatildeo

                                                27 BLOC VOTE

                                                O Bloc Vote eacute um meacutetodo utilizado para a eleiccedilatildeo de candidatos a cargos no governocom mais de uma vacacircncia Pode ser considerado um meio-termo entre o FPTP e oAVS pois os eleitores podem votar em mais de um candidato poreacutem satildeo limitados pelonuacutemero de vagas Em uma eleiccedilatildeo com duas vagas por exemplo cada eleitor selecionaraacutedois candidatos ou menos Sensatamente o candidato mais votado eacute eleito Ele possuialgumas utilizaccedilotildees em eleiccedilotildees locais em algumas partes da Inglaterra (Electoral ReformSociety 2017a)

                                                271 Exemplo

                                                Neste exemplo dois candidatos seratildeo eleitos logo cada eleitor votaraacute em no maacuteximodois candidatos A distribuiccedilatildeo de votos pode ser conferida na tabela 10 e o resultado dacontagem de votos na tabela 11 abaixo Os candidatos eleitos satildeo o C totalizando 78do maacuteximo de votos possiacuteveis para um candidato e o A com 43

                                                Tabela 10 ndash Exemplo BV

                                                Aprovaccedilotildees Ndeg de eleitoresAC 20AB 16BC 19BD 6CA 7CD 15DC 17

                                                Tabela 11 ndash Resultado BVCandidatos Total de votos

                                                A 43B 41C 78D 38

                                                29

                                                272 Voto Uacutetil no BV

                                                Neste sistema eacute possiacutevel que um eleitor evite votar em sua primeira opccedilatildeo quandoeste natildeo tem chances de vitoacuteria e se fazendo isto ele diminuiraacute as chances de algum outrocandidato de seu desgosto ganhar Poreacutem o sistema previne um outro tipo de voto uacutetilEm eleiccedilotildees com mais de uma vaga onde os eleitores soacute podem votar em um candidatose um eleitor sabe que sua primeira opccedilatildeo tambeacutem eacute a primeira opccedilatildeo da maior parteda populaccedilatildeo e portanto muito provavelmente seraacute um dos candidatos eleitos eacute possiacutevelque ele arrisque votar em uma segunda opccedilatildeo sua na esperanccedila de a longo prazo elegersuas duas principais opccedilotildees de voto Com os eleitores podendo votar no nuacutemero exato devagas disponiacuteveis esse tipo de pensamento taacutetico perde o sentido

                                                30

                                                3 O SIMULADOR

                                                Para este trabalho foi implementado um simulador eleitoral na forma de uma aplicaccedilatildeoweb para que a interaccedilatildeo do usuaacuterio fosse facilitada Veremos a seguir como se daacute suautilizaccedilatildeo de forma geral

                                                Figura 2 ndash Captura de tela 1

                                                Figura 3 ndash Captura de tela 2

                                                A primeira opccedilatildeo encontrada pelo usuaacuterio eacute a escolha de quais sistemas de votaccedilatildeo se-ratildeo simulados (Figura 2) Todos eles podem ser selecionados para rodar simultaneamentePoreacutem natildeo eacute permitido rodar uma simulaccedilatildeo do Bloc Vote para uma eleiccedilatildeo onde apenasum candidato eacute eleito aleacutem disso natildeo existe implementaccedilatildeo dos meacutetodos TRS e IRV para

                                                31

                                                eleiccedilotildees com mais de um candidato eleito jaacute que eles se comportariam exatamente comono FPTP

                                                A maioria das linguagens de programaccedilatildeo senatildeo todas possuem um gerador de nuacuteme-ros pseudoaleatoacuterios que fornece a possibilidade de definir uma seed para o gerador Estaseed funciona como um ponto de partida para a geraccedilatildeo dos nuacutemero e portanto todasimulaccedilatildeo que rodar com a mesma seed sempre teraacute os mesmos resultados Se nenhumvalor for fornecido pelo usuaacuterio o tempo atual do sistema eacute utilizado As opccedilotildees subse-quentes satildeo a escolha do nuacutemero de eleitores gerados e o nuacutemero de vagas (Figura 3) Senenhum valor for fornecido o nuacutemero de eleitores padratildeo utilizado eacute 1000 e o nuacutemero devagas igual a 1

                                                Figura 4 ndash Captura de tela 3

                                                Este simulador possui dois modos para a criaccedilatildeo dos rankings dos eleitores No modoManipulate (Figura 4) primeiramente se define o nuacutemero de candidatos atraveacutes do campode entrada ao lado do tiacutetulo Candidates ou alternativamente pode-se adicionar candida-tos um a um atraveacutes do sinal de mais na parte inferior da paacutegina Para cada candidatoeacute possiacutevel definir a porcentagem de seus eleitores que optaraacute pelo voto taacutetico e pelovoto de minoria Tambeacutem eacute possiacutevel alterar o nome dos candidatos se for do interessedo usuaacuterio

                                                32

                                                Figura 5 ndash Captura de tela 4

                                                Figura 6 ndash Captura de tela 5

                                                33

                                                Figura 7 ndash Captura de tela 6

                                                Apoacutes a criaccedilatildeo dos candidatos o usuaacuterio pode criar perfis de eleitores que definiratildeo demaneira exata como partes da populaccedilatildeo iraacute votar (Figura 5) Em cada perfil se defineo valor em porcentos da populaccedilatildeo votante que o adotaraacute e a nota de cada candidatoTambeacutem eacute possiacutevel nomear cada perfil livremente

                                                No modo Generate (Figura 6) eacute onde o gerador de nuacutemeros pseudoaleatoacuterios eacute usadoNesse modo ao inveacutes do usuaacuterio criar perfis de eleitores ele define qual seraacute a distribuiccedilatildeoadotada para a geraccedilatildeo de notas de cada candidato Essas distribuiccedilotildees seratildeo mais bemdetalhadas no Capiacutetulo 5 Da mesma maneira que no modo Manipulate nesse modotambeacutem eacute possiacutevel definir os valores para os dois tipos de voto uacutetil os votos taacuteticos eos votos de minoria No primeiro estatildeo incluiacutedas as estrateacutegias de mudanccedila de votoespeciacuteficas de cada sistema como o bullet voting no AVS e SVS ou quando a preferecircnciade um eleitor claramente natildeo possui chances de vitoacuteria e ele muda seu voto para um doscandidatos que esteja na lideranccedila o que ocorre no FPTP e TRS O voto de minoriase apresenta apenas no FPTP em eleiccedilotildees onde mais de um candidato eacute eleito Se apreferecircncia de um eleitor claramente lidera a eleiccedilatildeo por ser tambeacutem a preferecircncia damaior parte da populaccedilatildeo esse eleitor pode mudar o seu voto para uma segunda opccedilatildeona esperanccedila de eleger dois de seus candidatos favoritos

                                                Por fim em ambos os modos o usuaacuterio tem a opccedilatildeo de definir coalizotildees entre oscandidatos se o sistema TRS estiver habilitado pois as coalizotildees apenas se manifestamnesse sistema Essas coalizotildees alteraratildeo as notas dos candidatos dependendo dos outroscandidatos pertencentes a elas (Figura 7)

                                                A aplicaccedilatildeo pode ser encontrada na paacutegina httpelectionsimpythonanywherecom

                                                34

                                                4 CENAacuteRIOS PERTINENTES

                                                Para todos os cenaacuterios deste capiacutetulo seraacute usada a seed do simulador igual a 100 e apopulaccedilatildeo de eleitores igual a 1000 para que exista consistecircncia na anaacutelise e tambeacutem paraque possa haver replicaccedilatildeo dos resultados se necessaacuterio

                                                41 CENAacuteRIO 1 VOTO TAacuteTICO

                                                Neste exemplo teremos quatro candidatos Ana Beto Carla e Diego Ana e Betoseratildeo gerados a partir da distribuiccedilatildeo Neutral (Figura 47) Carla da distribuiccedilatildeo Disliked(Figura 51) e Diego da Hated (Figura 55) Para a simulaccedilatildeo com a seed 100 o melhorcandidato a ser eleito ou seja aquele que maximiza a meacutedia das notas dos eleitores eacute oBeto com uma meacutedia de 0073 Para cada sistema seratildeo comparados os resultados semvoto taacutetico aos com 20 de voto taacutetico a favor da Ana Abaixo se encontram osresultados para o sistema FPTP

                                                Figura 8 ndash FPTP - Cenaacuterio 1 sem voto taacutetico

                                                Figura 9 ndash TRS segundo turno - Cenaacuterio 1 sem voto taacutetico

                                                35

                                                Figura 10 ndash IRV primeiro turno - Cenaacuterio 1

                                                Figura 11 ndash IRV segundo turno - Cenaacuterio 1

                                                Figura 12 ndash IRV terceiro turno - Cenaacuterio 1

                                                36

                                                Figura 13 ndash AVS - Cenaacuterio 1 sem voto taacutetico

                                                Figura 14 ndash BC - Cenaacuterio 1 sem voto taacutetico

                                                Figura 15 ndash SVS - Cenaacuterio 1 sem voto taacutetico

                                                37

                                                Nesse cenaacuterio sem voto taacutetico o uacutenico sistema que natildeo elege o Beto eacute o AVS Todosos outros elegem o melhor candidato Ou seja apesar de Beto ter uma melhor meacutediadas notas dos eleitores existem mais eleitores que ranqueiam Ana com uma nota acimade 0 No entanto apenas 20 dos eleitores de Diego e Carla que preferem a Ana aoinveacutes do Beto satildeo o suficiente para fazer Beto natildeo ser eleito se eles decidirem abandonarsua primeira opccedilatildeo e votar na Ana Considerando a vantagem que os votos taacuteticosproporcionam agrave Ana esta eacute eleita em todos os sistemas menos o TRS e o IRV

                                                Figura 16 ndash FPTP - Cenaacuterio 1 - 20 de voto taacutetico na Ana

                                                Figura 17 ndash TRS segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                38

                                                Figura 18 ndash IRV primeiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                Figura 19 ndash IRV segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                Figura 20 ndash IRV terceiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                39

                                                Figura 21 ndash AVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                Figura 22 ndash BC - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                Figura 23 ndash SVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                40

                                                Eacute claro que se os eleitores que preferem o Beto tambeacutem votassem de maneira estra-teacutegica a situaccedilatildeo se equilibraria e haveria o mesmo niacutevel de concorrecircncia entre os doiscandidatos que ocorre quando natildeo haacute voto taacutetico Poreacutem no Borda Count esse equiliacute-brio pode natildeo acontecer e as estrateacutegias de compromising e burying podem acabar saindopela culatra se uma porcentagem elevada dos eleitores as adotarem Abaixo encontram-seos resultados para esse sistema quando 100 dos eleitores de Carla e Diego se comportammaliciosamente

                                                Figura 24 ndash BC - Cenaacuterio 1 100 de voto taacutetico na Ana e Beto

                                                Por causa do uso demasiado da estrateacutegia burying Ana e Beto perdem muitos pontose isso abre espaccedilo para uma vitoacuteria da Carla No entanto para porcentagens menores que100 o Beto ainda eacute o vencedor

                                                Essas duas estrateacutegias tambeacutem foram implementadas nesse simulador para o sistemaIRV e eacute possiacutevel ver como ele eacute resistente a elas Para que seja possiacutevel mudar os resultadosde uma eleiccedilatildeo sob o IRV eacute necessaacuterio mudar a ordem de eliminaccedilatildeo dos candidatos paraque o seu candidato preferido acabe enfrentando um candidato mais fraco nas rodadasfinais Isso natildeo ocorre com compromising e burying No proacuteximo cenaacuterio seraacute analisadacomo eacute possiacutevel modificar os resultados de uma eleiccedilatildeo sob o IRV

                                                Esses resultados podem ser replicados acessando os linksSem votos taacuteticos lthttpelectionsimpythonanywherecomdirect_res1111110

                                                --[0021][22Ana2222Beto222022Carla2222Diego22]------100gt

                                                Com 20 de voto taacutetico lthttpelectionsimpythonanywherecomdirect_res1111110--[0021][22Ana222022Beto2222Carla2222Diego22]1-[02000]---100gt

                                                Com 100 de voto taacuteticona Ana e Beto lthttpelectionsimpythonanywherecomdirect_res0000100--[0021][22Ana222022Beto222022Carla2222Diego22]1-[101000]---100gt

                                                41

                                                42 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV

                                                Neste cenaacuterio teremos Ana Carla e Beto concorrendo e trecircs perfis distintos que apoiamcada candidato As distribuiccedilotildees de notas dos perfis se encontram na tabela abaixo

                                                Tabela 12 ndash Distribuiccedilatildeo de notas - Cenaacuterio 2

                                                Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                deeleitores

                                                1 10 5 0 422 0 10 5 303 5 0 10 28

                                                Com essas distribuiccedilotildees Carla eacute eliminada na primeira rodada e seus 28 de votossatildeo transferidos para a segunda opccedilatildeo de seus eleitores Ana que eacute eleita com 70 dosvotos e uma meacutedia de 56

                                                Figura 25 ndash IRV primeiro turno - Cenaacuterio 2

                                                Figura 26 ndash IRV segundo turno - Cenaacuterio 2

                                                42

                                                Cientes desse provaacutevel futuro cenaacuterio onde Ana eacute eleita uma pequena parte dos elei-tores de Beto estrategicamente o abandona e decide apoiar Carla na esperanccedila de leva-laao segundo turno contra Ana As novas distribuiccedilotildees de notas se encontram na tabelaabaixo com essa porccedilatildeo de eleitores representada pelo perfil 4

                                                Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2

                                                Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                deeleitores

                                                1 10 5 0 422 0 10 5 283 5 0 10 284 0 8 10 2

                                                Essa mudanccedila estrateacutegica de voto altera a ordem de eliminaccedilotildees do sistema com Betosendo o primeiro a ser eliminado Com isso seus votos satildeo naturalmente transferidos paraCarla que derrota Ana no segundo turno com 58 dos votos

                                                Figura 27 ndash IRV primeiro turno com voto taacutetico - Cenaacuterio 2

                                                Figura 28 ndash IRV segundo turno com voto taacutetico - Cenaacuterio 2

                                                43

                                                Percebendo que a eleiccedilatildeo de Beto natildeo era provaacutevel seus eleitores conseguiram aomenos impedir a eleiccedilatildeo do pior candidato para eles Mas para isso foi necessaacuterio queeles tivessem a informaccedilatildeo de como os outros eleitores votariam Uma aproximaccedilatildeo dessasinformaccedilotildees poderia ser obtida em um cenaacuterio real com poucos candidatos atraveacutes depesquisas eleitorais poreacutem se o nuacutemero de candidatos eacute significativo uma noccedilatildeo completadas distribuiccedilotildees dos rankings dos eleitores se torna muito menos viaacutevel e dificulta aformulaccedilatildeo de estrateacutegias para alterar a ordem em que os candidatos satildeo eliminados

                                                Esses resultados podem ser replicados acessando os linksSem voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana22

                                                22Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                Com voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana

                                                2222Beto2222Carla22]-----42Voter20Profile2001020520028Voter20Profile2010201020528Voter20Profile202520020102Voter20Profile20302082010100gt

                                                43 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE

                                                O interessante dos sistemas IRV e TRS eacute que os resultados do cenaacuterio anterior po-deriam ter sido obtidos ao inveacutes do voto taacutetico pela sua natildeo-monotonicidade Seriapossiacutevel que a Carla derrotasse a Ana no segundo turno atraveacutes do proacuteprio aumento depopularidade da Ana Assumindo que essa popularizaccedilatildeo ocorresse entre os candidatosdo perfil 2 onde 3 passasse a apoiar a Ana ao inveacutes do Beto as novas distribuiccedilotildeesseguiriam a tabela abaixo

                                                Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                deeleitores

                                                1 10 5 0 452 0 10 5 273 5 0 10 28

                                                Dessa maneira Beto agora com uma porcentagem dos eleitores menor do que a deCarla seraacute eliminado na primeira rodada e como seus eleitores tecircm a Carla como segundaopccedilatildeo ela receberaacute todos os seus votos e seraacute eleita na segunda rodada As rodadas doIRV podem ser vistas nas figuras 29 e 30

                                                44

                                                Figura 29 ndash IRV primeiro turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                Figura 30 ndash IRV segundo turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                Tabela 15 ndash Resultados do Cenaacuterio 3Candidato

                                                eleitoMeacutedia das

                                                notasAntes da

                                                popularizaccedilatildeode Ana

                                                Ana 56

                                                Apoacutespopularizaccedilatildeo

                                                de AnaCarla 415

                                                Os efeitos dessa caracteriacutestica se refletem na satisfaccedilatildeo meacutedia da populaccedilatildeo A Ana eacuteclaramente a melhor candidata e mesmo com o seu ganho de popularidade (ou devido aele) a Carla eacute eleita

                                                Esses resultados podem ser replicados acessando os linksAntes da popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecom

                                                direct_res0010000---[22Ana2222Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                45

                                                Apoacutes popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana2222Beto2222Carla22]-----45Voter20Profile2001020520027Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                44 CENAacuteRIO 4 COALIZOtildeES

                                                O TRS por ser organizado em dois turnos separados normalmente a semanas dedistacircncia um do outro acaba abrindo brecha agrave mudanccedila de opiniatildeo por parte dos eleitorese o desenvolvimento de novas estrateacutegias por parte dos candidatos tais como a coalizatildeocom candidatos jaacute eliminados Com isso em mente nesse cenaacuterio teremos novamenteos quatro candidatos Ana Beto Carla e Diego Os trecircs primeiros seratildeo gerados dadistribuiccedilatildeo Neutral e Diego da distribuiccedilatildeo Disliked

                                                Figura 31 ndash TRS turno 1 - Cenaacuterio 4

                                                No TRS normal Ana Beto e Carla possuem com essas distribuiccedilotildees quantidades devotos muito proacuteximas com Beto e Carla indo para o segundo turno Carla estaacute 10 votosatraacutes de Beto e decide aproveitar o espaccedilo de tempo entre os dois turnos para tentaragregar mais votos Com isso Carla se aproxima de Diego e juntos formam uma coalizatildeoNo entanto com sua baixa popularidade Diego acaba ferindo a reputaccedilatildeo de Carla etorna o segundo turno muito mais faacutecil para Beto (Figura 33) Se Carla tivesse buscado osuporte de Ana por outro lado ela se veria vitoriosa no segundo turno e com uma amplavantagem sobre o Beto (Figura 34) Ou ateacute mesmo sem buscar uma coalizatildeo mesmosendo uma corrida apertada Carla teria naturalmente sido eleita (Figura 32)

                                                Esses resultados podem ser replicados acessando os linksSem coalizotildees lthttpelectionsimpythonanywherecomdirect_res0100000

                                                --[0002][22Ana222022Beto2222Carla2222Diego22]------100gt

                                                46

                                                Figura 32 ndash TRS turno 2 - Cenaacuterio 4

                                                Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4

                                                Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4

                                                47

                                                Coalizatildeo Carla e Diego lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2203Carla20Diego-100gt

                                                Coalizatildeo Carla e Ana lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2200Carla20Ana-100gt

                                                45 CENAacuteRIO 5 DILEMA DO PRISIONEIRO

                                                Neste cenaacuterio temos uma eleiccedilatildeo de uma vaga com trecircs candidatos concorrentes e trecircsperfis distintos de eleitores que seguiratildeo as seguintes distribuiccedilotildees

                                                Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5

                                                Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                deeleitores

                                                1 10 -10 5 362 -10 10 5 343 -10 -10 5 30

                                                Esse contexto nos remete ao notaacutevel dilema do prisioneiro Nele dois prisioneiroscuacutemplices satildeo interrogados individualmente sem poder se comunicar um com o outro ecada um enfrenta o dilema de delatar ou natildeo o seu parceiro Se os dois prisioneirosdecidem se manter calados sobre o crime ambos satildeo sentenciados a um ano de prisatildeo Seapenas um deles dedurar o outro o traidor sai livre enquanto seu parceiro eacute condenadoa trecircs anos Se ambos dedurarem um ao outro eles satildeo condenados juntos a dois anosde prisatildeo Esse dilema eacute uma ideia claacutessica presente no estudo da teoria dos jogos sendooriginalmente elaborada por Merrill Flood e Melvin Dresher em 1950 e mais tarde sendonomeada de dilema dos prisioneiros por Albert W Tucker (POUNDSTONE 1992)

                                                O que esse dilema nos mostra eacute a tentaccedilatildeo que o indiviacuteduo deteacutem se sua racionalizaccedilatildeoestiver voltada para seus proacuteprios interesses e somente eles em oposiccedilatildeo a pensar no bemdo grupo como um todo Neste cenaacuterio encontramos dois grupos de eleitores expressiva-mente opostos os perfis 1 e 2 Se qualquer uma das preferecircncias desses perfis fosse eleitaisso significaria uma alta rejeiccedilatildeo de maior parte da populaccedilatildeo No entanto eles possuema segunda opccedilatildeo em comum a Carla que por sua vez eacute a preferecircncia do terceiro perfilPortanto a eleiccedilatildeo da Carla seria logicamente o resultado oacutetimo

                                                Mesmo assim a Ana eacute eleita nos dois sistemas acima o que natildeo parece justo poispela tabela 16 eacute evidente que apenas 36 da populaccedilatildeo a aprova enquanto que os outros64 a reprovam ao maacuteximo O sistema IRV se comporta de maneira idecircntica ao TRS

                                                48

                                                Figura 35 ndash FPTP - Cenaacuterio 5

                                                Figura 36 ndash TRS segundo turno - Cenaacuterio 5

                                                nesta situaccedilatildeo Com esse resultado a meacutedia das notas eacute -28 No entanto os trecircs sistemasseguintes nos apresentam resultados diferentes

                                                Tabela 17 ndash Resultados do Cenaacuterio 5

                                                Sistema Candidatoeleito

                                                Meacutedia dasnotas

                                                FPTP Ana -28TRS Ana -28IRV Ana -28AVS Carla 50BC Carla 50SVS Carla 50

                                                49

                                                Figura 37 ndash AVS - Cenaacuterio 5

                                                Figura 38 ndash BC - Cenaacuterio 5

                                                Tanto o AVS quanto o Borda Count e o SVS satildeo sistemas que consideram todasas opiniotildees de cada eleitor ao mesmo tempo e por isso satildeo capazes de eleger o melhorcandidato nesta situaccedilatildeo diferentemente do TRS que natildeo absorve completamente todosentimento do eleitor por todos os candidatos e o IRV que apesar de ser bem expressivoquebra esse processo em inuacutemeras rodadas o que permite a perda de informaccedilatildeo ao longodelas

                                                Esses resultados podem ser replicados acessando o linklthttpelectionsimpythonanywherecomdirect_res1111110---[22Ana

                                                222022Beto222022Carla22]-----36Voter20Profile2001020-1020534Voter20Profile201-10201020530Voter20Profile202-1020-10205100gt

                                                50

                                                Figura 39 ndash SVS - Cenaacuterio 5

                                                46 CENAacuteRIO 6 VOTO DE MINORIA

                                                Neste cenaacuterio temos uma eleiccedilatildeo com quatro candidatos e duas vagas A Ana seraacutea preferecircncia de uma extensa parte da populaccedilatildeo (distribuiccedilatildeo Loved Figura 53) Betoe Carla seratildeo candidatos razoavelmente populares (distribuiccedilatildeo Neutral Figura 47) eDiego seraacute a preferecircncia de apenas um pequeno grupo especiacutefico e rejeitado pela maioria(distribuiccedilatildeo Disliked Figura 51) Eacute intuitivo esperar que os dois candidatos eleitos seratildeoa Ana e ou o Beto ou a Carla e isso eacute exatamente o que ocorre na figura 40 no sistemaFPTP sem voto de minoria

                                                Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria

                                                Eacute evidente a discrepacircncia da quantidade de votos da Ana para os outros candidatose apesar de Beto e Carla serem mais populares que Diego os trecircs natildeo se encontrammuito afastados Poreacutem se a pequena fraccedilatildeo de candidatos que possuem a Ana como

                                                51

                                                Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego

                                                preferecircncia e Diego como segunda opccedilatildeo optarem pelo voto de minoria a situaccedilatildeo mudacompletamente (Figura 41) Assim apesar de extensamente rejeitado Diego conquistaa segunda vaga e a meacutedia das notas despenca de 2929 para 0505 No entanto aindaexiste um cenaacuterio pior Se os outros grupos de eleitores pensarem da mesma forma eevitarem votar na Ana achando que sua eleiccedilatildeo jaacute estaacute assegurada apenas 80 de votode minoria para esses grupos jaacute eacute o suficiente para eliminaacute-la das eleiccedilotildees (Figura 42)Com a Ana eliminada a meacutedia das notas cai ainda mais para 0058

                                                Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego

                                                O sistema Bloc Vote eacute uma das soluccedilotildees para o voto de minoria Permitindo queos eleitores votem no mesmo nuacutemero de candidatos que de vagas a serem preenchidasnatildeo existe o iacutempeto a esse tipo de voto estrateacutegico O resultado desse sistema portantoretorna a meacutedia das notas a casa dos 29 (Figura 43) Os sistemas AVS Borda Count eSVS tambeacutem impedem a presenccedila do voto de minoria e atingem resultados semelhantes

                                                52

                                                Figura 43 ndash BV - Cenaacuterio 6

                                                Tabela 18 ndash Resultados do Cenaacuterio 6

                                                Sistema Candidatoseleitos

                                                Meacutedia dasnotas

                                                FPTP sem voto de minoriaAna eBeto 2929

                                                FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

                                                FPTP com 80 de voto de minoriaBeto eCarla 0058

                                                Bloc VoteAna eCarla 2913

                                                Esses resultados podem ser replicados acessando os links

                                                Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

                                                100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

                                                80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

                                                53

                                                5 COMO FUNCIONA O SIMULADOR

                                                O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

                                                51 CLASSE ELECTIONS

                                                Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

                                                bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

                                                Figura 44 ndash estrutura candidates

                                                bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

                                                bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

                                                Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

                                                Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

                                                54

                                                Figura 45 ndash estrutura voters

                                                Figura 46 ndash estrutura votes

                                                daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

                                                Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

                                                55

                                                Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

                                                Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

                                                na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

                                                56

                                                Figura 49 ndash PDF - Distribuiccedilatildeo Liked

                                                Figura 50 ndash CDF - Distribuiccedilatildeo Liked

                                                (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

                                                Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

                                                57

                                                Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

                                                Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

                                                candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

                                                Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

                                                58

                                                Figura 53 ndash PDF - Distribuiccedilatildeo Loved

                                                Figura 54 ndash CDF - Distribuiccedilatildeo Loved

                                                funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

                                                59

                                                Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                                                Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                                                Meacutedia das Notas sumei

                                                sumvj nij

                                                etimes v

                                                Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                                                Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                                                60

                                                Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                                                Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                                                52 CLASSE FIRSTPASTTHEPOST

                                                Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                                                Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                                                61

                                                Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                                                Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                                                mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                                                62

                                                53 CLASSE TWOROUNDSYSTEM

                                                A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                                                54 CLASSE INSTANTRUNOFFVOTING

                                                A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                                                Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                                                63

                                                cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                                                55 CLASSE APPROVALVOTING

                                                Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                                                56 CLASSE BORDACOUNT

                                                Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                                                57 CLASSE SCOREVOTING

                                                De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                                                64

                                                58 CLASSE BLOCVOTE

                                                O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                                                59 TECNOLOGIAS UTILIZADAS

                                                A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                                                Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                                                O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                                                Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                                                65

                                                6 CONCLUSAtildeO

                                                Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                                                Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                                                Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                                                Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                                                Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                                                66

                                                REFEREcircNCIAS

                                                AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                                                Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                                                Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                                                Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                                                HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                                                LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                                                ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                                                Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                                                POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                                                The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                                                67

                                                APEcircNDICES

                                                APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                                Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                                if(not len(selfvoter_profiles))

                                                for voter in range(selfN_VOTERS)

                                                candidates_rank = dict()

                                                for candidate in reversed(range(selfN_CANDIDATES))

                                                if(selfBIAS_VECTOR[candidate]==4)

                                                candidates_rank[candidate] = self_sortear(selfloved)

                                                elif(selfBIAS_VECTOR[candidate]==3)

                                                candidates_rank[candidate] = self_sortear(selfliked)

                                                elif(selfBIAS_VECTOR[candidate]==2)

                                                candidates_rank[candidate] = self_sortear(selfdisliked)

                                                elif(selfBIAS_VECTOR[candidate]==1)

                                                candidates_rank[candidate] = self_sortear(selfhated)

                                                elif(selfBIAS_VECTOR[candidate]==-1)

                                                candidates_rank[candidate] = self_sortear(selfpolarizer

                                                )

                                                elif(selfBIAS_VECTOR[candidate]==-2)

                                                candidates_rank[candidate] = self_sortear(self

                                                more_polarizer)

                                                else

                                                candidates_rank[candidate] = self_sortear(selfneutral)

                                                selfvotersappend(candidates_rank)

                                                else

                                                ranges = []

                                                ranks = []

                                                for prof in selfvoter_profiles

                                                rangesappend(int(prof[pop_percentage]))

                                                rank =

                                                for index score in enumerate(prof[scores])

                                                rank[index] = score

                                                ranksappend(rank)

                                                for index _range in enumerate(ranges)

                                                for _ in range(int(selfN_VOTERS(_range100)))

                                                selfvotersappend(ranks[index])

                                                68

                                                APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                                Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                                for i in range(selfN_CANDIDATES)

                                                selfcandidates[i] = 0

                                                selfvotes[i] = set()

                                                APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                                Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                                for candidate in range(selfN_CANDIDATES)

                                                rating_sum = 0

                                                for voter in selfvoters

                                                rating_sum += voter[candidate]

                                                selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                                APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                                Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                                if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                                return selfcalculate_mean(winners)

                                                else

                                                chose_best = True if winners[0] == selfbest_candidate else

                                                False

                                                return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                                69

                                                APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                                Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                                rating_sum = 0

                                                for voter in selfvoters

                                                for candidate in winners

                                                rating_sum += voter[candidate]

                                                return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                                APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                                Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                                for i in range(1 selfN_VACANCIES + 2)

                                                selfleading_candidatesappend(selfsorted_candidates[-i][self

                                                CANDIDATE_INDEX])

                                                APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                                Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                                for leader in selfelecrounds[-1]

                                                selfleading_candidatesappend(leader[0])

                                                70

                                                APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                                Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                                self_account_for_coalitions()

                                                for voter in selfvoters

                                                selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                                (1)))

                                                temp = []

                                                for voter in selfsorted_voters

                                                new_dict = defaultdict(list)

                                                for k in voter

                                                new_dict[k[1]]append(k[0])

                                                tempappend(new_dict)

                                                selfsorted_voters = []

                                                for voter_index current_voter in enumerate(temp)

                                                new_voter = []

                                                for rating candidate_indexes in current_voteritems()

                                                if len(current_voter[rating]) gt 1

                                                shuffle(current_voter[rating])

                                                for e in candidate_indexes

                                                new_voterappend((e rating))

                                                else

                                                new_voterappend((candidate_indexes[0] rating))

                                                selfsorted_votersappend(new_voter)

                                                selfcandidates[new_voter[-1][0]] += 1

                                                selfvotes[new_voter[-1][0]]add(voter_index)

                                                71

                                                APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                                Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                                for candidate in selfvotes_copy

                                                if candidate not in selfelecleading_candidates

                                                for voter_index in selfvotes_copy[candidate]

                                                for index _candidate in enumerate(reversed(selfelec

                                                sorted_voters[voter_index]))

                                                if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                                leading_candidates

                                                if randomrandom() lt selfelec

                                                tactical_vote_percentages[_candidate[selfelec

                                                CANDIDATE_INDEX]]

                                                selfrankings_changed[voter_index] = copy

                                                deepcopy(selfelecsorted_voters[voter_index])

                                                selfrankings_changed[voter_index][-(index + 1)]

                                                selfrankings_changed[voter_index][-1] = self

                                                rankings_changed[voter_index][-1] self

                                                rankings_changed[voter_index][-(index + 1)]

                                                selfcandidates[candidate] -= 1

                                                selfcandidates[_candidate[selfelec

                                                CANDIDATE_INDEX]] += 1

                                                selfvotes[candidate]remove(voter_index)

                                                selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                                ]]add(voter_index)

                                                break

                                                break

                                                72

                                                APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                                Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                                half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                                for candidate in selfelecleading_candidates

                                                if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                                continue

                                                for voter_index in selfvotes_copy[candidate]

                                                if voter_index in selfrankings_changed

                                                ranking = selfrankings_changed[voter_index]

                                                else

                                                ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                                ])

                                                for index _candidate in enumerate(reversed(ranking))

                                                if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                leading_candidates or (_candidate[selfelec

                                                CANDIDATE_INDEX] in selfelecleading_candidates and

                                                selfelecleading_candidatesindex(_candidate[selfelec

                                                CANDIDATE_INDEX]) gt= half_vacancies)

                                                if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                                if randomrandom() lt selfelec

                                                minority_vote_percentages[_candidate[selfelec

                                                CANDIDATE_INDEX]]

                                                selfcandidates[candidate] -= 1

                                                selfcandidates[_candidate[selfelec

                                                CANDIDATE_INDEX]] += 1

                                                break

                                                break

                                                break

                                                73

                                                APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                                Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                                self_account_for_coalitions()

                                                for candidate in selfvotes

                                                if candidate = selfwinner and candidate = selfsecond_place

                                                for voter_index in selfvotes[candidate]

                                                if voter_index in selfrankings_changed

                                                ranking = selfrankings_changed[voter_index]

                                                else

                                                ranking = copydeepcopy(selfelecsorted_voters[

                                                voter_index])

                                                for index2 candidate in enumerate(reversed(ranking))

                                                if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                                selfcandidates[selfwinner] += 1

                                                selfvotes[selfwinner]add(voter_index)

                                                break

                                                elif candidate[selfelecCANDIDATE_INDEX] == self

                                                second_place

                                                selfcandidates[selfsecond_place] += 1

                                                selfvotes[selfsecond_place]add(voter_index)

                                                break

                                                selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                winners = []

                                                vacancies = selfelecN_VACANCIES

                                                for candidate in reversed(selfsorted_candidates)

                                                if vacancies == 0

                                                break

                                                winnersappend(candidate[0])

                                                vacancies -= 1

                                                mean chose_best = selfelecget_mean(winners = winners)

                                                74

                                                APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                                Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                                for voter_index voter in enumerate(selfelecsorted_voters)

                                                voter_dict = dict()

                                                og_voter_dict = dict()

                                                for tup in voter

                                                voter_dict[tup[0]] = tup[1]

                                                og_voter_dict[tup[0]] = tup[1]

                                                for coalition in selfeleccoalitions

                                                for candidate in coalition

                                                add_to_score = 0

                                                for candidate2 in coalition

                                                if candidate == candidate2

                                                continue

                                                half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                                if half lt 0

                                                add_to_score += mathceil(half)

                                                else

                                                add_to_score += mathfloor(half)

                                                if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                                voter_dict[candidate[rsquovaluersquo]] = 10

                                                elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                                voter_dict[candidate[rsquovaluersquo]] = -10

                                                else

                                                voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                                selfrankings_changed[voter_index] = []

                                                for candidate in voter_dict

                                                selfrankings_changed[voter_index]append((candidate voter_dict[

                                                candidate]))

                                                selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                                voter_index] key=lambda x x[1])

                                                75

                                                APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                selfelecroundsappend(selfsorted_candidates[_round])

                                                if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                N_VACANCIES - 1)

                                                return 2

                                                elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                N_VOTERS gt 05)

                                                return 1

                                                else

                                                selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                CANDIDATE_INDEX])

                                                for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                elecCANDIDATE_INDEX]]

                                                if voter_index in selfrankings_changed

                                                for candidate in reversed(selfrankings_changed[voter_index

                                                ])

                                                if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                excluded

                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                ]] += 1

                                                selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                add(voter_index)

                                                break

                                                else

                                                continue

                                                else

                                                for candidate in reversed(selfelecsorted_voters[

                                                voter_index])

                                                if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                excluded

                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                ]] += 1

                                                selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                add(voter_index)

                                                break

                                                else

                                                continue

                                                selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                return 0

                                                76

                                                APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                for index in range(selfelecN_CANDIDATES)

                                                selfcandidates[index] = 0

                                                for voter in selfelecsorted_voters

                                                for candidate in reversed(voter)

                                                if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                else

                                                break

                                                APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                for index in range(selfelecN_CANDIDATES)

                                                selfcandidates[index] = 0

                                                for voter in selfelecsorted_voters

                                                if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                elecCANDIDATE_INDEX]]

                                                selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                else

                                                for candidate in reversed(voter)

                                                if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                else

                                                break

                                                77

                                                APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                pos = set()

                                                for index perc in enumerate(selfelectactical_vote_percentages)

                                                if perc gt 0

                                                posadd(index)

                                                for candidate in selfeleccandidates

                                                if candidate not in selfleading_candidates

                                                for voter_index in selfvotes[candidate]

                                                raised = None

                                                for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                ])

                                                if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                leading_candidates

                                                if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                if randomrandom() lt selfelectactical_vote_percentages[

                                                candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                ranking = [None]selfelecN_CANDIDATES

                                                ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                selfelecvoters[voter_index][candidate_tuple[selfelec

                                                CANDIDATE_INDEX]])

                                                raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                break

                                                break

                                                break

                                                if raised = None

                                                for _candidate in selfleading_candidates

                                                if _candidate = ranking[-1][0]

                                                ranking[0] = (_candidate selfelecvoters[voter_index][

                                                _candidate])

                                                buried = _candidate

                                                break

                                                i = 1

                                                for candidate_tuple in selfelecsorted_voters[voter_index]

                                                if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                buried]

                                                continue

                                                else

                                                ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                selfelecvoters[voter_index][candidate_tuple[selfelec

                                                CANDIDATE_INDEX]])

                                                i += 1

                                                selfrankings_changed[voter_index] = ranking

                                                78

                                                APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                for voter_index in selfvotes[candidate]

                                                if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                ]

                                                for _candidate in selfleading_candidates

                                                if _candidate = candidate

                                                ranking = [None]selfelecN_CANDIDATES

                                                ranking[0] = (_candidate selfelecvoters[voter_index][

                                                _candidate])

                                                buried = _candidate

                                                break

                                                i = 1

                                                for candidate_tuple in selfelecsorted_voters[voter_index]

                                                if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                continue

                                                else

                                                ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                selfelecvoters[voter_index][candidate_tuple[selfelec

                                                CANDIDATE_INDEX]])

                                                i += 1

                                                selfrankings_changed[voter_index] = ranking

                                                79

                                                APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                for index in range(selfelecN_CANDIDATES)

                                                selfcandidates[index] = 0

                                                for voter_index voter in enumerate(selfelecsorted_voters)

                                                score = 0

                                                if voter_index in selfrankings_changed

                                                for candidate in selfrankings_changed[voter_index]

                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                score += 1

                                                else

                                                for candidate in voter

                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                score += 1

                                                APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                for voter_index voter in enumerate(selfelecsorted_voters)

                                                if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                elecCANDIDATE_INDEX]]

                                                selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                sorted_voters[voter_index])

                                                for candidate_index candidate in enumerate(reversed(voter))

                                                if candidate_index == 0

                                                selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                else

                                                selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                80

                                                APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                for index in range(selfelecN_CANDIDATES)

                                                selfcandidates[index] = 0

                                                for voter_index voter in enumerate(selfelecsorted_voters)

                                                if voter_index in selfrankings_changed

                                                for candidate in selfrankings_changed[voter_index]

                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                selfelecCANDIDATE_RANK]

                                                else

                                                for candidate in voter

                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                selfelecCANDIDATE_RANK]

                                                APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                for index in range(selfelecN_CANDIDATES)

                                                selfcandidates[index] = 0

                                                for voter in selfelecsorted_voters

                                                votes = selfelecN_VACANCIES

                                                for candidate in reversed(voter)

                                                if votes == 0

                                                break

                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                votes -= 1

                                                • Folha de aprovaccedilatildeo
                                                • Agradecimentos
                                                • Epiacutegrafe
                                                • Resumo
                                                • Abstract
                                                • Lista de ilustraccedilotildees
                                                • Lista de Coacutedigos
                                                • Lista de tabelas
                                                • Lista de abreviaturas e siglas
                                                • Sumaacuterio
                                                • INTRODUCcedilAtildeO
                                                  • MOTIVACcedilAtildeO E OBJETIVO
                                                  • MEacuteTODO
                                                  • ESTRUTURA
                                                    • SISTEMAS ELEITORAIS
                                                      • FISRT PAST THE POST
                                                        • Exemplo
                                                        • Vantagens e Desvantagens do FPTP
                                                        • Voto Uacutetil no FPTP
                                                          • TWO-ROUND SYSTEM
                                                            • Exemplo
                                                            • Vantagens e Desvantagens do TRS
                                                            • Voto Uacutetil no TRS
                                                              • INSTANT-RUNOFF VOTING
                                                                • Exemplo
                                                                • Vantagens e Desvantagens do IRV
                                                                • Voto Uacutetil no IRV
                                                                  • APPROVAL VOTING SYSTEM
                                                                    • Exemplo
                                                                    • Vantagens e Desvantagens do AVS
                                                                    • Voto Uacutetil no AVS
                                                                      • THE BORDA COUNT
                                                                        • Exemplo
                                                                        • Vantagens e Desvantagens do BC
                                                                        • Voto Uacutetil no BC
                                                                          • SCORE VOTING SYSTEM
                                                                            • Exemplo
                                                                            • Vantagens e Desvantagens do SVS
                                                                            • Voto Uacutetil no SVS
                                                                              • BLOC VOTE
                                                                                • Exemplo
                                                                                • Voto Uacutetil no BV
                                                                                    • O SIMULADOR
                                                                                    • CENAacuteRIOS PERTINENTES
                                                                                      • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                      • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                      • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                      • CENAacuteRIO 4 COALIZOtildeES
                                                                                      • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                      • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                        • COMO FUNCIONA O SIMULADOR
                                                                                          • CLASSE Elections
                                                                                          • CLASSE FirstPastThePost
                                                                                          • CLASSE TwoRoundSystem
                                                                                          • CLASSE InstantRunoffVoting
                                                                                          • CLASSE ApprovalVoting
                                                                                          • CLASSE BordaCount
                                                                                          • CLASSE ScoreVoting
                                                                                          • CLASSE BlocVote
                                                                                          • TECNOLOGIAS UTILIZADAS
                                                                                            • CONCLUSAtildeO
                                                                                            • Referecircncias
                                                                                            • Meacutetodo create_voters
                                                                                            • Meacutetodo create_candidates
                                                                                            • Meacutetodo calculate_means
                                                                                            • Meacutetodo get_mean
                                                                                            • Meacutetodo calculate_mean
                                                                                            • Meacutetodo set_leading_candidates
                                                                                            • Meacutetodo irv_set_leading_candidates
                                                                                            • Meacutetodo sort_ranks
                                                                                            • Meacutetodo fptp_count_tactical_votes
                                                                                            • Meacutetodo fptp_count_minority_votes
                                                                                            • Meacutetodo trs_second_round
                                                                                            • Meacutetodo trs_account_for_coalitions
                                                                                            • Meacutetodo irv_count_votes
                                                                                            • Meacutetodo avs_count_votes
                                                                                            • Meacutetodo avs_count_votes_with_tactical
                                                                                            • Meacutetodo irv_apply_tactical_votes
                                                                                            • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                            • Meacutetodo bc_sum_candidates_scores
                                                                                            • Meacutetodo svs_apply_tactical_votes
                                                                                            • Meacutetodo svs_sum_candidates_scores
                                                                                            • Meacutetodo bv_count_votes

                                                  25

                                                  Outro efeito dessa liberdade trazida pelo AVS eacute a dizimaccedilatildeo do spoiler effect Can-didatos de partidos menores natildeo tem como roubar votos de partidos maiores nessesistema ambos os candidatos contabilizariam o voto

                                                  243 Voto Uacutetil no AVS

                                                  O tipo de voto uacutetil no AVS eacute denominado bullet voting Segundo The Center forElection Science (2015) esta taacutetica envolve simplesmente ignorar a possibilidade de votarem mais de um candidato e votar apenas em sua primeira opccedilatildeo Um eleitor pode serlevado a adotar essa estrateacutegia quando percebe que sua preferecircncia pode ser prejudicadacom o voto em alguma segunda opccedilatildeo sua Em um cenaacuterio extremo onde 100 doseleitores adotam esta estrateacutegia as eleiccedilotildees satildeo convertidas a um simples First Past ThePost

                                                  25 THE BORDA COUNT

                                                  Este meacutetodo carrega o nome em homenagem a seu criador Jean-Charles de Bordaque o desenvolveu em 1770 (LIPPMAN 2012) A contagem de Borda utiliza a abordagemde ranqueamento dos candidatos poreacutem de maneira diferente ao IRV Este eacute um sistemaque atribui uma pontuaccedilatildeo aos candidatos com base nestes rankings O candidato na basedo ranking natildeo recebe pontos o candidato imediatamente acima deste recebe 1 pontoo proacuteximo recebe 2 pontos e assim por diante ateacute o topo do ranking As pontuaccedilotildees detodos os rankings satildeo contabilizadas e o candidato com maior pontuaccedilatildeo eacute eleito Deacordo com Lippman variaccedilotildees deste meacutetodo satildeo encontradas em uso na premiaccedilatildeo dediversos esportes como na seleccedilatildeo do MVP(Most Valuable Player) da MLB(principal ligade beisebol dos EUA) e no Trofeacuteu Heisman de futebol americano universitaacuterio

                                                  251 Exemplo

                                                  Neste exemplo seratildeo aproveitados os mesmos rankings apresentados na tabela 3 Porserem 4 candidatos o primeiro colocado de cada ranking receberaacute 3 pontos o segundo 2pontos o terceiro 1 e o quarto 0 Assim o nuacutemero maacuteximo de pontos que um candidatopode atingir eacute igual a 300(se ficar na primeira posiccedilatildeo em todos os rankings) e o nuacutemerototal de pontos no sistema eacute 600 O nuacutemero maacuteximo de pontos que um candidato podeatingir eacute calculado com

                                                  (cminus 1)times e

                                                  Sendo c igual ao nuacutemero de candidatos e e o nuacutemero de eleitores Por sua vez onuacutemero total de pontos no sistema eacute

                                                  26

                                                  (cminus 1)times c2

                                                  times e

                                                  A contagem final dos pontos eacute apresentada na tabela 7 abaixo

                                                  Tabela 7 ndash Resultado BCCandidatos Total de pontos

                                                  A 146B 181C 126D 147

                                                  O candidato eleito eacute o B com 181 pontos ou aproximadamente 60 da pontuaccedilatildeomaacutexima

                                                  252 Vantagens e Desvantagens do BC

                                                  Em comparaccedilatildeo com os meacutetodos abordados anteriormente que apenas consideramas primeiras opccedilotildees de cada eleitor este meacutetodo regularmente escolhe candidatos comaceitaccedilatildeo mais ampla ao inveacutes de uma preferecircncia direta dos eleitores (Electoral ReformSociety 2017b)

                                                  Ele tambeacutem encoraja uma abordagem estrateacutegica por parte dos partidos onde seriade seu interesse nomear mais de um candidato para concorrer pois quanto mais candi-datos estatildeo no paacutereo maior eacute a pontuaccedilatildeo dos primeiros colocados Logo a nomeaccedilatildeo decandidatos menos populares pode beneficiar os principais candidatos de um partido

                                                  253 Voto Uacutetil no BC

                                                  Existem duas estrateacutegias aplicaacuteveis a esse sistema A primeira denominada compromi-sing de maneira similar a outros meacutetodos de votaccedilatildeo se resume em ranquear em primeirolugar um dos candidatos que estejam liderando as eleiccedilotildees mesmo que este natildeo seja suapreferecircncia real A segunda estrateacutegia burying eacute o oposto esta se baseia em ranquearem uacuteltimo lugar um dos candidatos liacutederes mesmo que este natildeo seja o seu candidato demaior desgosto Ambas estrateacutegias podem ser aplicadas ao mesmo tempo por um eleitor

                                                  26 SCORE VOTING SYSTEM

                                                  Score Voting ou Range Voting como tambeacutem eacute conhecido eacute mais um meacutetodo quetenta trazer maior liberdade de expressatildeo aos eleitores Assim como o Borda Counteste sistema funciona baseado na pontuaccedilatildeo dos candidatos no entanto ao inveacutes dessapontuaccedilatildeo ser relativa agrave posiccedilatildeo do candidato no ranking de cada eleitor este por sua veztem completa liberdade de atribuir qualquer quantidade de pontos aos candidatos dentro

                                                  27

                                                  de determinada escala Um eleitor pode dar o mesmo nuacutemero de pontos para diferentescandidatos e apoacutes o somatoacuterio de todas as pontuaccedilotildees o candidato com a pontuaccedilatildeo maisalta eacute eleito Incorporado ao escopo poliacutetico o SVS eacute utilizado no Partido Pirata Alematildeobem como em diversas organizaccedilotildees tais como o Fedora Project e Mozilla e tambeacutem emvariados esportes oliacutempicos e reality shows como o American Idol aponta Hamlin (2015)

                                                  261 Exemplo

                                                  Neste exemplo temos apresentados na tabela 8 abaixo 4 perfis distintos de eleitorese suas respectivas atribuiccedilotildees de pontos aos 4 candidatos Cada eleitor pode atribuirqualquer pontuaccedilatildeo a um candidato dentro da escala de -10 a 10 O resultado da eleiccedilatildeoapoacutes a soma de todos os pontos por candidato se encontra na tabela 9 onde o candidatoA eacute eleito com um total de 605 pontos

                                                  Tabela 8 ndash Exemplo SVS

                                                  Perfil A B C D Ndeg de eleitores1 10 -1 5 2 362 6 9 -3 4 253 2 0 8 4 224 3 3 3 10 17

                                                  Tabela 9 ndash Resultado SVSCandidatos Total de pontos

                                                  A 605B 240C 332D 430

                                                  262 Vantagens e Desvantagens do SVS

                                                  A grande vantagem do SVS eacute como ele proporciona aos eleitores expressar de maneiramuito proacutexima potencialmente exata suas impressotildees poliacuteticas de cada candidato Eleeacute ainda mais expressivo que o AVS Dessa maneira o spoiler effect tambeacutem se torna nuloao passo que toda intenccedilatildeo de voto eacute precisamente representada neste sistema

                                                  Assim como outros meacutetodos eleitorais este sofre igualmente dos males produzidos pelovoto taacutetico Sua principal desvantagem eacute discutida na seccedilatildeo abaixo

                                                  263 Voto Uacutetil no SVS

                                                  Da mesma maneira que no Approval Voting atraveacutes do bullet voting o SVS tambeacutempode ser convertido em uma eleiccedilatildeo sob o meacutetodo FPTP em um cenaacuterio com um grande

                                                  28

                                                  volume de eleitores maliciosos O voto uacutetil sob este sistema se manifesta pontuando-seapenas um candidato com uma nota positiva e todos os outros com as notas mais baixasda escala Se todos os eleitores se aproveitarem dessa abordagem natildeo existiraacute distinccedilatildeoefetiva entre uma eleiccedilatildeo sob SVS e FPTP Essencialmente cada eleitor estaacute votando emapenas um candidato Essa eacute a principal desvantagem do SVS e ela consegue eliminarsua principal vantagem dar ao eleitor um poder maior de expressatildeo

                                                  27 BLOC VOTE

                                                  O Bloc Vote eacute um meacutetodo utilizado para a eleiccedilatildeo de candidatos a cargos no governocom mais de uma vacacircncia Pode ser considerado um meio-termo entre o FPTP e oAVS pois os eleitores podem votar em mais de um candidato poreacutem satildeo limitados pelonuacutemero de vagas Em uma eleiccedilatildeo com duas vagas por exemplo cada eleitor selecionaraacutedois candidatos ou menos Sensatamente o candidato mais votado eacute eleito Ele possuialgumas utilizaccedilotildees em eleiccedilotildees locais em algumas partes da Inglaterra (Electoral ReformSociety 2017a)

                                                  271 Exemplo

                                                  Neste exemplo dois candidatos seratildeo eleitos logo cada eleitor votaraacute em no maacuteximodois candidatos A distribuiccedilatildeo de votos pode ser conferida na tabela 10 e o resultado dacontagem de votos na tabela 11 abaixo Os candidatos eleitos satildeo o C totalizando 78do maacuteximo de votos possiacuteveis para um candidato e o A com 43

                                                  Tabela 10 ndash Exemplo BV

                                                  Aprovaccedilotildees Ndeg de eleitoresAC 20AB 16BC 19BD 6CA 7CD 15DC 17

                                                  Tabela 11 ndash Resultado BVCandidatos Total de votos

                                                  A 43B 41C 78D 38

                                                  29

                                                  272 Voto Uacutetil no BV

                                                  Neste sistema eacute possiacutevel que um eleitor evite votar em sua primeira opccedilatildeo quandoeste natildeo tem chances de vitoacuteria e se fazendo isto ele diminuiraacute as chances de algum outrocandidato de seu desgosto ganhar Poreacutem o sistema previne um outro tipo de voto uacutetilEm eleiccedilotildees com mais de uma vaga onde os eleitores soacute podem votar em um candidatose um eleitor sabe que sua primeira opccedilatildeo tambeacutem eacute a primeira opccedilatildeo da maior parteda populaccedilatildeo e portanto muito provavelmente seraacute um dos candidatos eleitos eacute possiacutevelque ele arrisque votar em uma segunda opccedilatildeo sua na esperanccedila de a longo prazo elegersuas duas principais opccedilotildees de voto Com os eleitores podendo votar no nuacutemero exato devagas disponiacuteveis esse tipo de pensamento taacutetico perde o sentido

                                                  30

                                                  3 O SIMULADOR

                                                  Para este trabalho foi implementado um simulador eleitoral na forma de uma aplicaccedilatildeoweb para que a interaccedilatildeo do usuaacuterio fosse facilitada Veremos a seguir como se daacute suautilizaccedilatildeo de forma geral

                                                  Figura 2 ndash Captura de tela 1

                                                  Figura 3 ndash Captura de tela 2

                                                  A primeira opccedilatildeo encontrada pelo usuaacuterio eacute a escolha de quais sistemas de votaccedilatildeo se-ratildeo simulados (Figura 2) Todos eles podem ser selecionados para rodar simultaneamentePoreacutem natildeo eacute permitido rodar uma simulaccedilatildeo do Bloc Vote para uma eleiccedilatildeo onde apenasum candidato eacute eleito aleacutem disso natildeo existe implementaccedilatildeo dos meacutetodos TRS e IRV para

                                                  31

                                                  eleiccedilotildees com mais de um candidato eleito jaacute que eles se comportariam exatamente comono FPTP

                                                  A maioria das linguagens de programaccedilatildeo senatildeo todas possuem um gerador de nuacuteme-ros pseudoaleatoacuterios que fornece a possibilidade de definir uma seed para o gerador Estaseed funciona como um ponto de partida para a geraccedilatildeo dos nuacutemero e portanto todasimulaccedilatildeo que rodar com a mesma seed sempre teraacute os mesmos resultados Se nenhumvalor for fornecido pelo usuaacuterio o tempo atual do sistema eacute utilizado As opccedilotildees subse-quentes satildeo a escolha do nuacutemero de eleitores gerados e o nuacutemero de vagas (Figura 3) Senenhum valor for fornecido o nuacutemero de eleitores padratildeo utilizado eacute 1000 e o nuacutemero devagas igual a 1

                                                  Figura 4 ndash Captura de tela 3

                                                  Este simulador possui dois modos para a criaccedilatildeo dos rankings dos eleitores No modoManipulate (Figura 4) primeiramente se define o nuacutemero de candidatos atraveacutes do campode entrada ao lado do tiacutetulo Candidates ou alternativamente pode-se adicionar candida-tos um a um atraveacutes do sinal de mais na parte inferior da paacutegina Para cada candidatoeacute possiacutevel definir a porcentagem de seus eleitores que optaraacute pelo voto taacutetico e pelovoto de minoria Tambeacutem eacute possiacutevel alterar o nome dos candidatos se for do interessedo usuaacuterio

                                                  32

                                                  Figura 5 ndash Captura de tela 4

                                                  Figura 6 ndash Captura de tela 5

                                                  33

                                                  Figura 7 ndash Captura de tela 6

                                                  Apoacutes a criaccedilatildeo dos candidatos o usuaacuterio pode criar perfis de eleitores que definiratildeo demaneira exata como partes da populaccedilatildeo iraacute votar (Figura 5) Em cada perfil se defineo valor em porcentos da populaccedilatildeo votante que o adotaraacute e a nota de cada candidatoTambeacutem eacute possiacutevel nomear cada perfil livremente

                                                  No modo Generate (Figura 6) eacute onde o gerador de nuacutemeros pseudoaleatoacuterios eacute usadoNesse modo ao inveacutes do usuaacuterio criar perfis de eleitores ele define qual seraacute a distribuiccedilatildeoadotada para a geraccedilatildeo de notas de cada candidato Essas distribuiccedilotildees seratildeo mais bemdetalhadas no Capiacutetulo 5 Da mesma maneira que no modo Manipulate nesse modotambeacutem eacute possiacutevel definir os valores para os dois tipos de voto uacutetil os votos taacuteticos eos votos de minoria No primeiro estatildeo incluiacutedas as estrateacutegias de mudanccedila de votoespeciacuteficas de cada sistema como o bullet voting no AVS e SVS ou quando a preferecircnciade um eleitor claramente natildeo possui chances de vitoacuteria e ele muda seu voto para um doscandidatos que esteja na lideranccedila o que ocorre no FPTP e TRS O voto de minoriase apresenta apenas no FPTP em eleiccedilotildees onde mais de um candidato eacute eleito Se apreferecircncia de um eleitor claramente lidera a eleiccedilatildeo por ser tambeacutem a preferecircncia damaior parte da populaccedilatildeo esse eleitor pode mudar o seu voto para uma segunda opccedilatildeona esperanccedila de eleger dois de seus candidatos favoritos

                                                  Por fim em ambos os modos o usuaacuterio tem a opccedilatildeo de definir coalizotildees entre oscandidatos se o sistema TRS estiver habilitado pois as coalizotildees apenas se manifestamnesse sistema Essas coalizotildees alteraratildeo as notas dos candidatos dependendo dos outroscandidatos pertencentes a elas (Figura 7)

                                                  A aplicaccedilatildeo pode ser encontrada na paacutegina httpelectionsimpythonanywherecom

                                                  34

                                                  4 CENAacuteRIOS PERTINENTES

                                                  Para todos os cenaacuterios deste capiacutetulo seraacute usada a seed do simulador igual a 100 e apopulaccedilatildeo de eleitores igual a 1000 para que exista consistecircncia na anaacutelise e tambeacutem paraque possa haver replicaccedilatildeo dos resultados se necessaacuterio

                                                  41 CENAacuteRIO 1 VOTO TAacuteTICO

                                                  Neste exemplo teremos quatro candidatos Ana Beto Carla e Diego Ana e Betoseratildeo gerados a partir da distribuiccedilatildeo Neutral (Figura 47) Carla da distribuiccedilatildeo Disliked(Figura 51) e Diego da Hated (Figura 55) Para a simulaccedilatildeo com a seed 100 o melhorcandidato a ser eleito ou seja aquele que maximiza a meacutedia das notas dos eleitores eacute oBeto com uma meacutedia de 0073 Para cada sistema seratildeo comparados os resultados semvoto taacutetico aos com 20 de voto taacutetico a favor da Ana Abaixo se encontram osresultados para o sistema FPTP

                                                  Figura 8 ndash FPTP - Cenaacuterio 1 sem voto taacutetico

                                                  Figura 9 ndash TRS segundo turno - Cenaacuterio 1 sem voto taacutetico

                                                  35

                                                  Figura 10 ndash IRV primeiro turno - Cenaacuterio 1

                                                  Figura 11 ndash IRV segundo turno - Cenaacuterio 1

                                                  Figura 12 ndash IRV terceiro turno - Cenaacuterio 1

                                                  36

                                                  Figura 13 ndash AVS - Cenaacuterio 1 sem voto taacutetico

                                                  Figura 14 ndash BC - Cenaacuterio 1 sem voto taacutetico

                                                  Figura 15 ndash SVS - Cenaacuterio 1 sem voto taacutetico

                                                  37

                                                  Nesse cenaacuterio sem voto taacutetico o uacutenico sistema que natildeo elege o Beto eacute o AVS Todosos outros elegem o melhor candidato Ou seja apesar de Beto ter uma melhor meacutediadas notas dos eleitores existem mais eleitores que ranqueiam Ana com uma nota acimade 0 No entanto apenas 20 dos eleitores de Diego e Carla que preferem a Ana aoinveacutes do Beto satildeo o suficiente para fazer Beto natildeo ser eleito se eles decidirem abandonarsua primeira opccedilatildeo e votar na Ana Considerando a vantagem que os votos taacuteticosproporcionam agrave Ana esta eacute eleita em todos os sistemas menos o TRS e o IRV

                                                  Figura 16 ndash FPTP - Cenaacuterio 1 - 20 de voto taacutetico na Ana

                                                  Figura 17 ndash TRS segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                  38

                                                  Figura 18 ndash IRV primeiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                  Figura 19 ndash IRV segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                  Figura 20 ndash IRV terceiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                  39

                                                  Figura 21 ndash AVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                  Figura 22 ndash BC - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                  Figura 23 ndash SVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                  40

                                                  Eacute claro que se os eleitores que preferem o Beto tambeacutem votassem de maneira estra-teacutegica a situaccedilatildeo se equilibraria e haveria o mesmo niacutevel de concorrecircncia entre os doiscandidatos que ocorre quando natildeo haacute voto taacutetico Poreacutem no Borda Count esse equiliacute-brio pode natildeo acontecer e as estrateacutegias de compromising e burying podem acabar saindopela culatra se uma porcentagem elevada dos eleitores as adotarem Abaixo encontram-seos resultados para esse sistema quando 100 dos eleitores de Carla e Diego se comportammaliciosamente

                                                  Figura 24 ndash BC - Cenaacuterio 1 100 de voto taacutetico na Ana e Beto

                                                  Por causa do uso demasiado da estrateacutegia burying Ana e Beto perdem muitos pontose isso abre espaccedilo para uma vitoacuteria da Carla No entanto para porcentagens menores que100 o Beto ainda eacute o vencedor

                                                  Essas duas estrateacutegias tambeacutem foram implementadas nesse simulador para o sistemaIRV e eacute possiacutevel ver como ele eacute resistente a elas Para que seja possiacutevel mudar os resultadosde uma eleiccedilatildeo sob o IRV eacute necessaacuterio mudar a ordem de eliminaccedilatildeo dos candidatos paraque o seu candidato preferido acabe enfrentando um candidato mais fraco nas rodadasfinais Isso natildeo ocorre com compromising e burying No proacuteximo cenaacuterio seraacute analisadacomo eacute possiacutevel modificar os resultados de uma eleiccedilatildeo sob o IRV

                                                  Esses resultados podem ser replicados acessando os linksSem votos taacuteticos lthttpelectionsimpythonanywherecomdirect_res1111110

                                                  --[0021][22Ana2222Beto222022Carla2222Diego22]------100gt

                                                  Com 20 de voto taacutetico lthttpelectionsimpythonanywherecomdirect_res1111110--[0021][22Ana222022Beto2222Carla2222Diego22]1-[02000]---100gt

                                                  Com 100 de voto taacuteticona Ana e Beto lthttpelectionsimpythonanywherecomdirect_res0000100--[0021][22Ana222022Beto222022Carla2222Diego22]1-[101000]---100gt

                                                  41

                                                  42 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV

                                                  Neste cenaacuterio teremos Ana Carla e Beto concorrendo e trecircs perfis distintos que apoiamcada candidato As distribuiccedilotildees de notas dos perfis se encontram na tabela abaixo

                                                  Tabela 12 ndash Distribuiccedilatildeo de notas - Cenaacuterio 2

                                                  Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                  deeleitores

                                                  1 10 5 0 422 0 10 5 303 5 0 10 28

                                                  Com essas distribuiccedilotildees Carla eacute eliminada na primeira rodada e seus 28 de votossatildeo transferidos para a segunda opccedilatildeo de seus eleitores Ana que eacute eleita com 70 dosvotos e uma meacutedia de 56

                                                  Figura 25 ndash IRV primeiro turno - Cenaacuterio 2

                                                  Figura 26 ndash IRV segundo turno - Cenaacuterio 2

                                                  42

                                                  Cientes desse provaacutevel futuro cenaacuterio onde Ana eacute eleita uma pequena parte dos elei-tores de Beto estrategicamente o abandona e decide apoiar Carla na esperanccedila de leva-laao segundo turno contra Ana As novas distribuiccedilotildees de notas se encontram na tabelaabaixo com essa porccedilatildeo de eleitores representada pelo perfil 4

                                                  Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2

                                                  Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                  deeleitores

                                                  1 10 5 0 422 0 10 5 283 5 0 10 284 0 8 10 2

                                                  Essa mudanccedila estrateacutegica de voto altera a ordem de eliminaccedilotildees do sistema com Betosendo o primeiro a ser eliminado Com isso seus votos satildeo naturalmente transferidos paraCarla que derrota Ana no segundo turno com 58 dos votos

                                                  Figura 27 ndash IRV primeiro turno com voto taacutetico - Cenaacuterio 2

                                                  Figura 28 ndash IRV segundo turno com voto taacutetico - Cenaacuterio 2

                                                  43

                                                  Percebendo que a eleiccedilatildeo de Beto natildeo era provaacutevel seus eleitores conseguiram aomenos impedir a eleiccedilatildeo do pior candidato para eles Mas para isso foi necessaacuterio queeles tivessem a informaccedilatildeo de como os outros eleitores votariam Uma aproximaccedilatildeo dessasinformaccedilotildees poderia ser obtida em um cenaacuterio real com poucos candidatos atraveacutes depesquisas eleitorais poreacutem se o nuacutemero de candidatos eacute significativo uma noccedilatildeo completadas distribuiccedilotildees dos rankings dos eleitores se torna muito menos viaacutevel e dificulta aformulaccedilatildeo de estrateacutegias para alterar a ordem em que os candidatos satildeo eliminados

                                                  Esses resultados podem ser replicados acessando os linksSem voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana22

                                                  22Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                  Com voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana

                                                  2222Beto2222Carla22]-----42Voter20Profile2001020520028Voter20Profile2010201020528Voter20Profile202520020102Voter20Profile20302082010100gt

                                                  43 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE

                                                  O interessante dos sistemas IRV e TRS eacute que os resultados do cenaacuterio anterior po-deriam ter sido obtidos ao inveacutes do voto taacutetico pela sua natildeo-monotonicidade Seriapossiacutevel que a Carla derrotasse a Ana no segundo turno atraveacutes do proacuteprio aumento depopularidade da Ana Assumindo que essa popularizaccedilatildeo ocorresse entre os candidatosdo perfil 2 onde 3 passasse a apoiar a Ana ao inveacutes do Beto as novas distribuiccedilotildeesseguiriam a tabela abaixo

                                                  Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                  Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                  deeleitores

                                                  1 10 5 0 452 0 10 5 273 5 0 10 28

                                                  Dessa maneira Beto agora com uma porcentagem dos eleitores menor do que a deCarla seraacute eliminado na primeira rodada e como seus eleitores tecircm a Carla como segundaopccedilatildeo ela receberaacute todos os seus votos e seraacute eleita na segunda rodada As rodadas doIRV podem ser vistas nas figuras 29 e 30

                                                  44

                                                  Figura 29 ndash IRV primeiro turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                  Figura 30 ndash IRV segundo turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                  Tabela 15 ndash Resultados do Cenaacuterio 3Candidato

                                                  eleitoMeacutedia das

                                                  notasAntes da

                                                  popularizaccedilatildeode Ana

                                                  Ana 56

                                                  Apoacutespopularizaccedilatildeo

                                                  de AnaCarla 415

                                                  Os efeitos dessa caracteriacutestica se refletem na satisfaccedilatildeo meacutedia da populaccedilatildeo A Ana eacuteclaramente a melhor candidata e mesmo com o seu ganho de popularidade (ou devido aele) a Carla eacute eleita

                                                  Esses resultados podem ser replicados acessando os linksAntes da popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecom

                                                  direct_res0010000---[22Ana2222Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                  45

                                                  Apoacutes popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana2222Beto2222Carla22]-----45Voter20Profile2001020520027Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                  44 CENAacuteRIO 4 COALIZOtildeES

                                                  O TRS por ser organizado em dois turnos separados normalmente a semanas dedistacircncia um do outro acaba abrindo brecha agrave mudanccedila de opiniatildeo por parte dos eleitorese o desenvolvimento de novas estrateacutegias por parte dos candidatos tais como a coalizatildeocom candidatos jaacute eliminados Com isso em mente nesse cenaacuterio teremos novamenteos quatro candidatos Ana Beto Carla e Diego Os trecircs primeiros seratildeo gerados dadistribuiccedilatildeo Neutral e Diego da distribuiccedilatildeo Disliked

                                                  Figura 31 ndash TRS turno 1 - Cenaacuterio 4

                                                  No TRS normal Ana Beto e Carla possuem com essas distribuiccedilotildees quantidades devotos muito proacuteximas com Beto e Carla indo para o segundo turno Carla estaacute 10 votosatraacutes de Beto e decide aproveitar o espaccedilo de tempo entre os dois turnos para tentaragregar mais votos Com isso Carla se aproxima de Diego e juntos formam uma coalizatildeoNo entanto com sua baixa popularidade Diego acaba ferindo a reputaccedilatildeo de Carla etorna o segundo turno muito mais faacutecil para Beto (Figura 33) Se Carla tivesse buscado osuporte de Ana por outro lado ela se veria vitoriosa no segundo turno e com uma amplavantagem sobre o Beto (Figura 34) Ou ateacute mesmo sem buscar uma coalizatildeo mesmosendo uma corrida apertada Carla teria naturalmente sido eleita (Figura 32)

                                                  Esses resultados podem ser replicados acessando os linksSem coalizotildees lthttpelectionsimpythonanywherecomdirect_res0100000

                                                  --[0002][22Ana222022Beto2222Carla2222Diego22]------100gt

                                                  46

                                                  Figura 32 ndash TRS turno 2 - Cenaacuterio 4

                                                  Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4

                                                  Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4

                                                  47

                                                  Coalizatildeo Carla e Diego lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2203Carla20Diego-100gt

                                                  Coalizatildeo Carla e Ana lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2200Carla20Ana-100gt

                                                  45 CENAacuteRIO 5 DILEMA DO PRISIONEIRO

                                                  Neste cenaacuterio temos uma eleiccedilatildeo de uma vaga com trecircs candidatos concorrentes e trecircsperfis distintos de eleitores que seguiratildeo as seguintes distribuiccedilotildees

                                                  Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5

                                                  Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                  deeleitores

                                                  1 10 -10 5 362 -10 10 5 343 -10 -10 5 30

                                                  Esse contexto nos remete ao notaacutevel dilema do prisioneiro Nele dois prisioneiroscuacutemplices satildeo interrogados individualmente sem poder se comunicar um com o outro ecada um enfrenta o dilema de delatar ou natildeo o seu parceiro Se os dois prisioneirosdecidem se manter calados sobre o crime ambos satildeo sentenciados a um ano de prisatildeo Seapenas um deles dedurar o outro o traidor sai livre enquanto seu parceiro eacute condenadoa trecircs anos Se ambos dedurarem um ao outro eles satildeo condenados juntos a dois anosde prisatildeo Esse dilema eacute uma ideia claacutessica presente no estudo da teoria dos jogos sendooriginalmente elaborada por Merrill Flood e Melvin Dresher em 1950 e mais tarde sendonomeada de dilema dos prisioneiros por Albert W Tucker (POUNDSTONE 1992)

                                                  O que esse dilema nos mostra eacute a tentaccedilatildeo que o indiviacuteduo deteacutem se sua racionalizaccedilatildeoestiver voltada para seus proacuteprios interesses e somente eles em oposiccedilatildeo a pensar no bemdo grupo como um todo Neste cenaacuterio encontramos dois grupos de eleitores expressiva-mente opostos os perfis 1 e 2 Se qualquer uma das preferecircncias desses perfis fosse eleitaisso significaria uma alta rejeiccedilatildeo de maior parte da populaccedilatildeo No entanto eles possuema segunda opccedilatildeo em comum a Carla que por sua vez eacute a preferecircncia do terceiro perfilPortanto a eleiccedilatildeo da Carla seria logicamente o resultado oacutetimo

                                                  Mesmo assim a Ana eacute eleita nos dois sistemas acima o que natildeo parece justo poispela tabela 16 eacute evidente que apenas 36 da populaccedilatildeo a aprova enquanto que os outros64 a reprovam ao maacuteximo O sistema IRV se comporta de maneira idecircntica ao TRS

                                                  48

                                                  Figura 35 ndash FPTP - Cenaacuterio 5

                                                  Figura 36 ndash TRS segundo turno - Cenaacuterio 5

                                                  nesta situaccedilatildeo Com esse resultado a meacutedia das notas eacute -28 No entanto os trecircs sistemasseguintes nos apresentam resultados diferentes

                                                  Tabela 17 ndash Resultados do Cenaacuterio 5

                                                  Sistema Candidatoeleito

                                                  Meacutedia dasnotas

                                                  FPTP Ana -28TRS Ana -28IRV Ana -28AVS Carla 50BC Carla 50SVS Carla 50

                                                  49

                                                  Figura 37 ndash AVS - Cenaacuterio 5

                                                  Figura 38 ndash BC - Cenaacuterio 5

                                                  Tanto o AVS quanto o Borda Count e o SVS satildeo sistemas que consideram todasas opiniotildees de cada eleitor ao mesmo tempo e por isso satildeo capazes de eleger o melhorcandidato nesta situaccedilatildeo diferentemente do TRS que natildeo absorve completamente todosentimento do eleitor por todos os candidatos e o IRV que apesar de ser bem expressivoquebra esse processo em inuacutemeras rodadas o que permite a perda de informaccedilatildeo ao longodelas

                                                  Esses resultados podem ser replicados acessando o linklthttpelectionsimpythonanywherecomdirect_res1111110---[22Ana

                                                  222022Beto222022Carla22]-----36Voter20Profile2001020-1020534Voter20Profile201-10201020530Voter20Profile202-1020-10205100gt

                                                  50

                                                  Figura 39 ndash SVS - Cenaacuterio 5

                                                  46 CENAacuteRIO 6 VOTO DE MINORIA

                                                  Neste cenaacuterio temos uma eleiccedilatildeo com quatro candidatos e duas vagas A Ana seraacutea preferecircncia de uma extensa parte da populaccedilatildeo (distribuiccedilatildeo Loved Figura 53) Betoe Carla seratildeo candidatos razoavelmente populares (distribuiccedilatildeo Neutral Figura 47) eDiego seraacute a preferecircncia de apenas um pequeno grupo especiacutefico e rejeitado pela maioria(distribuiccedilatildeo Disliked Figura 51) Eacute intuitivo esperar que os dois candidatos eleitos seratildeoa Ana e ou o Beto ou a Carla e isso eacute exatamente o que ocorre na figura 40 no sistemaFPTP sem voto de minoria

                                                  Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria

                                                  Eacute evidente a discrepacircncia da quantidade de votos da Ana para os outros candidatose apesar de Beto e Carla serem mais populares que Diego os trecircs natildeo se encontrammuito afastados Poreacutem se a pequena fraccedilatildeo de candidatos que possuem a Ana como

                                                  51

                                                  Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego

                                                  preferecircncia e Diego como segunda opccedilatildeo optarem pelo voto de minoria a situaccedilatildeo mudacompletamente (Figura 41) Assim apesar de extensamente rejeitado Diego conquistaa segunda vaga e a meacutedia das notas despenca de 2929 para 0505 No entanto aindaexiste um cenaacuterio pior Se os outros grupos de eleitores pensarem da mesma forma eevitarem votar na Ana achando que sua eleiccedilatildeo jaacute estaacute assegurada apenas 80 de votode minoria para esses grupos jaacute eacute o suficiente para eliminaacute-la das eleiccedilotildees (Figura 42)Com a Ana eliminada a meacutedia das notas cai ainda mais para 0058

                                                  Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego

                                                  O sistema Bloc Vote eacute uma das soluccedilotildees para o voto de minoria Permitindo queos eleitores votem no mesmo nuacutemero de candidatos que de vagas a serem preenchidasnatildeo existe o iacutempeto a esse tipo de voto estrateacutegico O resultado desse sistema portantoretorna a meacutedia das notas a casa dos 29 (Figura 43) Os sistemas AVS Borda Count eSVS tambeacutem impedem a presenccedila do voto de minoria e atingem resultados semelhantes

                                                  52

                                                  Figura 43 ndash BV - Cenaacuterio 6

                                                  Tabela 18 ndash Resultados do Cenaacuterio 6

                                                  Sistema Candidatoseleitos

                                                  Meacutedia dasnotas

                                                  FPTP sem voto de minoriaAna eBeto 2929

                                                  FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

                                                  FPTP com 80 de voto de minoriaBeto eCarla 0058

                                                  Bloc VoteAna eCarla 2913

                                                  Esses resultados podem ser replicados acessando os links

                                                  Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

                                                  100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

                                                  80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

                                                  53

                                                  5 COMO FUNCIONA O SIMULADOR

                                                  O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

                                                  51 CLASSE ELECTIONS

                                                  Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

                                                  bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

                                                  Figura 44 ndash estrutura candidates

                                                  bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

                                                  bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

                                                  Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

                                                  Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

                                                  54

                                                  Figura 45 ndash estrutura voters

                                                  Figura 46 ndash estrutura votes

                                                  daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

                                                  Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

                                                  55

                                                  Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

                                                  Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

                                                  na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

                                                  56

                                                  Figura 49 ndash PDF - Distribuiccedilatildeo Liked

                                                  Figura 50 ndash CDF - Distribuiccedilatildeo Liked

                                                  (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

                                                  Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

                                                  57

                                                  Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

                                                  Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

                                                  candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

                                                  Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

                                                  58

                                                  Figura 53 ndash PDF - Distribuiccedilatildeo Loved

                                                  Figura 54 ndash CDF - Distribuiccedilatildeo Loved

                                                  funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

                                                  59

                                                  Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                                                  Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                                                  Meacutedia das Notas sumei

                                                  sumvj nij

                                                  etimes v

                                                  Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                                                  Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                                                  60

                                                  Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                                                  Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                                                  52 CLASSE FIRSTPASTTHEPOST

                                                  Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                                                  Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                                                  61

                                                  Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                                                  Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                                                  mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                                                  62

                                                  53 CLASSE TWOROUNDSYSTEM

                                                  A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                                                  54 CLASSE INSTANTRUNOFFVOTING

                                                  A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                                                  Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                                                  63

                                                  cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                                                  55 CLASSE APPROVALVOTING

                                                  Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                                                  56 CLASSE BORDACOUNT

                                                  Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                                                  57 CLASSE SCOREVOTING

                                                  De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                                                  64

                                                  58 CLASSE BLOCVOTE

                                                  O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                                                  59 TECNOLOGIAS UTILIZADAS

                                                  A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                                                  Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                                                  O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                                                  Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                                                  65

                                                  6 CONCLUSAtildeO

                                                  Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                                                  Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                                                  Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                                                  Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                                                  Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                                                  66

                                                  REFEREcircNCIAS

                                                  AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                                                  Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                                                  Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                                                  Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                                                  HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                                                  LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                                                  ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                                                  Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                                                  POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                                                  The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                                                  67

                                                  APEcircNDICES

                                                  APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                                  Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                                  if(not len(selfvoter_profiles))

                                                  for voter in range(selfN_VOTERS)

                                                  candidates_rank = dict()

                                                  for candidate in reversed(range(selfN_CANDIDATES))

                                                  if(selfBIAS_VECTOR[candidate]==4)

                                                  candidates_rank[candidate] = self_sortear(selfloved)

                                                  elif(selfBIAS_VECTOR[candidate]==3)

                                                  candidates_rank[candidate] = self_sortear(selfliked)

                                                  elif(selfBIAS_VECTOR[candidate]==2)

                                                  candidates_rank[candidate] = self_sortear(selfdisliked)

                                                  elif(selfBIAS_VECTOR[candidate]==1)

                                                  candidates_rank[candidate] = self_sortear(selfhated)

                                                  elif(selfBIAS_VECTOR[candidate]==-1)

                                                  candidates_rank[candidate] = self_sortear(selfpolarizer

                                                  )

                                                  elif(selfBIAS_VECTOR[candidate]==-2)

                                                  candidates_rank[candidate] = self_sortear(self

                                                  more_polarizer)

                                                  else

                                                  candidates_rank[candidate] = self_sortear(selfneutral)

                                                  selfvotersappend(candidates_rank)

                                                  else

                                                  ranges = []

                                                  ranks = []

                                                  for prof in selfvoter_profiles

                                                  rangesappend(int(prof[pop_percentage]))

                                                  rank =

                                                  for index score in enumerate(prof[scores])

                                                  rank[index] = score

                                                  ranksappend(rank)

                                                  for index _range in enumerate(ranges)

                                                  for _ in range(int(selfN_VOTERS(_range100)))

                                                  selfvotersappend(ranks[index])

                                                  68

                                                  APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                                  Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                                  for i in range(selfN_CANDIDATES)

                                                  selfcandidates[i] = 0

                                                  selfvotes[i] = set()

                                                  APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                                  Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                                  for candidate in range(selfN_CANDIDATES)

                                                  rating_sum = 0

                                                  for voter in selfvoters

                                                  rating_sum += voter[candidate]

                                                  selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                                  APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                                  Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                                  if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                                  return selfcalculate_mean(winners)

                                                  else

                                                  chose_best = True if winners[0] == selfbest_candidate else

                                                  False

                                                  return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                                  69

                                                  APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                                  Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                                  rating_sum = 0

                                                  for voter in selfvoters

                                                  for candidate in winners

                                                  rating_sum += voter[candidate]

                                                  return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                                  APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                                  Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                                  for i in range(1 selfN_VACANCIES + 2)

                                                  selfleading_candidatesappend(selfsorted_candidates[-i][self

                                                  CANDIDATE_INDEX])

                                                  APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                                  Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                                  for leader in selfelecrounds[-1]

                                                  selfleading_candidatesappend(leader[0])

                                                  70

                                                  APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                                  Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                                  self_account_for_coalitions()

                                                  for voter in selfvoters

                                                  selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                                  (1)))

                                                  temp = []

                                                  for voter in selfsorted_voters

                                                  new_dict = defaultdict(list)

                                                  for k in voter

                                                  new_dict[k[1]]append(k[0])

                                                  tempappend(new_dict)

                                                  selfsorted_voters = []

                                                  for voter_index current_voter in enumerate(temp)

                                                  new_voter = []

                                                  for rating candidate_indexes in current_voteritems()

                                                  if len(current_voter[rating]) gt 1

                                                  shuffle(current_voter[rating])

                                                  for e in candidate_indexes

                                                  new_voterappend((e rating))

                                                  else

                                                  new_voterappend((candidate_indexes[0] rating))

                                                  selfsorted_votersappend(new_voter)

                                                  selfcandidates[new_voter[-1][0]] += 1

                                                  selfvotes[new_voter[-1][0]]add(voter_index)

                                                  71

                                                  APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                                  Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                                  for candidate in selfvotes_copy

                                                  if candidate not in selfelecleading_candidates

                                                  for voter_index in selfvotes_copy[candidate]

                                                  for index _candidate in enumerate(reversed(selfelec

                                                  sorted_voters[voter_index]))

                                                  if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                                  leading_candidates

                                                  if randomrandom() lt selfelec

                                                  tactical_vote_percentages[_candidate[selfelec

                                                  CANDIDATE_INDEX]]

                                                  selfrankings_changed[voter_index] = copy

                                                  deepcopy(selfelecsorted_voters[voter_index])

                                                  selfrankings_changed[voter_index][-(index + 1)]

                                                  selfrankings_changed[voter_index][-1] = self

                                                  rankings_changed[voter_index][-1] self

                                                  rankings_changed[voter_index][-(index + 1)]

                                                  selfcandidates[candidate] -= 1

                                                  selfcandidates[_candidate[selfelec

                                                  CANDIDATE_INDEX]] += 1

                                                  selfvotes[candidate]remove(voter_index)

                                                  selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                                  ]]add(voter_index)

                                                  break

                                                  break

                                                  72

                                                  APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                                  Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                                  half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                                  for candidate in selfelecleading_candidates

                                                  if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                                  continue

                                                  for voter_index in selfvotes_copy[candidate]

                                                  if voter_index in selfrankings_changed

                                                  ranking = selfrankings_changed[voter_index]

                                                  else

                                                  ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                                  ])

                                                  for index _candidate in enumerate(reversed(ranking))

                                                  if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                  leading_candidates or (_candidate[selfelec

                                                  CANDIDATE_INDEX] in selfelecleading_candidates and

                                                  selfelecleading_candidatesindex(_candidate[selfelec

                                                  CANDIDATE_INDEX]) gt= half_vacancies)

                                                  if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                                  if randomrandom() lt selfelec

                                                  minority_vote_percentages[_candidate[selfelec

                                                  CANDIDATE_INDEX]]

                                                  selfcandidates[candidate] -= 1

                                                  selfcandidates[_candidate[selfelec

                                                  CANDIDATE_INDEX]] += 1

                                                  break

                                                  break

                                                  break

                                                  73

                                                  APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                                  Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                                  self_account_for_coalitions()

                                                  for candidate in selfvotes

                                                  if candidate = selfwinner and candidate = selfsecond_place

                                                  for voter_index in selfvotes[candidate]

                                                  if voter_index in selfrankings_changed

                                                  ranking = selfrankings_changed[voter_index]

                                                  else

                                                  ranking = copydeepcopy(selfelecsorted_voters[

                                                  voter_index])

                                                  for index2 candidate in enumerate(reversed(ranking))

                                                  if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                                  selfcandidates[selfwinner] += 1

                                                  selfvotes[selfwinner]add(voter_index)

                                                  break

                                                  elif candidate[selfelecCANDIDATE_INDEX] == self

                                                  second_place

                                                  selfcandidates[selfsecond_place] += 1

                                                  selfvotes[selfsecond_place]add(voter_index)

                                                  break

                                                  selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                  winners = []

                                                  vacancies = selfelecN_VACANCIES

                                                  for candidate in reversed(selfsorted_candidates)

                                                  if vacancies == 0

                                                  break

                                                  winnersappend(candidate[0])

                                                  vacancies -= 1

                                                  mean chose_best = selfelecget_mean(winners = winners)

                                                  74

                                                  APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                                  Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                                  for voter_index voter in enumerate(selfelecsorted_voters)

                                                  voter_dict = dict()

                                                  og_voter_dict = dict()

                                                  for tup in voter

                                                  voter_dict[tup[0]] = tup[1]

                                                  og_voter_dict[tup[0]] = tup[1]

                                                  for coalition in selfeleccoalitions

                                                  for candidate in coalition

                                                  add_to_score = 0

                                                  for candidate2 in coalition

                                                  if candidate == candidate2

                                                  continue

                                                  half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                                  if half lt 0

                                                  add_to_score += mathceil(half)

                                                  else

                                                  add_to_score += mathfloor(half)

                                                  if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                                  voter_dict[candidate[rsquovaluersquo]] = 10

                                                  elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                                  voter_dict[candidate[rsquovaluersquo]] = -10

                                                  else

                                                  voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                                  selfrankings_changed[voter_index] = []

                                                  for candidate in voter_dict

                                                  selfrankings_changed[voter_index]append((candidate voter_dict[

                                                  candidate]))

                                                  selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                                  voter_index] key=lambda x x[1])

                                                  75

                                                  APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                  Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                  selfelecroundsappend(selfsorted_candidates[_round])

                                                  if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                  N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                  N_VACANCIES - 1)

                                                  return 2

                                                  elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                  N_VOTERS gt 05)

                                                  return 1

                                                  else

                                                  selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                  CANDIDATE_INDEX])

                                                  for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                  elecCANDIDATE_INDEX]]

                                                  if voter_index in selfrankings_changed

                                                  for candidate in reversed(selfrankings_changed[voter_index

                                                  ])

                                                  if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                  excluded

                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                  ]] += 1

                                                  selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                  add(voter_index)

                                                  break

                                                  else

                                                  continue

                                                  else

                                                  for candidate in reversed(selfelecsorted_voters[

                                                  voter_index])

                                                  if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                  excluded

                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                  ]] += 1

                                                  selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                  add(voter_index)

                                                  break

                                                  else

                                                  continue

                                                  selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                  return 0

                                                  76

                                                  APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                  Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                  for index in range(selfelecN_CANDIDATES)

                                                  selfcandidates[index] = 0

                                                  for voter in selfelecsorted_voters

                                                  for candidate in reversed(voter)

                                                  if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                  else

                                                  break

                                                  APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                  Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                  for index in range(selfelecN_CANDIDATES)

                                                  selfcandidates[index] = 0

                                                  for voter in selfelecsorted_voters

                                                  if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                  elecCANDIDATE_INDEX]]

                                                  selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                  else

                                                  for candidate in reversed(voter)

                                                  if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                  else

                                                  break

                                                  77

                                                  APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                  Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                  pos = set()

                                                  for index perc in enumerate(selfelectactical_vote_percentages)

                                                  if perc gt 0

                                                  posadd(index)

                                                  for candidate in selfeleccandidates

                                                  if candidate not in selfleading_candidates

                                                  for voter_index in selfvotes[candidate]

                                                  raised = None

                                                  for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                  ])

                                                  if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                  leading_candidates

                                                  if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                  if randomrandom() lt selfelectactical_vote_percentages[

                                                  candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                  ranking = [None]selfelecN_CANDIDATES

                                                  ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                  selfelecvoters[voter_index][candidate_tuple[selfelec

                                                  CANDIDATE_INDEX]])

                                                  raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                  break

                                                  break

                                                  break

                                                  if raised = None

                                                  for _candidate in selfleading_candidates

                                                  if _candidate = ranking[-1][0]

                                                  ranking[0] = (_candidate selfelecvoters[voter_index][

                                                  _candidate])

                                                  buried = _candidate

                                                  break

                                                  i = 1

                                                  for candidate_tuple in selfelecsorted_voters[voter_index]

                                                  if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                  buried]

                                                  continue

                                                  else

                                                  ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                  selfelecvoters[voter_index][candidate_tuple[selfelec

                                                  CANDIDATE_INDEX]])

                                                  i += 1

                                                  selfrankings_changed[voter_index] = ranking

                                                  78

                                                  APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                  Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                  for voter_index in selfvotes[candidate]

                                                  if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                  ]

                                                  for _candidate in selfleading_candidates

                                                  if _candidate = candidate

                                                  ranking = [None]selfelecN_CANDIDATES

                                                  ranking[0] = (_candidate selfelecvoters[voter_index][

                                                  _candidate])

                                                  buried = _candidate

                                                  break

                                                  i = 1

                                                  for candidate_tuple in selfelecsorted_voters[voter_index]

                                                  if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                  continue

                                                  else

                                                  ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                  selfelecvoters[voter_index][candidate_tuple[selfelec

                                                  CANDIDATE_INDEX]])

                                                  i += 1

                                                  selfrankings_changed[voter_index] = ranking

                                                  79

                                                  APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                  Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                  for index in range(selfelecN_CANDIDATES)

                                                  selfcandidates[index] = 0

                                                  for voter_index voter in enumerate(selfelecsorted_voters)

                                                  score = 0

                                                  if voter_index in selfrankings_changed

                                                  for candidate in selfrankings_changed[voter_index]

                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                  score += 1

                                                  else

                                                  for candidate in voter

                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                  score += 1

                                                  APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                  Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                  for voter_index voter in enumerate(selfelecsorted_voters)

                                                  if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                  elecCANDIDATE_INDEX]]

                                                  selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                  sorted_voters[voter_index])

                                                  for candidate_index candidate in enumerate(reversed(voter))

                                                  if candidate_index == 0

                                                  selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                  voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                  else

                                                  selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                  voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                  80

                                                  APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                  Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                  for index in range(selfelecN_CANDIDATES)

                                                  selfcandidates[index] = 0

                                                  for voter_index voter in enumerate(selfelecsorted_voters)

                                                  if voter_index in selfrankings_changed

                                                  for candidate in selfrankings_changed[voter_index]

                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                  selfelecCANDIDATE_RANK]

                                                  else

                                                  for candidate in voter

                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                  selfelecCANDIDATE_RANK]

                                                  APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                  Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                  for index in range(selfelecN_CANDIDATES)

                                                  selfcandidates[index] = 0

                                                  for voter in selfelecsorted_voters

                                                  votes = selfelecN_VACANCIES

                                                  for candidate in reversed(voter)

                                                  if votes == 0

                                                  break

                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                  votes -= 1

                                                  • Folha de aprovaccedilatildeo
                                                  • Agradecimentos
                                                  • Epiacutegrafe
                                                  • Resumo
                                                  • Abstract
                                                  • Lista de ilustraccedilotildees
                                                  • Lista de Coacutedigos
                                                  • Lista de tabelas
                                                  • Lista de abreviaturas e siglas
                                                  • Sumaacuterio
                                                  • INTRODUCcedilAtildeO
                                                    • MOTIVACcedilAtildeO E OBJETIVO
                                                    • MEacuteTODO
                                                    • ESTRUTURA
                                                      • SISTEMAS ELEITORAIS
                                                        • FISRT PAST THE POST
                                                          • Exemplo
                                                          • Vantagens e Desvantagens do FPTP
                                                          • Voto Uacutetil no FPTP
                                                            • TWO-ROUND SYSTEM
                                                              • Exemplo
                                                              • Vantagens e Desvantagens do TRS
                                                              • Voto Uacutetil no TRS
                                                                • INSTANT-RUNOFF VOTING
                                                                  • Exemplo
                                                                  • Vantagens e Desvantagens do IRV
                                                                  • Voto Uacutetil no IRV
                                                                    • APPROVAL VOTING SYSTEM
                                                                      • Exemplo
                                                                      • Vantagens e Desvantagens do AVS
                                                                      • Voto Uacutetil no AVS
                                                                        • THE BORDA COUNT
                                                                          • Exemplo
                                                                          • Vantagens e Desvantagens do BC
                                                                          • Voto Uacutetil no BC
                                                                            • SCORE VOTING SYSTEM
                                                                              • Exemplo
                                                                              • Vantagens e Desvantagens do SVS
                                                                              • Voto Uacutetil no SVS
                                                                                • BLOC VOTE
                                                                                  • Exemplo
                                                                                  • Voto Uacutetil no BV
                                                                                      • O SIMULADOR
                                                                                      • CENAacuteRIOS PERTINENTES
                                                                                        • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                        • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                        • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                        • CENAacuteRIO 4 COALIZOtildeES
                                                                                        • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                        • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                          • COMO FUNCIONA O SIMULADOR
                                                                                            • CLASSE Elections
                                                                                            • CLASSE FirstPastThePost
                                                                                            • CLASSE TwoRoundSystem
                                                                                            • CLASSE InstantRunoffVoting
                                                                                            • CLASSE ApprovalVoting
                                                                                            • CLASSE BordaCount
                                                                                            • CLASSE ScoreVoting
                                                                                            • CLASSE BlocVote
                                                                                            • TECNOLOGIAS UTILIZADAS
                                                                                              • CONCLUSAtildeO
                                                                                              • Referecircncias
                                                                                              • Meacutetodo create_voters
                                                                                              • Meacutetodo create_candidates
                                                                                              • Meacutetodo calculate_means
                                                                                              • Meacutetodo get_mean
                                                                                              • Meacutetodo calculate_mean
                                                                                              • Meacutetodo set_leading_candidates
                                                                                              • Meacutetodo irv_set_leading_candidates
                                                                                              • Meacutetodo sort_ranks
                                                                                              • Meacutetodo fptp_count_tactical_votes
                                                                                              • Meacutetodo fptp_count_minority_votes
                                                                                              • Meacutetodo trs_second_round
                                                                                              • Meacutetodo trs_account_for_coalitions
                                                                                              • Meacutetodo irv_count_votes
                                                                                              • Meacutetodo avs_count_votes
                                                                                              • Meacutetodo avs_count_votes_with_tactical
                                                                                              • Meacutetodo irv_apply_tactical_votes
                                                                                              • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                              • Meacutetodo bc_sum_candidates_scores
                                                                                              • Meacutetodo svs_apply_tactical_votes
                                                                                              • Meacutetodo svs_sum_candidates_scores
                                                                                              • Meacutetodo bv_count_votes

                                                    26

                                                    (cminus 1)times c2

                                                    times e

                                                    A contagem final dos pontos eacute apresentada na tabela 7 abaixo

                                                    Tabela 7 ndash Resultado BCCandidatos Total de pontos

                                                    A 146B 181C 126D 147

                                                    O candidato eleito eacute o B com 181 pontos ou aproximadamente 60 da pontuaccedilatildeomaacutexima

                                                    252 Vantagens e Desvantagens do BC

                                                    Em comparaccedilatildeo com os meacutetodos abordados anteriormente que apenas consideramas primeiras opccedilotildees de cada eleitor este meacutetodo regularmente escolhe candidatos comaceitaccedilatildeo mais ampla ao inveacutes de uma preferecircncia direta dos eleitores (Electoral ReformSociety 2017b)

                                                    Ele tambeacutem encoraja uma abordagem estrateacutegica por parte dos partidos onde seriade seu interesse nomear mais de um candidato para concorrer pois quanto mais candi-datos estatildeo no paacutereo maior eacute a pontuaccedilatildeo dos primeiros colocados Logo a nomeaccedilatildeo decandidatos menos populares pode beneficiar os principais candidatos de um partido

                                                    253 Voto Uacutetil no BC

                                                    Existem duas estrateacutegias aplicaacuteveis a esse sistema A primeira denominada compromi-sing de maneira similar a outros meacutetodos de votaccedilatildeo se resume em ranquear em primeirolugar um dos candidatos que estejam liderando as eleiccedilotildees mesmo que este natildeo seja suapreferecircncia real A segunda estrateacutegia burying eacute o oposto esta se baseia em ranquearem uacuteltimo lugar um dos candidatos liacutederes mesmo que este natildeo seja o seu candidato demaior desgosto Ambas estrateacutegias podem ser aplicadas ao mesmo tempo por um eleitor

                                                    26 SCORE VOTING SYSTEM

                                                    Score Voting ou Range Voting como tambeacutem eacute conhecido eacute mais um meacutetodo quetenta trazer maior liberdade de expressatildeo aos eleitores Assim como o Borda Counteste sistema funciona baseado na pontuaccedilatildeo dos candidatos no entanto ao inveacutes dessapontuaccedilatildeo ser relativa agrave posiccedilatildeo do candidato no ranking de cada eleitor este por sua veztem completa liberdade de atribuir qualquer quantidade de pontos aos candidatos dentro

                                                    27

                                                    de determinada escala Um eleitor pode dar o mesmo nuacutemero de pontos para diferentescandidatos e apoacutes o somatoacuterio de todas as pontuaccedilotildees o candidato com a pontuaccedilatildeo maisalta eacute eleito Incorporado ao escopo poliacutetico o SVS eacute utilizado no Partido Pirata Alematildeobem como em diversas organizaccedilotildees tais como o Fedora Project e Mozilla e tambeacutem emvariados esportes oliacutempicos e reality shows como o American Idol aponta Hamlin (2015)

                                                    261 Exemplo

                                                    Neste exemplo temos apresentados na tabela 8 abaixo 4 perfis distintos de eleitorese suas respectivas atribuiccedilotildees de pontos aos 4 candidatos Cada eleitor pode atribuirqualquer pontuaccedilatildeo a um candidato dentro da escala de -10 a 10 O resultado da eleiccedilatildeoapoacutes a soma de todos os pontos por candidato se encontra na tabela 9 onde o candidatoA eacute eleito com um total de 605 pontos

                                                    Tabela 8 ndash Exemplo SVS

                                                    Perfil A B C D Ndeg de eleitores1 10 -1 5 2 362 6 9 -3 4 253 2 0 8 4 224 3 3 3 10 17

                                                    Tabela 9 ndash Resultado SVSCandidatos Total de pontos

                                                    A 605B 240C 332D 430

                                                    262 Vantagens e Desvantagens do SVS

                                                    A grande vantagem do SVS eacute como ele proporciona aos eleitores expressar de maneiramuito proacutexima potencialmente exata suas impressotildees poliacuteticas de cada candidato Eleeacute ainda mais expressivo que o AVS Dessa maneira o spoiler effect tambeacutem se torna nuloao passo que toda intenccedilatildeo de voto eacute precisamente representada neste sistema

                                                    Assim como outros meacutetodos eleitorais este sofre igualmente dos males produzidos pelovoto taacutetico Sua principal desvantagem eacute discutida na seccedilatildeo abaixo

                                                    263 Voto Uacutetil no SVS

                                                    Da mesma maneira que no Approval Voting atraveacutes do bullet voting o SVS tambeacutempode ser convertido em uma eleiccedilatildeo sob o meacutetodo FPTP em um cenaacuterio com um grande

                                                    28

                                                    volume de eleitores maliciosos O voto uacutetil sob este sistema se manifesta pontuando-seapenas um candidato com uma nota positiva e todos os outros com as notas mais baixasda escala Se todos os eleitores se aproveitarem dessa abordagem natildeo existiraacute distinccedilatildeoefetiva entre uma eleiccedilatildeo sob SVS e FPTP Essencialmente cada eleitor estaacute votando emapenas um candidato Essa eacute a principal desvantagem do SVS e ela consegue eliminarsua principal vantagem dar ao eleitor um poder maior de expressatildeo

                                                    27 BLOC VOTE

                                                    O Bloc Vote eacute um meacutetodo utilizado para a eleiccedilatildeo de candidatos a cargos no governocom mais de uma vacacircncia Pode ser considerado um meio-termo entre o FPTP e oAVS pois os eleitores podem votar em mais de um candidato poreacutem satildeo limitados pelonuacutemero de vagas Em uma eleiccedilatildeo com duas vagas por exemplo cada eleitor selecionaraacutedois candidatos ou menos Sensatamente o candidato mais votado eacute eleito Ele possuialgumas utilizaccedilotildees em eleiccedilotildees locais em algumas partes da Inglaterra (Electoral ReformSociety 2017a)

                                                    271 Exemplo

                                                    Neste exemplo dois candidatos seratildeo eleitos logo cada eleitor votaraacute em no maacuteximodois candidatos A distribuiccedilatildeo de votos pode ser conferida na tabela 10 e o resultado dacontagem de votos na tabela 11 abaixo Os candidatos eleitos satildeo o C totalizando 78do maacuteximo de votos possiacuteveis para um candidato e o A com 43

                                                    Tabela 10 ndash Exemplo BV

                                                    Aprovaccedilotildees Ndeg de eleitoresAC 20AB 16BC 19BD 6CA 7CD 15DC 17

                                                    Tabela 11 ndash Resultado BVCandidatos Total de votos

                                                    A 43B 41C 78D 38

                                                    29

                                                    272 Voto Uacutetil no BV

                                                    Neste sistema eacute possiacutevel que um eleitor evite votar em sua primeira opccedilatildeo quandoeste natildeo tem chances de vitoacuteria e se fazendo isto ele diminuiraacute as chances de algum outrocandidato de seu desgosto ganhar Poreacutem o sistema previne um outro tipo de voto uacutetilEm eleiccedilotildees com mais de uma vaga onde os eleitores soacute podem votar em um candidatose um eleitor sabe que sua primeira opccedilatildeo tambeacutem eacute a primeira opccedilatildeo da maior parteda populaccedilatildeo e portanto muito provavelmente seraacute um dos candidatos eleitos eacute possiacutevelque ele arrisque votar em uma segunda opccedilatildeo sua na esperanccedila de a longo prazo elegersuas duas principais opccedilotildees de voto Com os eleitores podendo votar no nuacutemero exato devagas disponiacuteveis esse tipo de pensamento taacutetico perde o sentido

                                                    30

                                                    3 O SIMULADOR

                                                    Para este trabalho foi implementado um simulador eleitoral na forma de uma aplicaccedilatildeoweb para que a interaccedilatildeo do usuaacuterio fosse facilitada Veremos a seguir como se daacute suautilizaccedilatildeo de forma geral

                                                    Figura 2 ndash Captura de tela 1

                                                    Figura 3 ndash Captura de tela 2

                                                    A primeira opccedilatildeo encontrada pelo usuaacuterio eacute a escolha de quais sistemas de votaccedilatildeo se-ratildeo simulados (Figura 2) Todos eles podem ser selecionados para rodar simultaneamentePoreacutem natildeo eacute permitido rodar uma simulaccedilatildeo do Bloc Vote para uma eleiccedilatildeo onde apenasum candidato eacute eleito aleacutem disso natildeo existe implementaccedilatildeo dos meacutetodos TRS e IRV para

                                                    31

                                                    eleiccedilotildees com mais de um candidato eleito jaacute que eles se comportariam exatamente comono FPTP

                                                    A maioria das linguagens de programaccedilatildeo senatildeo todas possuem um gerador de nuacuteme-ros pseudoaleatoacuterios que fornece a possibilidade de definir uma seed para o gerador Estaseed funciona como um ponto de partida para a geraccedilatildeo dos nuacutemero e portanto todasimulaccedilatildeo que rodar com a mesma seed sempre teraacute os mesmos resultados Se nenhumvalor for fornecido pelo usuaacuterio o tempo atual do sistema eacute utilizado As opccedilotildees subse-quentes satildeo a escolha do nuacutemero de eleitores gerados e o nuacutemero de vagas (Figura 3) Senenhum valor for fornecido o nuacutemero de eleitores padratildeo utilizado eacute 1000 e o nuacutemero devagas igual a 1

                                                    Figura 4 ndash Captura de tela 3

                                                    Este simulador possui dois modos para a criaccedilatildeo dos rankings dos eleitores No modoManipulate (Figura 4) primeiramente se define o nuacutemero de candidatos atraveacutes do campode entrada ao lado do tiacutetulo Candidates ou alternativamente pode-se adicionar candida-tos um a um atraveacutes do sinal de mais na parte inferior da paacutegina Para cada candidatoeacute possiacutevel definir a porcentagem de seus eleitores que optaraacute pelo voto taacutetico e pelovoto de minoria Tambeacutem eacute possiacutevel alterar o nome dos candidatos se for do interessedo usuaacuterio

                                                    32

                                                    Figura 5 ndash Captura de tela 4

                                                    Figura 6 ndash Captura de tela 5

                                                    33

                                                    Figura 7 ndash Captura de tela 6

                                                    Apoacutes a criaccedilatildeo dos candidatos o usuaacuterio pode criar perfis de eleitores que definiratildeo demaneira exata como partes da populaccedilatildeo iraacute votar (Figura 5) Em cada perfil se defineo valor em porcentos da populaccedilatildeo votante que o adotaraacute e a nota de cada candidatoTambeacutem eacute possiacutevel nomear cada perfil livremente

                                                    No modo Generate (Figura 6) eacute onde o gerador de nuacutemeros pseudoaleatoacuterios eacute usadoNesse modo ao inveacutes do usuaacuterio criar perfis de eleitores ele define qual seraacute a distribuiccedilatildeoadotada para a geraccedilatildeo de notas de cada candidato Essas distribuiccedilotildees seratildeo mais bemdetalhadas no Capiacutetulo 5 Da mesma maneira que no modo Manipulate nesse modotambeacutem eacute possiacutevel definir os valores para os dois tipos de voto uacutetil os votos taacuteticos eos votos de minoria No primeiro estatildeo incluiacutedas as estrateacutegias de mudanccedila de votoespeciacuteficas de cada sistema como o bullet voting no AVS e SVS ou quando a preferecircnciade um eleitor claramente natildeo possui chances de vitoacuteria e ele muda seu voto para um doscandidatos que esteja na lideranccedila o que ocorre no FPTP e TRS O voto de minoriase apresenta apenas no FPTP em eleiccedilotildees onde mais de um candidato eacute eleito Se apreferecircncia de um eleitor claramente lidera a eleiccedilatildeo por ser tambeacutem a preferecircncia damaior parte da populaccedilatildeo esse eleitor pode mudar o seu voto para uma segunda opccedilatildeona esperanccedila de eleger dois de seus candidatos favoritos

                                                    Por fim em ambos os modos o usuaacuterio tem a opccedilatildeo de definir coalizotildees entre oscandidatos se o sistema TRS estiver habilitado pois as coalizotildees apenas se manifestamnesse sistema Essas coalizotildees alteraratildeo as notas dos candidatos dependendo dos outroscandidatos pertencentes a elas (Figura 7)

                                                    A aplicaccedilatildeo pode ser encontrada na paacutegina httpelectionsimpythonanywherecom

                                                    34

                                                    4 CENAacuteRIOS PERTINENTES

                                                    Para todos os cenaacuterios deste capiacutetulo seraacute usada a seed do simulador igual a 100 e apopulaccedilatildeo de eleitores igual a 1000 para que exista consistecircncia na anaacutelise e tambeacutem paraque possa haver replicaccedilatildeo dos resultados se necessaacuterio

                                                    41 CENAacuteRIO 1 VOTO TAacuteTICO

                                                    Neste exemplo teremos quatro candidatos Ana Beto Carla e Diego Ana e Betoseratildeo gerados a partir da distribuiccedilatildeo Neutral (Figura 47) Carla da distribuiccedilatildeo Disliked(Figura 51) e Diego da Hated (Figura 55) Para a simulaccedilatildeo com a seed 100 o melhorcandidato a ser eleito ou seja aquele que maximiza a meacutedia das notas dos eleitores eacute oBeto com uma meacutedia de 0073 Para cada sistema seratildeo comparados os resultados semvoto taacutetico aos com 20 de voto taacutetico a favor da Ana Abaixo se encontram osresultados para o sistema FPTP

                                                    Figura 8 ndash FPTP - Cenaacuterio 1 sem voto taacutetico

                                                    Figura 9 ndash TRS segundo turno - Cenaacuterio 1 sem voto taacutetico

                                                    35

                                                    Figura 10 ndash IRV primeiro turno - Cenaacuterio 1

                                                    Figura 11 ndash IRV segundo turno - Cenaacuterio 1

                                                    Figura 12 ndash IRV terceiro turno - Cenaacuterio 1

                                                    36

                                                    Figura 13 ndash AVS - Cenaacuterio 1 sem voto taacutetico

                                                    Figura 14 ndash BC - Cenaacuterio 1 sem voto taacutetico

                                                    Figura 15 ndash SVS - Cenaacuterio 1 sem voto taacutetico

                                                    37

                                                    Nesse cenaacuterio sem voto taacutetico o uacutenico sistema que natildeo elege o Beto eacute o AVS Todosos outros elegem o melhor candidato Ou seja apesar de Beto ter uma melhor meacutediadas notas dos eleitores existem mais eleitores que ranqueiam Ana com uma nota acimade 0 No entanto apenas 20 dos eleitores de Diego e Carla que preferem a Ana aoinveacutes do Beto satildeo o suficiente para fazer Beto natildeo ser eleito se eles decidirem abandonarsua primeira opccedilatildeo e votar na Ana Considerando a vantagem que os votos taacuteticosproporcionam agrave Ana esta eacute eleita em todos os sistemas menos o TRS e o IRV

                                                    Figura 16 ndash FPTP - Cenaacuterio 1 - 20 de voto taacutetico na Ana

                                                    Figura 17 ndash TRS segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                    38

                                                    Figura 18 ndash IRV primeiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                    Figura 19 ndash IRV segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                    Figura 20 ndash IRV terceiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                    39

                                                    Figura 21 ndash AVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                    Figura 22 ndash BC - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                    Figura 23 ndash SVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                    40

                                                    Eacute claro que se os eleitores que preferem o Beto tambeacutem votassem de maneira estra-teacutegica a situaccedilatildeo se equilibraria e haveria o mesmo niacutevel de concorrecircncia entre os doiscandidatos que ocorre quando natildeo haacute voto taacutetico Poreacutem no Borda Count esse equiliacute-brio pode natildeo acontecer e as estrateacutegias de compromising e burying podem acabar saindopela culatra se uma porcentagem elevada dos eleitores as adotarem Abaixo encontram-seos resultados para esse sistema quando 100 dos eleitores de Carla e Diego se comportammaliciosamente

                                                    Figura 24 ndash BC - Cenaacuterio 1 100 de voto taacutetico na Ana e Beto

                                                    Por causa do uso demasiado da estrateacutegia burying Ana e Beto perdem muitos pontose isso abre espaccedilo para uma vitoacuteria da Carla No entanto para porcentagens menores que100 o Beto ainda eacute o vencedor

                                                    Essas duas estrateacutegias tambeacutem foram implementadas nesse simulador para o sistemaIRV e eacute possiacutevel ver como ele eacute resistente a elas Para que seja possiacutevel mudar os resultadosde uma eleiccedilatildeo sob o IRV eacute necessaacuterio mudar a ordem de eliminaccedilatildeo dos candidatos paraque o seu candidato preferido acabe enfrentando um candidato mais fraco nas rodadasfinais Isso natildeo ocorre com compromising e burying No proacuteximo cenaacuterio seraacute analisadacomo eacute possiacutevel modificar os resultados de uma eleiccedilatildeo sob o IRV

                                                    Esses resultados podem ser replicados acessando os linksSem votos taacuteticos lthttpelectionsimpythonanywherecomdirect_res1111110

                                                    --[0021][22Ana2222Beto222022Carla2222Diego22]------100gt

                                                    Com 20 de voto taacutetico lthttpelectionsimpythonanywherecomdirect_res1111110--[0021][22Ana222022Beto2222Carla2222Diego22]1-[02000]---100gt

                                                    Com 100 de voto taacuteticona Ana e Beto lthttpelectionsimpythonanywherecomdirect_res0000100--[0021][22Ana222022Beto222022Carla2222Diego22]1-[101000]---100gt

                                                    41

                                                    42 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV

                                                    Neste cenaacuterio teremos Ana Carla e Beto concorrendo e trecircs perfis distintos que apoiamcada candidato As distribuiccedilotildees de notas dos perfis se encontram na tabela abaixo

                                                    Tabela 12 ndash Distribuiccedilatildeo de notas - Cenaacuterio 2

                                                    Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                    deeleitores

                                                    1 10 5 0 422 0 10 5 303 5 0 10 28

                                                    Com essas distribuiccedilotildees Carla eacute eliminada na primeira rodada e seus 28 de votossatildeo transferidos para a segunda opccedilatildeo de seus eleitores Ana que eacute eleita com 70 dosvotos e uma meacutedia de 56

                                                    Figura 25 ndash IRV primeiro turno - Cenaacuterio 2

                                                    Figura 26 ndash IRV segundo turno - Cenaacuterio 2

                                                    42

                                                    Cientes desse provaacutevel futuro cenaacuterio onde Ana eacute eleita uma pequena parte dos elei-tores de Beto estrategicamente o abandona e decide apoiar Carla na esperanccedila de leva-laao segundo turno contra Ana As novas distribuiccedilotildees de notas se encontram na tabelaabaixo com essa porccedilatildeo de eleitores representada pelo perfil 4

                                                    Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2

                                                    Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                    deeleitores

                                                    1 10 5 0 422 0 10 5 283 5 0 10 284 0 8 10 2

                                                    Essa mudanccedila estrateacutegica de voto altera a ordem de eliminaccedilotildees do sistema com Betosendo o primeiro a ser eliminado Com isso seus votos satildeo naturalmente transferidos paraCarla que derrota Ana no segundo turno com 58 dos votos

                                                    Figura 27 ndash IRV primeiro turno com voto taacutetico - Cenaacuterio 2

                                                    Figura 28 ndash IRV segundo turno com voto taacutetico - Cenaacuterio 2

                                                    43

                                                    Percebendo que a eleiccedilatildeo de Beto natildeo era provaacutevel seus eleitores conseguiram aomenos impedir a eleiccedilatildeo do pior candidato para eles Mas para isso foi necessaacuterio queeles tivessem a informaccedilatildeo de como os outros eleitores votariam Uma aproximaccedilatildeo dessasinformaccedilotildees poderia ser obtida em um cenaacuterio real com poucos candidatos atraveacutes depesquisas eleitorais poreacutem se o nuacutemero de candidatos eacute significativo uma noccedilatildeo completadas distribuiccedilotildees dos rankings dos eleitores se torna muito menos viaacutevel e dificulta aformulaccedilatildeo de estrateacutegias para alterar a ordem em que os candidatos satildeo eliminados

                                                    Esses resultados podem ser replicados acessando os linksSem voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana22

                                                    22Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                    Com voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana

                                                    2222Beto2222Carla22]-----42Voter20Profile2001020520028Voter20Profile2010201020528Voter20Profile202520020102Voter20Profile20302082010100gt

                                                    43 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE

                                                    O interessante dos sistemas IRV e TRS eacute que os resultados do cenaacuterio anterior po-deriam ter sido obtidos ao inveacutes do voto taacutetico pela sua natildeo-monotonicidade Seriapossiacutevel que a Carla derrotasse a Ana no segundo turno atraveacutes do proacuteprio aumento depopularidade da Ana Assumindo que essa popularizaccedilatildeo ocorresse entre os candidatosdo perfil 2 onde 3 passasse a apoiar a Ana ao inveacutes do Beto as novas distribuiccedilotildeesseguiriam a tabela abaixo

                                                    Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                    Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                    deeleitores

                                                    1 10 5 0 452 0 10 5 273 5 0 10 28

                                                    Dessa maneira Beto agora com uma porcentagem dos eleitores menor do que a deCarla seraacute eliminado na primeira rodada e como seus eleitores tecircm a Carla como segundaopccedilatildeo ela receberaacute todos os seus votos e seraacute eleita na segunda rodada As rodadas doIRV podem ser vistas nas figuras 29 e 30

                                                    44

                                                    Figura 29 ndash IRV primeiro turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                    Figura 30 ndash IRV segundo turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                    Tabela 15 ndash Resultados do Cenaacuterio 3Candidato

                                                    eleitoMeacutedia das

                                                    notasAntes da

                                                    popularizaccedilatildeode Ana

                                                    Ana 56

                                                    Apoacutespopularizaccedilatildeo

                                                    de AnaCarla 415

                                                    Os efeitos dessa caracteriacutestica se refletem na satisfaccedilatildeo meacutedia da populaccedilatildeo A Ana eacuteclaramente a melhor candidata e mesmo com o seu ganho de popularidade (ou devido aele) a Carla eacute eleita

                                                    Esses resultados podem ser replicados acessando os linksAntes da popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecom

                                                    direct_res0010000---[22Ana2222Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                    45

                                                    Apoacutes popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana2222Beto2222Carla22]-----45Voter20Profile2001020520027Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                    44 CENAacuteRIO 4 COALIZOtildeES

                                                    O TRS por ser organizado em dois turnos separados normalmente a semanas dedistacircncia um do outro acaba abrindo brecha agrave mudanccedila de opiniatildeo por parte dos eleitorese o desenvolvimento de novas estrateacutegias por parte dos candidatos tais como a coalizatildeocom candidatos jaacute eliminados Com isso em mente nesse cenaacuterio teremos novamenteos quatro candidatos Ana Beto Carla e Diego Os trecircs primeiros seratildeo gerados dadistribuiccedilatildeo Neutral e Diego da distribuiccedilatildeo Disliked

                                                    Figura 31 ndash TRS turno 1 - Cenaacuterio 4

                                                    No TRS normal Ana Beto e Carla possuem com essas distribuiccedilotildees quantidades devotos muito proacuteximas com Beto e Carla indo para o segundo turno Carla estaacute 10 votosatraacutes de Beto e decide aproveitar o espaccedilo de tempo entre os dois turnos para tentaragregar mais votos Com isso Carla se aproxima de Diego e juntos formam uma coalizatildeoNo entanto com sua baixa popularidade Diego acaba ferindo a reputaccedilatildeo de Carla etorna o segundo turno muito mais faacutecil para Beto (Figura 33) Se Carla tivesse buscado osuporte de Ana por outro lado ela se veria vitoriosa no segundo turno e com uma amplavantagem sobre o Beto (Figura 34) Ou ateacute mesmo sem buscar uma coalizatildeo mesmosendo uma corrida apertada Carla teria naturalmente sido eleita (Figura 32)

                                                    Esses resultados podem ser replicados acessando os linksSem coalizotildees lthttpelectionsimpythonanywherecomdirect_res0100000

                                                    --[0002][22Ana222022Beto2222Carla2222Diego22]------100gt

                                                    46

                                                    Figura 32 ndash TRS turno 2 - Cenaacuterio 4

                                                    Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4

                                                    Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4

                                                    47

                                                    Coalizatildeo Carla e Diego lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2203Carla20Diego-100gt

                                                    Coalizatildeo Carla e Ana lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2200Carla20Ana-100gt

                                                    45 CENAacuteRIO 5 DILEMA DO PRISIONEIRO

                                                    Neste cenaacuterio temos uma eleiccedilatildeo de uma vaga com trecircs candidatos concorrentes e trecircsperfis distintos de eleitores que seguiratildeo as seguintes distribuiccedilotildees

                                                    Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5

                                                    Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                    deeleitores

                                                    1 10 -10 5 362 -10 10 5 343 -10 -10 5 30

                                                    Esse contexto nos remete ao notaacutevel dilema do prisioneiro Nele dois prisioneiroscuacutemplices satildeo interrogados individualmente sem poder se comunicar um com o outro ecada um enfrenta o dilema de delatar ou natildeo o seu parceiro Se os dois prisioneirosdecidem se manter calados sobre o crime ambos satildeo sentenciados a um ano de prisatildeo Seapenas um deles dedurar o outro o traidor sai livre enquanto seu parceiro eacute condenadoa trecircs anos Se ambos dedurarem um ao outro eles satildeo condenados juntos a dois anosde prisatildeo Esse dilema eacute uma ideia claacutessica presente no estudo da teoria dos jogos sendooriginalmente elaborada por Merrill Flood e Melvin Dresher em 1950 e mais tarde sendonomeada de dilema dos prisioneiros por Albert W Tucker (POUNDSTONE 1992)

                                                    O que esse dilema nos mostra eacute a tentaccedilatildeo que o indiviacuteduo deteacutem se sua racionalizaccedilatildeoestiver voltada para seus proacuteprios interesses e somente eles em oposiccedilatildeo a pensar no bemdo grupo como um todo Neste cenaacuterio encontramos dois grupos de eleitores expressiva-mente opostos os perfis 1 e 2 Se qualquer uma das preferecircncias desses perfis fosse eleitaisso significaria uma alta rejeiccedilatildeo de maior parte da populaccedilatildeo No entanto eles possuema segunda opccedilatildeo em comum a Carla que por sua vez eacute a preferecircncia do terceiro perfilPortanto a eleiccedilatildeo da Carla seria logicamente o resultado oacutetimo

                                                    Mesmo assim a Ana eacute eleita nos dois sistemas acima o que natildeo parece justo poispela tabela 16 eacute evidente que apenas 36 da populaccedilatildeo a aprova enquanto que os outros64 a reprovam ao maacuteximo O sistema IRV se comporta de maneira idecircntica ao TRS

                                                    48

                                                    Figura 35 ndash FPTP - Cenaacuterio 5

                                                    Figura 36 ndash TRS segundo turno - Cenaacuterio 5

                                                    nesta situaccedilatildeo Com esse resultado a meacutedia das notas eacute -28 No entanto os trecircs sistemasseguintes nos apresentam resultados diferentes

                                                    Tabela 17 ndash Resultados do Cenaacuterio 5

                                                    Sistema Candidatoeleito

                                                    Meacutedia dasnotas

                                                    FPTP Ana -28TRS Ana -28IRV Ana -28AVS Carla 50BC Carla 50SVS Carla 50

                                                    49

                                                    Figura 37 ndash AVS - Cenaacuterio 5

                                                    Figura 38 ndash BC - Cenaacuterio 5

                                                    Tanto o AVS quanto o Borda Count e o SVS satildeo sistemas que consideram todasas opiniotildees de cada eleitor ao mesmo tempo e por isso satildeo capazes de eleger o melhorcandidato nesta situaccedilatildeo diferentemente do TRS que natildeo absorve completamente todosentimento do eleitor por todos os candidatos e o IRV que apesar de ser bem expressivoquebra esse processo em inuacutemeras rodadas o que permite a perda de informaccedilatildeo ao longodelas

                                                    Esses resultados podem ser replicados acessando o linklthttpelectionsimpythonanywherecomdirect_res1111110---[22Ana

                                                    222022Beto222022Carla22]-----36Voter20Profile2001020-1020534Voter20Profile201-10201020530Voter20Profile202-1020-10205100gt

                                                    50

                                                    Figura 39 ndash SVS - Cenaacuterio 5

                                                    46 CENAacuteRIO 6 VOTO DE MINORIA

                                                    Neste cenaacuterio temos uma eleiccedilatildeo com quatro candidatos e duas vagas A Ana seraacutea preferecircncia de uma extensa parte da populaccedilatildeo (distribuiccedilatildeo Loved Figura 53) Betoe Carla seratildeo candidatos razoavelmente populares (distribuiccedilatildeo Neutral Figura 47) eDiego seraacute a preferecircncia de apenas um pequeno grupo especiacutefico e rejeitado pela maioria(distribuiccedilatildeo Disliked Figura 51) Eacute intuitivo esperar que os dois candidatos eleitos seratildeoa Ana e ou o Beto ou a Carla e isso eacute exatamente o que ocorre na figura 40 no sistemaFPTP sem voto de minoria

                                                    Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria

                                                    Eacute evidente a discrepacircncia da quantidade de votos da Ana para os outros candidatose apesar de Beto e Carla serem mais populares que Diego os trecircs natildeo se encontrammuito afastados Poreacutem se a pequena fraccedilatildeo de candidatos que possuem a Ana como

                                                    51

                                                    Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego

                                                    preferecircncia e Diego como segunda opccedilatildeo optarem pelo voto de minoria a situaccedilatildeo mudacompletamente (Figura 41) Assim apesar de extensamente rejeitado Diego conquistaa segunda vaga e a meacutedia das notas despenca de 2929 para 0505 No entanto aindaexiste um cenaacuterio pior Se os outros grupos de eleitores pensarem da mesma forma eevitarem votar na Ana achando que sua eleiccedilatildeo jaacute estaacute assegurada apenas 80 de votode minoria para esses grupos jaacute eacute o suficiente para eliminaacute-la das eleiccedilotildees (Figura 42)Com a Ana eliminada a meacutedia das notas cai ainda mais para 0058

                                                    Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego

                                                    O sistema Bloc Vote eacute uma das soluccedilotildees para o voto de minoria Permitindo queos eleitores votem no mesmo nuacutemero de candidatos que de vagas a serem preenchidasnatildeo existe o iacutempeto a esse tipo de voto estrateacutegico O resultado desse sistema portantoretorna a meacutedia das notas a casa dos 29 (Figura 43) Os sistemas AVS Borda Count eSVS tambeacutem impedem a presenccedila do voto de minoria e atingem resultados semelhantes

                                                    52

                                                    Figura 43 ndash BV - Cenaacuterio 6

                                                    Tabela 18 ndash Resultados do Cenaacuterio 6

                                                    Sistema Candidatoseleitos

                                                    Meacutedia dasnotas

                                                    FPTP sem voto de minoriaAna eBeto 2929

                                                    FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

                                                    FPTP com 80 de voto de minoriaBeto eCarla 0058

                                                    Bloc VoteAna eCarla 2913

                                                    Esses resultados podem ser replicados acessando os links

                                                    Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

                                                    100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

                                                    80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

                                                    53

                                                    5 COMO FUNCIONA O SIMULADOR

                                                    O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

                                                    51 CLASSE ELECTIONS

                                                    Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

                                                    bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

                                                    Figura 44 ndash estrutura candidates

                                                    bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

                                                    bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

                                                    Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

                                                    Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

                                                    54

                                                    Figura 45 ndash estrutura voters

                                                    Figura 46 ndash estrutura votes

                                                    daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

                                                    Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

                                                    55

                                                    Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

                                                    Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

                                                    na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

                                                    56

                                                    Figura 49 ndash PDF - Distribuiccedilatildeo Liked

                                                    Figura 50 ndash CDF - Distribuiccedilatildeo Liked

                                                    (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

                                                    Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

                                                    57

                                                    Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

                                                    Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

                                                    candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

                                                    Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

                                                    58

                                                    Figura 53 ndash PDF - Distribuiccedilatildeo Loved

                                                    Figura 54 ndash CDF - Distribuiccedilatildeo Loved

                                                    funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

                                                    59

                                                    Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                                                    Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                                                    Meacutedia das Notas sumei

                                                    sumvj nij

                                                    etimes v

                                                    Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                                                    Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                                                    60

                                                    Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                                                    Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                                                    52 CLASSE FIRSTPASTTHEPOST

                                                    Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                                                    Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                                                    61

                                                    Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                                                    Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                                                    mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                                                    62

                                                    53 CLASSE TWOROUNDSYSTEM

                                                    A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                                                    54 CLASSE INSTANTRUNOFFVOTING

                                                    A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                                                    Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                                                    63

                                                    cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                                                    55 CLASSE APPROVALVOTING

                                                    Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                                                    56 CLASSE BORDACOUNT

                                                    Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                                                    57 CLASSE SCOREVOTING

                                                    De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                                                    64

                                                    58 CLASSE BLOCVOTE

                                                    O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                                                    59 TECNOLOGIAS UTILIZADAS

                                                    A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                                                    Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                                                    O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                                                    Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                                                    65

                                                    6 CONCLUSAtildeO

                                                    Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                                                    Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                                                    Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                                                    Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                                                    Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                                                    66

                                                    REFEREcircNCIAS

                                                    AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                                                    Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                                                    Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                                                    Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                                                    HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                                                    LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                                                    ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                                                    Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                                                    POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                                                    The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                                                    67

                                                    APEcircNDICES

                                                    APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                                    Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                                    if(not len(selfvoter_profiles))

                                                    for voter in range(selfN_VOTERS)

                                                    candidates_rank = dict()

                                                    for candidate in reversed(range(selfN_CANDIDATES))

                                                    if(selfBIAS_VECTOR[candidate]==4)

                                                    candidates_rank[candidate] = self_sortear(selfloved)

                                                    elif(selfBIAS_VECTOR[candidate]==3)

                                                    candidates_rank[candidate] = self_sortear(selfliked)

                                                    elif(selfBIAS_VECTOR[candidate]==2)

                                                    candidates_rank[candidate] = self_sortear(selfdisliked)

                                                    elif(selfBIAS_VECTOR[candidate]==1)

                                                    candidates_rank[candidate] = self_sortear(selfhated)

                                                    elif(selfBIAS_VECTOR[candidate]==-1)

                                                    candidates_rank[candidate] = self_sortear(selfpolarizer

                                                    )

                                                    elif(selfBIAS_VECTOR[candidate]==-2)

                                                    candidates_rank[candidate] = self_sortear(self

                                                    more_polarizer)

                                                    else

                                                    candidates_rank[candidate] = self_sortear(selfneutral)

                                                    selfvotersappend(candidates_rank)

                                                    else

                                                    ranges = []

                                                    ranks = []

                                                    for prof in selfvoter_profiles

                                                    rangesappend(int(prof[pop_percentage]))

                                                    rank =

                                                    for index score in enumerate(prof[scores])

                                                    rank[index] = score

                                                    ranksappend(rank)

                                                    for index _range in enumerate(ranges)

                                                    for _ in range(int(selfN_VOTERS(_range100)))

                                                    selfvotersappend(ranks[index])

                                                    68

                                                    APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                                    Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                                    for i in range(selfN_CANDIDATES)

                                                    selfcandidates[i] = 0

                                                    selfvotes[i] = set()

                                                    APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                                    Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                                    for candidate in range(selfN_CANDIDATES)

                                                    rating_sum = 0

                                                    for voter in selfvoters

                                                    rating_sum += voter[candidate]

                                                    selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                                    APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                                    Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                                    if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                                    return selfcalculate_mean(winners)

                                                    else

                                                    chose_best = True if winners[0] == selfbest_candidate else

                                                    False

                                                    return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                                    69

                                                    APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                                    Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                                    rating_sum = 0

                                                    for voter in selfvoters

                                                    for candidate in winners

                                                    rating_sum += voter[candidate]

                                                    return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                                    APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                                    Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                                    for i in range(1 selfN_VACANCIES + 2)

                                                    selfleading_candidatesappend(selfsorted_candidates[-i][self

                                                    CANDIDATE_INDEX])

                                                    APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                                    Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                                    for leader in selfelecrounds[-1]

                                                    selfleading_candidatesappend(leader[0])

                                                    70

                                                    APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                                    Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                                    self_account_for_coalitions()

                                                    for voter in selfvoters

                                                    selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                                    (1)))

                                                    temp = []

                                                    for voter in selfsorted_voters

                                                    new_dict = defaultdict(list)

                                                    for k in voter

                                                    new_dict[k[1]]append(k[0])

                                                    tempappend(new_dict)

                                                    selfsorted_voters = []

                                                    for voter_index current_voter in enumerate(temp)

                                                    new_voter = []

                                                    for rating candidate_indexes in current_voteritems()

                                                    if len(current_voter[rating]) gt 1

                                                    shuffle(current_voter[rating])

                                                    for e in candidate_indexes

                                                    new_voterappend((e rating))

                                                    else

                                                    new_voterappend((candidate_indexes[0] rating))

                                                    selfsorted_votersappend(new_voter)

                                                    selfcandidates[new_voter[-1][0]] += 1

                                                    selfvotes[new_voter[-1][0]]add(voter_index)

                                                    71

                                                    APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                                    Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                                    for candidate in selfvotes_copy

                                                    if candidate not in selfelecleading_candidates

                                                    for voter_index in selfvotes_copy[candidate]

                                                    for index _candidate in enumerate(reversed(selfelec

                                                    sorted_voters[voter_index]))

                                                    if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                                    leading_candidates

                                                    if randomrandom() lt selfelec

                                                    tactical_vote_percentages[_candidate[selfelec

                                                    CANDIDATE_INDEX]]

                                                    selfrankings_changed[voter_index] = copy

                                                    deepcopy(selfelecsorted_voters[voter_index])

                                                    selfrankings_changed[voter_index][-(index + 1)]

                                                    selfrankings_changed[voter_index][-1] = self

                                                    rankings_changed[voter_index][-1] self

                                                    rankings_changed[voter_index][-(index + 1)]

                                                    selfcandidates[candidate] -= 1

                                                    selfcandidates[_candidate[selfelec

                                                    CANDIDATE_INDEX]] += 1

                                                    selfvotes[candidate]remove(voter_index)

                                                    selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                                    ]]add(voter_index)

                                                    break

                                                    break

                                                    72

                                                    APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                                    Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                                    half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                                    for candidate in selfelecleading_candidates

                                                    if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                                    continue

                                                    for voter_index in selfvotes_copy[candidate]

                                                    if voter_index in selfrankings_changed

                                                    ranking = selfrankings_changed[voter_index]

                                                    else

                                                    ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                                    ])

                                                    for index _candidate in enumerate(reversed(ranking))

                                                    if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                    leading_candidates or (_candidate[selfelec

                                                    CANDIDATE_INDEX] in selfelecleading_candidates and

                                                    selfelecleading_candidatesindex(_candidate[selfelec

                                                    CANDIDATE_INDEX]) gt= half_vacancies)

                                                    if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                                    if randomrandom() lt selfelec

                                                    minority_vote_percentages[_candidate[selfelec

                                                    CANDIDATE_INDEX]]

                                                    selfcandidates[candidate] -= 1

                                                    selfcandidates[_candidate[selfelec

                                                    CANDIDATE_INDEX]] += 1

                                                    break

                                                    break

                                                    break

                                                    73

                                                    APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                                    Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                                    self_account_for_coalitions()

                                                    for candidate in selfvotes

                                                    if candidate = selfwinner and candidate = selfsecond_place

                                                    for voter_index in selfvotes[candidate]

                                                    if voter_index in selfrankings_changed

                                                    ranking = selfrankings_changed[voter_index]

                                                    else

                                                    ranking = copydeepcopy(selfelecsorted_voters[

                                                    voter_index])

                                                    for index2 candidate in enumerate(reversed(ranking))

                                                    if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                                    selfcandidates[selfwinner] += 1

                                                    selfvotes[selfwinner]add(voter_index)

                                                    break

                                                    elif candidate[selfelecCANDIDATE_INDEX] == self

                                                    second_place

                                                    selfcandidates[selfsecond_place] += 1

                                                    selfvotes[selfsecond_place]add(voter_index)

                                                    break

                                                    selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                    winners = []

                                                    vacancies = selfelecN_VACANCIES

                                                    for candidate in reversed(selfsorted_candidates)

                                                    if vacancies == 0

                                                    break

                                                    winnersappend(candidate[0])

                                                    vacancies -= 1

                                                    mean chose_best = selfelecget_mean(winners = winners)

                                                    74

                                                    APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                                    Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                                    for voter_index voter in enumerate(selfelecsorted_voters)

                                                    voter_dict = dict()

                                                    og_voter_dict = dict()

                                                    for tup in voter

                                                    voter_dict[tup[0]] = tup[1]

                                                    og_voter_dict[tup[0]] = tup[1]

                                                    for coalition in selfeleccoalitions

                                                    for candidate in coalition

                                                    add_to_score = 0

                                                    for candidate2 in coalition

                                                    if candidate == candidate2

                                                    continue

                                                    half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                                    if half lt 0

                                                    add_to_score += mathceil(half)

                                                    else

                                                    add_to_score += mathfloor(half)

                                                    if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                                    voter_dict[candidate[rsquovaluersquo]] = 10

                                                    elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                                    voter_dict[candidate[rsquovaluersquo]] = -10

                                                    else

                                                    voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                                    selfrankings_changed[voter_index] = []

                                                    for candidate in voter_dict

                                                    selfrankings_changed[voter_index]append((candidate voter_dict[

                                                    candidate]))

                                                    selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                                    voter_index] key=lambda x x[1])

                                                    75

                                                    APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                    Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                    selfelecroundsappend(selfsorted_candidates[_round])

                                                    if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                    N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                    N_VACANCIES - 1)

                                                    return 2

                                                    elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                    N_VOTERS gt 05)

                                                    return 1

                                                    else

                                                    selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                    CANDIDATE_INDEX])

                                                    for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                    elecCANDIDATE_INDEX]]

                                                    if voter_index in selfrankings_changed

                                                    for candidate in reversed(selfrankings_changed[voter_index

                                                    ])

                                                    if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                    excluded

                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                    ]] += 1

                                                    selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                    add(voter_index)

                                                    break

                                                    else

                                                    continue

                                                    else

                                                    for candidate in reversed(selfelecsorted_voters[

                                                    voter_index])

                                                    if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                    excluded

                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                    ]] += 1

                                                    selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                    add(voter_index)

                                                    break

                                                    else

                                                    continue

                                                    selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                    return 0

                                                    76

                                                    APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                    Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                    for index in range(selfelecN_CANDIDATES)

                                                    selfcandidates[index] = 0

                                                    for voter in selfelecsorted_voters

                                                    for candidate in reversed(voter)

                                                    if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                    else

                                                    break

                                                    APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                    Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                    for index in range(selfelecN_CANDIDATES)

                                                    selfcandidates[index] = 0

                                                    for voter in selfelecsorted_voters

                                                    if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                    elecCANDIDATE_INDEX]]

                                                    selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                    else

                                                    for candidate in reversed(voter)

                                                    if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                    else

                                                    break

                                                    77

                                                    APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                    Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                    pos = set()

                                                    for index perc in enumerate(selfelectactical_vote_percentages)

                                                    if perc gt 0

                                                    posadd(index)

                                                    for candidate in selfeleccandidates

                                                    if candidate not in selfleading_candidates

                                                    for voter_index in selfvotes[candidate]

                                                    raised = None

                                                    for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                    ])

                                                    if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                    leading_candidates

                                                    if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                    if randomrandom() lt selfelectactical_vote_percentages[

                                                    candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                    ranking = [None]selfelecN_CANDIDATES

                                                    ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                    selfelecvoters[voter_index][candidate_tuple[selfelec

                                                    CANDIDATE_INDEX]])

                                                    raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                    break

                                                    break

                                                    break

                                                    if raised = None

                                                    for _candidate in selfleading_candidates

                                                    if _candidate = ranking[-1][0]

                                                    ranking[0] = (_candidate selfelecvoters[voter_index][

                                                    _candidate])

                                                    buried = _candidate

                                                    break

                                                    i = 1

                                                    for candidate_tuple in selfelecsorted_voters[voter_index]

                                                    if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                    buried]

                                                    continue

                                                    else

                                                    ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                    selfelecvoters[voter_index][candidate_tuple[selfelec

                                                    CANDIDATE_INDEX]])

                                                    i += 1

                                                    selfrankings_changed[voter_index] = ranking

                                                    78

                                                    APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                    Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                    for voter_index in selfvotes[candidate]

                                                    if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                    ]

                                                    for _candidate in selfleading_candidates

                                                    if _candidate = candidate

                                                    ranking = [None]selfelecN_CANDIDATES

                                                    ranking[0] = (_candidate selfelecvoters[voter_index][

                                                    _candidate])

                                                    buried = _candidate

                                                    break

                                                    i = 1

                                                    for candidate_tuple in selfelecsorted_voters[voter_index]

                                                    if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                    continue

                                                    else

                                                    ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                    selfelecvoters[voter_index][candidate_tuple[selfelec

                                                    CANDIDATE_INDEX]])

                                                    i += 1

                                                    selfrankings_changed[voter_index] = ranking

                                                    79

                                                    APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                    Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                    for index in range(selfelecN_CANDIDATES)

                                                    selfcandidates[index] = 0

                                                    for voter_index voter in enumerate(selfelecsorted_voters)

                                                    score = 0

                                                    if voter_index in selfrankings_changed

                                                    for candidate in selfrankings_changed[voter_index]

                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                    score += 1

                                                    else

                                                    for candidate in voter

                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                    score += 1

                                                    APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                    Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                    for voter_index voter in enumerate(selfelecsorted_voters)

                                                    if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                    elecCANDIDATE_INDEX]]

                                                    selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                    sorted_voters[voter_index])

                                                    for candidate_index candidate in enumerate(reversed(voter))

                                                    if candidate_index == 0

                                                    selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                    voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                    else

                                                    selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                    voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                    80

                                                    APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                    Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                    for index in range(selfelecN_CANDIDATES)

                                                    selfcandidates[index] = 0

                                                    for voter_index voter in enumerate(selfelecsorted_voters)

                                                    if voter_index in selfrankings_changed

                                                    for candidate in selfrankings_changed[voter_index]

                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                    selfelecCANDIDATE_RANK]

                                                    else

                                                    for candidate in voter

                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                    selfelecCANDIDATE_RANK]

                                                    APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                    Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                    for index in range(selfelecN_CANDIDATES)

                                                    selfcandidates[index] = 0

                                                    for voter in selfelecsorted_voters

                                                    votes = selfelecN_VACANCIES

                                                    for candidate in reversed(voter)

                                                    if votes == 0

                                                    break

                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                    votes -= 1

                                                    • Folha de aprovaccedilatildeo
                                                    • Agradecimentos
                                                    • Epiacutegrafe
                                                    • Resumo
                                                    • Abstract
                                                    • Lista de ilustraccedilotildees
                                                    • Lista de Coacutedigos
                                                    • Lista de tabelas
                                                    • Lista de abreviaturas e siglas
                                                    • Sumaacuterio
                                                    • INTRODUCcedilAtildeO
                                                      • MOTIVACcedilAtildeO E OBJETIVO
                                                      • MEacuteTODO
                                                      • ESTRUTURA
                                                        • SISTEMAS ELEITORAIS
                                                          • FISRT PAST THE POST
                                                            • Exemplo
                                                            • Vantagens e Desvantagens do FPTP
                                                            • Voto Uacutetil no FPTP
                                                              • TWO-ROUND SYSTEM
                                                                • Exemplo
                                                                • Vantagens e Desvantagens do TRS
                                                                • Voto Uacutetil no TRS
                                                                  • INSTANT-RUNOFF VOTING
                                                                    • Exemplo
                                                                    • Vantagens e Desvantagens do IRV
                                                                    • Voto Uacutetil no IRV
                                                                      • APPROVAL VOTING SYSTEM
                                                                        • Exemplo
                                                                        • Vantagens e Desvantagens do AVS
                                                                        • Voto Uacutetil no AVS
                                                                          • THE BORDA COUNT
                                                                            • Exemplo
                                                                            • Vantagens e Desvantagens do BC
                                                                            • Voto Uacutetil no BC
                                                                              • SCORE VOTING SYSTEM
                                                                                • Exemplo
                                                                                • Vantagens e Desvantagens do SVS
                                                                                • Voto Uacutetil no SVS
                                                                                  • BLOC VOTE
                                                                                    • Exemplo
                                                                                    • Voto Uacutetil no BV
                                                                                        • O SIMULADOR
                                                                                        • CENAacuteRIOS PERTINENTES
                                                                                          • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                          • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                          • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                          • CENAacuteRIO 4 COALIZOtildeES
                                                                                          • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                          • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                            • COMO FUNCIONA O SIMULADOR
                                                                                              • CLASSE Elections
                                                                                              • CLASSE FirstPastThePost
                                                                                              • CLASSE TwoRoundSystem
                                                                                              • CLASSE InstantRunoffVoting
                                                                                              • CLASSE ApprovalVoting
                                                                                              • CLASSE BordaCount
                                                                                              • CLASSE ScoreVoting
                                                                                              • CLASSE BlocVote
                                                                                              • TECNOLOGIAS UTILIZADAS
                                                                                                • CONCLUSAtildeO
                                                                                                • Referecircncias
                                                                                                • Meacutetodo create_voters
                                                                                                • Meacutetodo create_candidates
                                                                                                • Meacutetodo calculate_means
                                                                                                • Meacutetodo get_mean
                                                                                                • Meacutetodo calculate_mean
                                                                                                • Meacutetodo set_leading_candidates
                                                                                                • Meacutetodo irv_set_leading_candidates
                                                                                                • Meacutetodo sort_ranks
                                                                                                • Meacutetodo fptp_count_tactical_votes
                                                                                                • Meacutetodo fptp_count_minority_votes
                                                                                                • Meacutetodo trs_second_round
                                                                                                • Meacutetodo trs_account_for_coalitions
                                                                                                • Meacutetodo irv_count_votes
                                                                                                • Meacutetodo avs_count_votes
                                                                                                • Meacutetodo avs_count_votes_with_tactical
                                                                                                • Meacutetodo irv_apply_tactical_votes
                                                                                                • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                • Meacutetodo bc_sum_candidates_scores
                                                                                                • Meacutetodo svs_apply_tactical_votes
                                                                                                • Meacutetodo svs_sum_candidates_scores
                                                                                                • Meacutetodo bv_count_votes

                                                      27

                                                      de determinada escala Um eleitor pode dar o mesmo nuacutemero de pontos para diferentescandidatos e apoacutes o somatoacuterio de todas as pontuaccedilotildees o candidato com a pontuaccedilatildeo maisalta eacute eleito Incorporado ao escopo poliacutetico o SVS eacute utilizado no Partido Pirata Alematildeobem como em diversas organizaccedilotildees tais como o Fedora Project e Mozilla e tambeacutem emvariados esportes oliacutempicos e reality shows como o American Idol aponta Hamlin (2015)

                                                      261 Exemplo

                                                      Neste exemplo temos apresentados na tabela 8 abaixo 4 perfis distintos de eleitorese suas respectivas atribuiccedilotildees de pontos aos 4 candidatos Cada eleitor pode atribuirqualquer pontuaccedilatildeo a um candidato dentro da escala de -10 a 10 O resultado da eleiccedilatildeoapoacutes a soma de todos os pontos por candidato se encontra na tabela 9 onde o candidatoA eacute eleito com um total de 605 pontos

                                                      Tabela 8 ndash Exemplo SVS

                                                      Perfil A B C D Ndeg de eleitores1 10 -1 5 2 362 6 9 -3 4 253 2 0 8 4 224 3 3 3 10 17

                                                      Tabela 9 ndash Resultado SVSCandidatos Total de pontos

                                                      A 605B 240C 332D 430

                                                      262 Vantagens e Desvantagens do SVS

                                                      A grande vantagem do SVS eacute como ele proporciona aos eleitores expressar de maneiramuito proacutexima potencialmente exata suas impressotildees poliacuteticas de cada candidato Eleeacute ainda mais expressivo que o AVS Dessa maneira o spoiler effect tambeacutem se torna nuloao passo que toda intenccedilatildeo de voto eacute precisamente representada neste sistema

                                                      Assim como outros meacutetodos eleitorais este sofre igualmente dos males produzidos pelovoto taacutetico Sua principal desvantagem eacute discutida na seccedilatildeo abaixo

                                                      263 Voto Uacutetil no SVS

                                                      Da mesma maneira que no Approval Voting atraveacutes do bullet voting o SVS tambeacutempode ser convertido em uma eleiccedilatildeo sob o meacutetodo FPTP em um cenaacuterio com um grande

                                                      28

                                                      volume de eleitores maliciosos O voto uacutetil sob este sistema se manifesta pontuando-seapenas um candidato com uma nota positiva e todos os outros com as notas mais baixasda escala Se todos os eleitores se aproveitarem dessa abordagem natildeo existiraacute distinccedilatildeoefetiva entre uma eleiccedilatildeo sob SVS e FPTP Essencialmente cada eleitor estaacute votando emapenas um candidato Essa eacute a principal desvantagem do SVS e ela consegue eliminarsua principal vantagem dar ao eleitor um poder maior de expressatildeo

                                                      27 BLOC VOTE

                                                      O Bloc Vote eacute um meacutetodo utilizado para a eleiccedilatildeo de candidatos a cargos no governocom mais de uma vacacircncia Pode ser considerado um meio-termo entre o FPTP e oAVS pois os eleitores podem votar em mais de um candidato poreacutem satildeo limitados pelonuacutemero de vagas Em uma eleiccedilatildeo com duas vagas por exemplo cada eleitor selecionaraacutedois candidatos ou menos Sensatamente o candidato mais votado eacute eleito Ele possuialgumas utilizaccedilotildees em eleiccedilotildees locais em algumas partes da Inglaterra (Electoral ReformSociety 2017a)

                                                      271 Exemplo

                                                      Neste exemplo dois candidatos seratildeo eleitos logo cada eleitor votaraacute em no maacuteximodois candidatos A distribuiccedilatildeo de votos pode ser conferida na tabela 10 e o resultado dacontagem de votos na tabela 11 abaixo Os candidatos eleitos satildeo o C totalizando 78do maacuteximo de votos possiacuteveis para um candidato e o A com 43

                                                      Tabela 10 ndash Exemplo BV

                                                      Aprovaccedilotildees Ndeg de eleitoresAC 20AB 16BC 19BD 6CA 7CD 15DC 17

                                                      Tabela 11 ndash Resultado BVCandidatos Total de votos

                                                      A 43B 41C 78D 38

                                                      29

                                                      272 Voto Uacutetil no BV

                                                      Neste sistema eacute possiacutevel que um eleitor evite votar em sua primeira opccedilatildeo quandoeste natildeo tem chances de vitoacuteria e se fazendo isto ele diminuiraacute as chances de algum outrocandidato de seu desgosto ganhar Poreacutem o sistema previne um outro tipo de voto uacutetilEm eleiccedilotildees com mais de uma vaga onde os eleitores soacute podem votar em um candidatose um eleitor sabe que sua primeira opccedilatildeo tambeacutem eacute a primeira opccedilatildeo da maior parteda populaccedilatildeo e portanto muito provavelmente seraacute um dos candidatos eleitos eacute possiacutevelque ele arrisque votar em uma segunda opccedilatildeo sua na esperanccedila de a longo prazo elegersuas duas principais opccedilotildees de voto Com os eleitores podendo votar no nuacutemero exato devagas disponiacuteveis esse tipo de pensamento taacutetico perde o sentido

                                                      30

                                                      3 O SIMULADOR

                                                      Para este trabalho foi implementado um simulador eleitoral na forma de uma aplicaccedilatildeoweb para que a interaccedilatildeo do usuaacuterio fosse facilitada Veremos a seguir como se daacute suautilizaccedilatildeo de forma geral

                                                      Figura 2 ndash Captura de tela 1

                                                      Figura 3 ndash Captura de tela 2

                                                      A primeira opccedilatildeo encontrada pelo usuaacuterio eacute a escolha de quais sistemas de votaccedilatildeo se-ratildeo simulados (Figura 2) Todos eles podem ser selecionados para rodar simultaneamentePoreacutem natildeo eacute permitido rodar uma simulaccedilatildeo do Bloc Vote para uma eleiccedilatildeo onde apenasum candidato eacute eleito aleacutem disso natildeo existe implementaccedilatildeo dos meacutetodos TRS e IRV para

                                                      31

                                                      eleiccedilotildees com mais de um candidato eleito jaacute que eles se comportariam exatamente comono FPTP

                                                      A maioria das linguagens de programaccedilatildeo senatildeo todas possuem um gerador de nuacuteme-ros pseudoaleatoacuterios que fornece a possibilidade de definir uma seed para o gerador Estaseed funciona como um ponto de partida para a geraccedilatildeo dos nuacutemero e portanto todasimulaccedilatildeo que rodar com a mesma seed sempre teraacute os mesmos resultados Se nenhumvalor for fornecido pelo usuaacuterio o tempo atual do sistema eacute utilizado As opccedilotildees subse-quentes satildeo a escolha do nuacutemero de eleitores gerados e o nuacutemero de vagas (Figura 3) Senenhum valor for fornecido o nuacutemero de eleitores padratildeo utilizado eacute 1000 e o nuacutemero devagas igual a 1

                                                      Figura 4 ndash Captura de tela 3

                                                      Este simulador possui dois modos para a criaccedilatildeo dos rankings dos eleitores No modoManipulate (Figura 4) primeiramente se define o nuacutemero de candidatos atraveacutes do campode entrada ao lado do tiacutetulo Candidates ou alternativamente pode-se adicionar candida-tos um a um atraveacutes do sinal de mais na parte inferior da paacutegina Para cada candidatoeacute possiacutevel definir a porcentagem de seus eleitores que optaraacute pelo voto taacutetico e pelovoto de minoria Tambeacutem eacute possiacutevel alterar o nome dos candidatos se for do interessedo usuaacuterio

                                                      32

                                                      Figura 5 ndash Captura de tela 4

                                                      Figura 6 ndash Captura de tela 5

                                                      33

                                                      Figura 7 ndash Captura de tela 6

                                                      Apoacutes a criaccedilatildeo dos candidatos o usuaacuterio pode criar perfis de eleitores que definiratildeo demaneira exata como partes da populaccedilatildeo iraacute votar (Figura 5) Em cada perfil se defineo valor em porcentos da populaccedilatildeo votante que o adotaraacute e a nota de cada candidatoTambeacutem eacute possiacutevel nomear cada perfil livremente

                                                      No modo Generate (Figura 6) eacute onde o gerador de nuacutemeros pseudoaleatoacuterios eacute usadoNesse modo ao inveacutes do usuaacuterio criar perfis de eleitores ele define qual seraacute a distribuiccedilatildeoadotada para a geraccedilatildeo de notas de cada candidato Essas distribuiccedilotildees seratildeo mais bemdetalhadas no Capiacutetulo 5 Da mesma maneira que no modo Manipulate nesse modotambeacutem eacute possiacutevel definir os valores para os dois tipos de voto uacutetil os votos taacuteticos eos votos de minoria No primeiro estatildeo incluiacutedas as estrateacutegias de mudanccedila de votoespeciacuteficas de cada sistema como o bullet voting no AVS e SVS ou quando a preferecircnciade um eleitor claramente natildeo possui chances de vitoacuteria e ele muda seu voto para um doscandidatos que esteja na lideranccedila o que ocorre no FPTP e TRS O voto de minoriase apresenta apenas no FPTP em eleiccedilotildees onde mais de um candidato eacute eleito Se apreferecircncia de um eleitor claramente lidera a eleiccedilatildeo por ser tambeacutem a preferecircncia damaior parte da populaccedilatildeo esse eleitor pode mudar o seu voto para uma segunda opccedilatildeona esperanccedila de eleger dois de seus candidatos favoritos

                                                      Por fim em ambos os modos o usuaacuterio tem a opccedilatildeo de definir coalizotildees entre oscandidatos se o sistema TRS estiver habilitado pois as coalizotildees apenas se manifestamnesse sistema Essas coalizotildees alteraratildeo as notas dos candidatos dependendo dos outroscandidatos pertencentes a elas (Figura 7)

                                                      A aplicaccedilatildeo pode ser encontrada na paacutegina httpelectionsimpythonanywherecom

                                                      34

                                                      4 CENAacuteRIOS PERTINENTES

                                                      Para todos os cenaacuterios deste capiacutetulo seraacute usada a seed do simulador igual a 100 e apopulaccedilatildeo de eleitores igual a 1000 para que exista consistecircncia na anaacutelise e tambeacutem paraque possa haver replicaccedilatildeo dos resultados se necessaacuterio

                                                      41 CENAacuteRIO 1 VOTO TAacuteTICO

                                                      Neste exemplo teremos quatro candidatos Ana Beto Carla e Diego Ana e Betoseratildeo gerados a partir da distribuiccedilatildeo Neutral (Figura 47) Carla da distribuiccedilatildeo Disliked(Figura 51) e Diego da Hated (Figura 55) Para a simulaccedilatildeo com a seed 100 o melhorcandidato a ser eleito ou seja aquele que maximiza a meacutedia das notas dos eleitores eacute oBeto com uma meacutedia de 0073 Para cada sistema seratildeo comparados os resultados semvoto taacutetico aos com 20 de voto taacutetico a favor da Ana Abaixo se encontram osresultados para o sistema FPTP

                                                      Figura 8 ndash FPTP - Cenaacuterio 1 sem voto taacutetico

                                                      Figura 9 ndash TRS segundo turno - Cenaacuterio 1 sem voto taacutetico

                                                      35

                                                      Figura 10 ndash IRV primeiro turno - Cenaacuterio 1

                                                      Figura 11 ndash IRV segundo turno - Cenaacuterio 1

                                                      Figura 12 ndash IRV terceiro turno - Cenaacuterio 1

                                                      36

                                                      Figura 13 ndash AVS - Cenaacuterio 1 sem voto taacutetico

                                                      Figura 14 ndash BC - Cenaacuterio 1 sem voto taacutetico

                                                      Figura 15 ndash SVS - Cenaacuterio 1 sem voto taacutetico

                                                      37

                                                      Nesse cenaacuterio sem voto taacutetico o uacutenico sistema que natildeo elege o Beto eacute o AVS Todosos outros elegem o melhor candidato Ou seja apesar de Beto ter uma melhor meacutediadas notas dos eleitores existem mais eleitores que ranqueiam Ana com uma nota acimade 0 No entanto apenas 20 dos eleitores de Diego e Carla que preferem a Ana aoinveacutes do Beto satildeo o suficiente para fazer Beto natildeo ser eleito se eles decidirem abandonarsua primeira opccedilatildeo e votar na Ana Considerando a vantagem que os votos taacuteticosproporcionam agrave Ana esta eacute eleita em todos os sistemas menos o TRS e o IRV

                                                      Figura 16 ndash FPTP - Cenaacuterio 1 - 20 de voto taacutetico na Ana

                                                      Figura 17 ndash TRS segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                      38

                                                      Figura 18 ndash IRV primeiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                      Figura 19 ndash IRV segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                      Figura 20 ndash IRV terceiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                      39

                                                      Figura 21 ndash AVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                      Figura 22 ndash BC - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                      Figura 23 ndash SVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                      40

                                                      Eacute claro que se os eleitores que preferem o Beto tambeacutem votassem de maneira estra-teacutegica a situaccedilatildeo se equilibraria e haveria o mesmo niacutevel de concorrecircncia entre os doiscandidatos que ocorre quando natildeo haacute voto taacutetico Poreacutem no Borda Count esse equiliacute-brio pode natildeo acontecer e as estrateacutegias de compromising e burying podem acabar saindopela culatra se uma porcentagem elevada dos eleitores as adotarem Abaixo encontram-seos resultados para esse sistema quando 100 dos eleitores de Carla e Diego se comportammaliciosamente

                                                      Figura 24 ndash BC - Cenaacuterio 1 100 de voto taacutetico na Ana e Beto

                                                      Por causa do uso demasiado da estrateacutegia burying Ana e Beto perdem muitos pontose isso abre espaccedilo para uma vitoacuteria da Carla No entanto para porcentagens menores que100 o Beto ainda eacute o vencedor

                                                      Essas duas estrateacutegias tambeacutem foram implementadas nesse simulador para o sistemaIRV e eacute possiacutevel ver como ele eacute resistente a elas Para que seja possiacutevel mudar os resultadosde uma eleiccedilatildeo sob o IRV eacute necessaacuterio mudar a ordem de eliminaccedilatildeo dos candidatos paraque o seu candidato preferido acabe enfrentando um candidato mais fraco nas rodadasfinais Isso natildeo ocorre com compromising e burying No proacuteximo cenaacuterio seraacute analisadacomo eacute possiacutevel modificar os resultados de uma eleiccedilatildeo sob o IRV

                                                      Esses resultados podem ser replicados acessando os linksSem votos taacuteticos lthttpelectionsimpythonanywherecomdirect_res1111110

                                                      --[0021][22Ana2222Beto222022Carla2222Diego22]------100gt

                                                      Com 20 de voto taacutetico lthttpelectionsimpythonanywherecomdirect_res1111110--[0021][22Ana222022Beto2222Carla2222Diego22]1-[02000]---100gt

                                                      Com 100 de voto taacuteticona Ana e Beto lthttpelectionsimpythonanywherecomdirect_res0000100--[0021][22Ana222022Beto222022Carla2222Diego22]1-[101000]---100gt

                                                      41

                                                      42 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV

                                                      Neste cenaacuterio teremos Ana Carla e Beto concorrendo e trecircs perfis distintos que apoiamcada candidato As distribuiccedilotildees de notas dos perfis se encontram na tabela abaixo

                                                      Tabela 12 ndash Distribuiccedilatildeo de notas - Cenaacuterio 2

                                                      Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                      deeleitores

                                                      1 10 5 0 422 0 10 5 303 5 0 10 28

                                                      Com essas distribuiccedilotildees Carla eacute eliminada na primeira rodada e seus 28 de votossatildeo transferidos para a segunda opccedilatildeo de seus eleitores Ana que eacute eleita com 70 dosvotos e uma meacutedia de 56

                                                      Figura 25 ndash IRV primeiro turno - Cenaacuterio 2

                                                      Figura 26 ndash IRV segundo turno - Cenaacuterio 2

                                                      42

                                                      Cientes desse provaacutevel futuro cenaacuterio onde Ana eacute eleita uma pequena parte dos elei-tores de Beto estrategicamente o abandona e decide apoiar Carla na esperanccedila de leva-laao segundo turno contra Ana As novas distribuiccedilotildees de notas se encontram na tabelaabaixo com essa porccedilatildeo de eleitores representada pelo perfil 4

                                                      Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2

                                                      Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                      deeleitores

                                                      1 10 5 0 422 0 10 5 283 5 0 10 284 0 8 10 2

                                                      Essa mudanccedila estrateacutegica de voto altera a ordem de eliminaccedilotildees do sistema com Betosendo o primeiro a ser eliminado Com isso seus votos satildeo naturalmente transferidos paraCarla que derrota Ana no segundo turno com 58 dos votos

                                                      Figura 27 ndash IRV primeiro turno com voto taacutetico - Cenaacuterio 2

                                                      Figura 28 ndash IRV segundo turno com voto taacutetico - Cenaacuterio 2

                                                      43

                                                      Percebendo que a eleiccedilatildeo de Beto natildeo era provaacutevel seus eleitores conseguiram aomenos impedir a eleiccedilatildeo do pior candidato para eles Mas para isso foi necessaacuterio queeles tivessem a informaccedilatildeo de como os outros eleitores votariam Uma aproximaccedilatildeo dessasinformaccedilotildees poderia ser obtida em um cenaacuterio real com poucos candidatos atraveacutes depesquisas eleitorais poreacutem se o nuacutemero de candidatos eacute significativo uma noccedilatildeo completadas distribuiccedilotildees dos rankings dos eleitores se torna muito menos viaacutevel e dificulta aformulaccedilatildeo de estrateacutegias para alterar a ordem em que os candidatos satildeo eliminados

                                                      Esses resultados podem ser replicados acessando os linksSem voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana22

                                                      22Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                      Com voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana

                                                      2222Beto2222Carla22]-----42Voter20Profile2001020520028Voter20Profile2010201020528Voter20Profile202520020102Voter20Profile20302082010100gt

                                                      43 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE

                                                      O interessante dos sistemas IRV e TRS eacute que os resultados do cenaacuterio anterior po-deriam ter sido obtidos ao inveacutes do voto taacutetico pela sua natildeo-monotonicidade Seriapossiacutevel que a Carla derrotasse a Ana no segundo turno atraveacutes do proacuteprio aumento depopularidade da Ana Assumindo que essa popularizaccedilatildeo ocorresse entre os candidatosdo perfil 2 onde 3 passasse a apoiar a Ana ao inveacutes do Beto as novas distribuiccedilotildeesseguiriam a tabela abaixo

                                                      Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                      Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                      deeleitores

                                                      1 10 5 0 452 0 10 5 273 5 0 10 28

                                                      Dessa maneira Beto agora com uma porcentagem dos eleitores menor do que a deCarla seraacute eliminado na primeira rodada e como seus eleitores tecircm a Carla como segundaopccedilatildeo ela receberaacute todos os seus votos e seraacute eleita na segunda rodada As rodadas doIRV podem ser vistas nas figuras 29 e 30

                                                      44

                                                      Figura 29 ndash IRV primeiro turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                      Figura 30 ndash IRV segundo turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                      Tabela 15 ndash Resultados do Cenaacuterio 3Candidato

                                                      eleitoMeacutedia das

                                                      notasAntes da

                                                      popularizaccedilatildeode Ana

                                                      Ana 56

                                                      Apoacutespopularizaccedilatildeo

                                                      de AnaCarla 415

                                                      Os efeitos dessa caracteriacutestica se refletem na satisfaccedilatildeo meacutedia da populaccedilatildeo A Ana eacuteclaramente a melhor candidata e mesmo com o seu ganho de popularidade (ou devido aele) a Carla eacute eleita

                                                      Esses resultados podem ser replicados acessando os linksAntes da popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecom

                                                      direct_res0010000---[22Ana2222Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                      45

                                                      Apoacutes popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana2222Beto2222Carla22]-----45Voter20Profile2001020520027Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                      44 CENAacuteRIO 4 COALIZOtildeES

                                                      O TRS por ser organizado em dois turnos separados normalmente a semanas dedistacircncia um do outro acaba abrindo brecha agrave mudanccedila de opiniatildeo por parte dos eleitorese o desenvolvimento de novas estrateacutegias por parte dos candidatos tais como a coalizatildeocom candidatos jaacute eliminados Com isso em mente nesse cenaacuterio teremos novamenteos quatro candidatos Ana Beto Carla e Diego Os trecircs primeiros seratildeo gerados dadistribuiccedilatildeo Neutral e Diego da distribuiccedilatildeo Disliked

                                                      Figura 31 ndash TRS turno 1 - Cenaacuterio 4

                                                      No TRS normal Ana Beto e Carla possuem com essas distribuiccedilotildees quantidades devotos muito proacuteximas com Beto e Carla indo para o segundo turno Carla estaacute 10 votosatraacutes de Beto e decide aproveitar o espaccedilo de tempo entre os dois turnos para tentaragregar mais votos Com isso Carla se aproxima de Diego e juntos formam uma coalizatildeoNo entanto com sua baixa popularidade Diego acaba ferindo a reputaccedilatildeo de Carla etorna o segundo turno muito mais faacutecil para Beto (Figura 33) Se Carla tivesse buscado osuporte de Ana por outro lado ela se veria vitoriosa no segundo turno e com uma amplavantagem sobre o Beto (Figura 34) Ou ateacute mesmo sem buscar uma coalizatildeo mesmosendo uma corrida apertada Carla teria naturalmente sido eleita (Figura 32)

                                                      Esses resultados podem ser replicados acessando os linksSem coalizotildees lthttpelectionsimpythonanywherecomdirect_res0100000

                                                      --[0002][22Ana222022Beto2222Carla2222Diego22]------100gt

                                                      46

                                                      Figura 32 ndash TRS turno 2 - Cenaacuterio 4

                                                      Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4

                                                      Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4

                                                      47

                                                      Coalizatildeo Carla e Diego lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2203Carla20Diego-100gt

                                                      Coalizatildeo Carla e Ana lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2200Carla20Ana-100gt

                                                      45 CENAacuteRIO 5 DILEMA DO PRISIONEIRO

                                                      Neste cenaacuterio temos uma eleiccedilatildeo de uma vaga com trecircs candidatos concorrentes e trecircsperfis distintos de eleitores que seguiratildeo as seguintes distribuiccedilotildees

                                                      Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5

                                                      Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                      deeleitores

                                                      1 10 -10 5 362 -10 10 5 343 -10 -10 5 30

                                                      Esse contexto nos remete ao notaacutevel dilema do prisioneiro Nele dois prisioneiroscuacutemplices satildeo interrogados individualmente sem poder se comunicar um com o outro ecada um enfrenta o dilema de delatar ou natildeo o seu parceiro Se os dois prisioneirosdecidem se manter calados sobre o crime ambos satildeo sentenciados a um ano de prisatildeo Seapenas um deles dedurar o outro o traidor sai livre enquanto seu parceiro eacute condenadoa trecircs anos Se ambos dedurarem um ao outro eles satildeo condenados juntos a dois anosde prisatildeo Esse dilema eacute uma ideia claacutessica presente no estudo da teoria dos jogos sendooriginalmente elaborada por Merrill Flood e Melvin Dresher em 1950 e mais tarde sendonomeada de dilema dos prisioneiros por Albert W Tucker (POUNDSTONE 1992)

                                                      O que esse dilema nos mostra eacute a tentaccedilatildeo que o indiviacuteduo deteacutem se sua racionalizaccedilatildeoestiver voltada para seus proacuteprios interesses e somente eles em oposiccedilatildeo a pensar no bemdo grupo como um todo Neste cenaacuterio encontramos dois grupos de eleitores expressiva-mente opostos os perfis 1 e 2 Se qualquer uma das preferecircncias desses perfis fosse eleitaisso significaria uma alta rejeiccedilatildeo de maior parte da populaccedilatildeo No entanto eles possuema segunda opccedilatildeo em comum a Carla que por sua vez eacute a preferecircncia do terceiro perfilPortanto a eleiccedilatildeo da Carla seria logicamente o resultado oacutetimo

                                                      Mesmo assim a Ana eacute eleita nos dois sistemas acima o que natildeo parece justo poispela tabela 16 eacute evidente que apenas 36 da populaccedilatildeo a aprova enquanto que os outros64 a reprovam ao maacuteximo O sistema IRV se comporta de maneira idecircntica ao TRS

                                                      48

                                                      Figura 35 ndash FPTP - Cenaacuterio 5

                                                      Figura 36 ndash TRS segundo turno - Cenaacuterio 5

                                                      nesta situaccedilatildeo Com esse resultado a meacutedia das notas eacute -28 No entanto os trecircs sistemasseguintes nos apresentam resultados diferentes

                                                      Tabela 17 ndash Resultados do Cenaacuterio 5

                                                      Sistema Candidatoeleito

                                                      Meacutedia dasnotas

                                                      FPTP Ana -28TRS Ana -28IRV Ana -28AVS Carla 50BC Carla 50SVS Carla 50

                                                      49

                                                      Figura 37 ndash AVS - Cenaacuterio 5

                                                      Figura 38 ndash BC - Cenaacuterio 5

                                                      Tanto o AVS quanto o Borda Count e o SVS satildeo sistemas que consideram todasas opiniotildees de cada eleitor ao mesmo tempo e por isso satildeo capazes de eleger o melhorcandidato nesta situaccedilatildeo diferentemente do TRS que natildeo absorve completamente todosentimento do eleitor por todos os candidatos e o IRV que apesar de ser bem expressivoquebra esse processo em inuacutemeras rodadas o que permite a perda de informaccedilatildeo ao longodelas

                                                      Esses resultados podem ser replicados acessando o linklthttpelectionsimpythonanywherecomdirect_res1111110---[22Ana

                                                      222022Beto222022Carla22]-----36Voter20Profile2001020-1020534Voter20Profile201-10201020530Voter20Profile202-1020-10205100gt

                                                      50

                                                      Figura 39 ndash SVS - Cenaacuterio 5

                                                      46 CENAacuteRIO 6 VOTO DE MINORIA

                                                      Neste cenaacuterio temos uma eleiccedilatildeo com quatro candidatos e duas vagas A Ana seraacutea preferecircncia de uma extensa parte da populaccedilatildeo (distribuiccedilatildeo Loved Figura 53) Betoe Carla seratildeo candidatos razoavelmente populares (distribuiccedilatildeo Neutral Figura 47) eDiego seraacute a preferecircncia de apenas um pequeno grupo especiacutefico e rejeitado pela maioria(distribuiccedilatildeo Disliked Figura 51) Eacute intuitivo esperar que os dois candidatos eleitos seratildeoa Ana e ou o Beto ou a Carla e isso eacute exatamente o que ocorre na figura 40 no sistemaFPTP sem voto de minoria

                                                      Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria

                                                      Eacute evidente a discrepacircncia da quantidade de votos da Ana para os outros candidatose apesar de Beto e Carla serem mais populares que Diego os trecircs natildeo se encontrammuito afastados Poreacutem se a pequena fraccedilatildeo de candidatos que possuem a Ana como

                                                      51

                                                      Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego

                                                      preferecircncia e Diego como segunda opccedilatildeo optarem pelo voto de minoria a situaccedilatildeo mudacompletamente (Figura 41) Assim apesar de extensamente rejeitado Diego conquistaa segunda vaga e a meacutedia das notas despenca de 2929 para 0505 No entanto aindaexiste um cenaacuterio pior Se os outros grupos de eleitores pensarem da mesma forma eevitarem votar na Ana achando que sua eleiccedilatildeo jaacute estaacute assegurada apenas 80 de votode minoria para esses grupos jaacute eacute o suficiente para eliminaacute-la das eleiccedilotildees (Figura 42)Com a Ana eliminada a meacutedia das notas cai ainda mais para 0058

                                                      Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego

                                                      O sistema Bloc Vote eacute uma das soluccedilotildees para o voto de minoria Permitindo queos eleitores votem no mesmo nuacutemero de candidatos que de vagas a serem preenchidasnatildeo existe o iacutempeto a esse tipo de voto estrateacutegico O resultado desse sistema portantoretorna a meacutedia das notas a casa dos 29 (Figura 43) Os sistemas AVS Borda Count eSVS tambeacutem impedem a presenccedila do voto de minoria e atingem resultados semelhantes

                                                      52

                                                      Figura 43 ndash BV - Cenaacuterio 6

                                                      Tabela 18 ndash Resultados do Cenaacuterio 6

                                                      Sistema Candidatoseleitos

                                                      Meacutedia dasnotas

                                                      FPTP sem voto de minoriaAna eBeto 2929

                                                      FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

                                                      FPTP com 80 de voto de minoriaBeto eCarla 0058

                                                      Bloc VoteAna eCarla 2913

                                                      Esses resultados podem ser replicados acessando os links

                                                      Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

                                                      100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

                                                      80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

                                                      53

                                                      5 COMO FUNCIONA O SIMULADOR

                                                      O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

                                                      51 CLASSE ELECTIONS

                                                      Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

                                                      bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

                                                      Figura 44 ndash estrutura candidates

                                                      bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

                                                      bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

                                                      Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

                                                      Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

                                                      54

                                                      Figura 45 ndash estrutura voters

                                                      Figura 46 ndash estrutura votes

                                                      daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

                                                      Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

                                                      55

                                                      Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

                                                      Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

                                                      na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

                                                      56

                                                      Figura 49 ndash PDF - Distribuiccedilatildeo Liked

                                                      Figura 50 ndash CDF - Distribuiccedilatildeo Liked

                                                      (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

                                                      Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

                                                      57

                                                      Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

                                                      Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

                                                      candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

                                                      Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

                                                      58

                                                      Figura 53 ndash PDF - Distribuiccedilatildeo Loved

                                                      Figura 54 ndash CDF - Distribuiccedilatildeo Loved

                                                      funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

                                                      59

                                                      Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                                                      Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                                                      Meacutedia das Notas sumei

                                                      sumvj nij

                                                      etimes v

                                                      Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                                                      Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                                                      60

                                                      Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                                                      Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                                                      52 CLASSE FIRSTPASTTHEPOST

                                                      Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                                                      Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                                                      61

                                                      Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                                                      Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                                                      mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                                                      62

                                                      53 CLASSE TWOROUNDSYSTEM

                                                      A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                                                      54 CLASSE INSTANTRUNOFFVOTING

                                                      A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                                                      Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                                                      63

                                                      cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                                                      55 CLASSE APPROVALVOTING

                                                      Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                                                      56 CLASSE BORDACOUNT

                                                      Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                                                      57 CLASSE SCOREVOTING

                                                      De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                                                      64

                                                      58 CLASSE BLOCVOTE

                                                      O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                                                      59 TECNOLOGIAS UTILIZADAS

                                                      A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                                                      Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                                                      O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                                                      Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                                                      65

                                                      6 CONCLUSAtildeO

                                                      Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                                                      Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                                                      Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                                                      Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                                                      Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                                                      66

                                                      REFEREcircNCIAS

                                                      AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                                                      Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                                                      Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                                                      Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                                                      HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                                                      LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                                                      ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                                                      Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                                                      POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                                                      The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                                                      67

                                                      APEcircNDICES

                                                      APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                                      Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                                      if(not len(selfvoter_profiles))

                                                      for voter in range(selfN_VOTERS)

                                                      candidates_rank = dict()

                                                      for candidate in reversed(range(selfN_CANDIDATES))

                                                      if(selfBIAS_VECTOR[candidate]==4)

                                                      candidates_rank[candidate] = self_sortear(selfloved)

                                                      elif(selfBIAS_VECTOR[candidate]==3)

                                                      candidates_rank[candidate] = self_sortear(selfliked)

                                                      elif(selfBIAS_VECTOR[candidate]==2)

                                                      candidates_rank[candidate] = self_sortear(selfdisliked)

                                                      elif(selfBIAS_VECTOR[candidate]==1)

                                                      candidates_rank[candidate] = self_sortear(selfhated)

                                                      elif(selfBIAS_VECTOR[candidate]==-1)

                                                      candidates_rank[candidate] = self_sortear(selfpolarizer

                                                      )

                                                      elif(selfBIAS_VECTOR[candidate]==-2)

                                                      candidates_rank[candidate] = self_sortear(self

                                                      more_polarizer)

                                                      else

                                                      candidates_rank[candidate] = self_sortear(selfneutral)

                                                      selfvotersappend(candidates_rank)

                                                      else

                                                      ranges = []

                                                      ranks = []

                                                      for prof in selfvoter_profiles

                                                      rangesappend(int(prof[pop_percentage]))

                                                      rank =

                                                      for index score in enumerate(prof[scores])

                                                      rank[index] = score

                                                      ranksappend(rank)

                                                      for index _range in enumerate(ranges)

                                                      for _ in range(int(selfN_VOTERS(_range100)))

                                                      selfvotersappend(ranks[index])

                                                      68

                                                      APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                                      Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                                      for i in range(selfN_CANDIDATES)

                                                      selfcandidates[i] = 0

                                                      selfvotes[i] = set()

                                                      APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                                      Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                                      for candidate in range(selfN_CANDIDATES)

                                                      rating_sum = 0

                                                      for voter in selfvoters

                                                      rating_sum += voter[candidate]

                                                      selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                                      APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                                      Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                                      if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                                      return selfcalculate_mean(winners)

                                                      else

                                                      chose_best = True if winners[0] == selfbest_candidate else

                                                      False

                                                      return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                                      69

                                                      APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                                      Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                                      rating_sum = 0

                                                      for voter in selfvoters

                                                      for candidate in winners

                                                      rating_sum += voter[candidate]

                                                      return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                                      APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                                      Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                                      for i in range(1 selfN_VACANCIES + 2)

                                                      selfleading_candidatesappend(selfsorted_candidates[-i][self

                                                      CANDIDATE_INDEX])

                                                      APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                                      Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                                      for leader in selfelecrounds[-1]

                                                      selfleading_candidatesappend(leader[0])

                                                      70

                                                      APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                                      Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                                      self_account_for_coalitions()

                                                      for voter in selfvoters

                                                      selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                                      (1)))

                                                      temp = []

                                                      for voter in selfsorted_voters

                                                      new_dict = defaultdict(list)

                                                      for k in voter

                                                      new_dict[k[1]]append(k[0])

                                                      tempappend(new_dict)

                                                      selfsorted_voters = []

                                                      for voter_index current_voter in enumerate(temp)

                                                      new_voter = []

                                                      for rating candidate_indexes in current_voteritems()

                                                      if len(current_voter[rating]) gt 1

                                                      shuffle(current_voter[rating])

                                                      for e in candidate_indexes

                                                      new_voterappend((e rating))

                                                      else

                                                      new_voterappend((candidate_indexes[0] rating))

                                                      selfsorted_votersappend(new_voter)

                                                      selfcandidates[new_voter[-1][0]] += 1

                                                      selfvotes[new_voter[-1][0]]add(voter_index)

                                                      71

                                                      APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                                      Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                                      for candidate in selfvotes_copy

                                                      if candidate not in selfelecleading_candidates

                                                      for voter_index in selfvotes_copy[candidate]

                                                      for index _candidate in enumerate(reversed(selfelec

                                                      sorted_voters[voter_index]))

                                                      if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                                      leading_candidates

                                                      if randomrandom() lt selfelec

                                                      tactical_vote_percentages[_candidate[selfelec

                                                      CANDIDATE_INDEX]]

                                                      selfrankings_changed[voter_index] = copy

                                                      deepcopy(selfelecsorted_voters[voter_index])

                                                      selfrankings_changed[voter_index][-(index + 1)]

                                                      selfrankings_changed[voter_index][-1] = self

                                                      rankings_changed[voter_index][-1] self

                                                      rankings_changed[voter_index][-(index + 1)]

                                                      selfcandidates[candidate] -= 1

                                                      selfcandidates[_candidate[selfelec

                                                      CANDIDATE_INDEX]] += 1

                                                      selfvotes[candidate]remove(voter_index)

                                                      selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                                      ]]add(voter_index)

                                                      break

                                                      break

                                                      72

                                                      APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                                      Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                                      half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                                      for candidate in selfelecleading_candidates

                                                      if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                                      continue

                                                      for voter_index in selfvotes_copy[candidate]

                                                      if voter_index in selfrankings_changed

                                                      ranking = selfrankings_changed[voter_index]

                                                      else

                                                      ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                                      ])

                                                      for index _candidate in enumerate(reversed(ranking))

                                                      if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                      leading_candidates or (_candidate[selfelec

                                                      CANDIDATE_INDEX] in selfelecleading_candidates and

                                                      selfelecleading_candidatesindex(_candidate[selfelec

                                                      CANDIDATE_INDEX]) gt= half_vacancies)

                                                      if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                                      if randomrandom() lt selfelec

                                                      minority_vote_percentages[_candidate[selfelec

                                                      CANDIDATE_INDEX]]

                                                      selfcandidates[candidate] -= 1

                                                      selfcandidates[_candidate[selfelec

                                                      CANDIDATE_INDEX]] += 1

                                                      break

                                                      break

                                                      break

                                                      73

                                                      APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                                      Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                                      self_account_for_coalitions()

                                                      for candidate in selfvotes

                                                      if candidate = selfwinner and candidate = selfsecond_place

                                                      for voter_index in selfvotes[candidate]

                                                      if voter_index in selfrankings_changed

                                                      ranking = selfrankings_changed[voter_index]

                                                      else

                                                      ranking = copydeepcopy(selfelecsorted_voters[

                                                      voter_index])

                                                      for index2 candidate in enumerate(reversed(ranking))

                                                      if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                                      selfcandidates[selfwinner] += 1

                                                      selfvotes[selfwinner]add(voter_index)

                                                      break

                                                      elif candidate[selfelecCANDIDATE_INDEX] == self

                                                      second_place

                                                      selfcandidates[selfsecond_place] += 1

                                                      selfvotes[selfsecond_place]add(voter_index)

                                                      break

                                                      selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                      winners = []

                                                      vacancies = selfelecN_VACANCIES

                                                      for candidate in reversed(selfsorted_candidates)

                                                      if vacancies == 0

                                                      break

                                                      winnersappend(candidate[0])

                                                      vacancies -= 1

                                                      mean chose_best = selfelecget_mean(winners = winners)

                                                      74

                                                      APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                                      Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                                      for voter_index voter in enumerate(selfelecsorted_voters)

                                                      voter_dict = dict()

                                                      og_voter_dict = dict()

                                                      for tup in voter

                                                      voter_dict[tup[0]] = tup[1]

                                                      og_voter_dict[tup[0]] = tup[1]

                                                      for coalition in selfeleccoalitions

                                                      for candidate in coalition

                                                      add_to_score = 0

                                                      for candidate2 in coalition

                                                      if candidate == candidate2

                                                      continue

                                                      half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                                      if half lt 0

                                                      add_to_score += mathceil(half)

                                                      else

                                                      add_to_score += mathfloor(half)

                                                      if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                                      voter_dict[candidate[rsquovaluersquo]] = 10

                                                      elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                                      voter_dict[candidate[rsquovaluersquo]] = -10

                                                      else

                                                      voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                                      selfrankings_changed[voter_index] = []

                                                      for candidate in voter_dict

                                                      selfrankings_changed[voter_index]append((candidate voter_dict[

                                                      candidate]))

                                                      selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                                      voter_index] key=lambda x x[1])

                                                      75

                                                      APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                      Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                      selfelecroundsappend(selfsorted_candidates[_round])

                                                      if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                      N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                      N_VACANCIES - 1)

                                                      return 2

                                                      elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                      N_VOTERS gt 05)

                                                      return 1

                                                      else

                                                      selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                      CANDIDATE_INDEX])

                                                      for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                      elecCANDIDATE_INDEX]]

                                                      if voter_index in selfrankings_changed

                                                      for candidate in reversed(selfrankings_changed[voter_index

                                                      ])

                                                      if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                      excluded

                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                      ]] += 1

                                                      selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                      add(voter_index)

                                                      break

                                                      else

                                                      continue

                                                      else

                                                      for candidate in reversed(selfelecsorted_voters[

                                                      voter_index])

                                                      if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                      excluded

                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                      ]] += 1

                                                      selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                      add(voter_index)

                                                      break

                                                      else

                                                      continue

                                                      selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                      return 0

                                                      76

                                                      APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                      Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                      for index in range(selfelecN_CANDIDATES)

                                                      selfcandidates[index] = 0

                                                      for voter in selfelecsorted_voters

                                                      for candidate in reversed(voter)

                                                      if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                      else

                                                      break

                                                      APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                      Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                      for index in range(selfelecN_CANDIDATES)

                                                      selfcandidates[index] = 0

                                                      for voter in selfelecsorted_voters

                                                      if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                      elecCANDIDATE_INDEX]]

                                                      selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                      else

                                                      for candidate in reversed(voter)

                                                      if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                      else

                                                      break

                                                      77

                                                      APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                      Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                      pos = set()

                                                      for index perc in enumerate(selfelectactical_vote_percentages)

                                                      if perc gt 0

                                                      posadd(index)

                                                      for candidate in selfeleccandidates

                                                      if candidate not in selfleading_candidates

                                                      for voter_index in selfvotes[candidate]

                                                      raised = None

                                                      for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                      ])

                                                      if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                      leading_candidates

                                                      if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                      if randomrandom() lt selfelectactical_vote_percentages[

                                                      candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                      ranking = [None]selfelecN_CANDIDATES

                                                      ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                      selfelecvoters[voter_index][candidate_tuple[selfelec

                                                      CANDIDATE_INDEX]])

                                                      raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                      break

                                                      break

                                                      break

                                                      if raised = None

                                                      for _candidate in selfleading_candidates

                                                      if _candidate = ranking[-1][0]

                                                      ranking[0] = (_candidate selfelecvoters[voter_index][

                                                      _candidate])

                                                      buried = _candidate

                                                      break

                                                      i = 1

                                                      for candidate_tuple in selfelecsorted_voters[voter_index]

                                                      if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                      buried]

                                                      continue

                                                      else

                                                      ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                      selfelecvoters[voter_index][candidate_tuple[selfelec

                                                      CANDIDATE_INDEX]])

                                                      i += 1

                                                      selfrankings_changed[voter_index] = ranking

                                                      78

                                                      APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                      Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                      for voter_index in selfvotes[candidate]

                                                      if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                      ]

                                                      for _candidate in selfleading_candidates

                                                      if _candidate = candidate

                                                      ranking = [None]selfelecN_CANDIDATES

                                                      ranking[0] = (_candidate selfelecvoters[voter_index][

                                                      _candidate])

                                                      buried = _candidate

                                                      break

                                                      i = 1

                                                      for candidate_tuple in selfelecsorted_voters[voter_index]

                                                      if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                      continue

                                                      else

                                                      ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                      selfelecvoters[voter_index][candidate_tuple[selfelec

                                                      CANDIDATE_INDEX]])

                                                      i += 1

                                                      selfrankings_changed[voter_index] = ranking

                                                      79

                                                      APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                      Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                      for index in range(selfelecN_CANDIDATES)

                                                      selfcandidates[index] = 0

                                                      for voter_index voter in enumerate(selfelecsorted_voters)

                                                      score = 0

                                                      if voter_index in selfrankings_changed

                                                      for candidate in selfrankings_changed[voter_index]

                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                      score += 1

                                                      else

                                                      for candidate in voter

                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                      score += 1

                                                      APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                      Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                      for voter_index voter in enumerate(selfelecsorted_voters)

                                                      if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                      elecCANDIDATE_INDEX]]

                                                      selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                      sorted_voters[voter_index])

                                                      for candidate_index candidate in enumerate(reversed(voter))

                                                      if candidate_index == 0

                                                      selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                      voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                      else

                                                      selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                      voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                      80

                                                      APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                      Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                      for index in range(selfelecN_CANDIDATES)

                                                      selfcandidates[index] = 0

                                                      for voter_index voter in enumerate(selfelecsorted_voters)

                                                      if voter_index in selfrankings_changed

                                                      for candidate in selfrankings_changed[voter_index]

                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                      selfelecCANDIDATE_RANK]

                                                      else

                                                      for candidate in voter

                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                      selfelecCANDIDATE_RANK]

                                                      APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                      Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                      for index in range(selfelecN_CANDIDATES)

                                                      selfcandidates[index] = 0

                                                      for voter in selfelecsorted_voters

                                                      votes = selfelecN_VACANCIES

                                                      for candidate in reversed(voter)

                                                      if votes == 0

                                                      break

                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                      votes -= 1

                                                      • Folha de aprovaccedilatildeo
                                                      • Agradecimentos
                                                      • Epiacutegrafe
                                                      • Resumo
                                                      • Abstract
                                                      • Lista de ilustraccedilotildees
                                                      • Lista de Coacutedigos
                                                      • Lista de tabelas
                                                      • Lista de abreviaturas e siglas
                                                      • Sumaacuterio
                                                      • INTRODUCcedilAtildeO
                                                        • MOTIVACcedilAtildeO E OBJETIVO
                                                        • MEacuteTODO
                                                        • ESTRUTURA
                                                          • SISTEMAS ELEITORAIS
                                                            • FISRT PAST THE POST
                                                              • Exemplo
                                                              • Vantagens e Desvantagens do FPTP
                                                              • Voto Uacutetil no FPTP
                                                                • TWO-ROUND SYSTEM
                                                                  • Exemplo
                                                                  • Vantagens e Desvantagens do TRS
                                                                  • Voto Uacutetil no TRS
                                                                    • INSTANT-RUNOFF VOTING
                                                                      • Exemplo
                                                                      • Vantagens e Desvantagens do IRV
                                                                      • Voto Uacutetil no IRV
                                                                        • APPROVAL VOTING SYSTEM
                                                                          • Exemplo
                                                                          • Vantagens e Desvantagens do AVS
                                                                          • Voto Uacutetil no AVS
                                                                            • THE BORDA COUNT
                                                                              • Exemplo
                                                                              • Vantagens e Desvantagens do BC
                                                                              • Voto Uacutetil no BC
                                                                                • SCORE VOTING SYSTEM
                                                                                  • Exemplo
                                                                                  • Vantagens e Desvantagens do SVS
                                                                                  • Voto Uacutetil no SVS
                                                                                    • BLOC VOTE
                                                                                      • Exemplo
                                                                                      • Voto Uacutetil no BV
                                                                                          • O SIMULADOR
                                                                                          • CENAacuteRIOS PERTINENTES
                                                                                            • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                            • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                            • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                            • CENAacuteRIO 4 COALIZOtildeES
                                                                                            • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                            • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                              • COMO FUNCIONA O SIMULADOR
                                                                                                • CLASSE Elections
                                                                                                • CLASSE FirstPastThePost
                                                                                                • CLASSE TwoRoundSystem
                                                                                                • CLASSE InstantRunoffVoting
                                                                                                • CLASSE ApprovalVoting
                                                                                                • CLASSE BordaCount
                                                                                                • CLASSE ScoreVoting
                                                                                                • CLASSE BlocVote
                                                                                                • TECNOLOGIAS UTILIZADAS
                                                                                                  • CONCLUSAtildeO
                                                                                                  • Referecircncias
                                                                                                  • Meacutetodo create_voters
                                                                                                  • Meacutetodo create_candidates
                                                                                                  • Meacutetodo calculate_means
                                                                                                  • Meacutetodo get_mean
                                                                                                  • Meacutetodo calculate_mean
                                                                                                  • Meacutetodo set_leading_candidates
                                                                                                  • Meacutetodo irv_set_leading_candidates
                                                                                                  • Meacutetodo sort_ranks
                                                                                                  • Meacutetodo fptp_count_tactical_votes
                                                                                                  • Meacutetodo fptp_count_minority_votes
                                                                                                  • Meacutetodo trs_second_round
                                                                                                  • Meacutetodo trs_account_for_coalitions
                                                                                                  • Meacutetodo irv_count_votes
                                                                                                  • Meacutetodo avs_count_votes
                                                                                                  • Meacutetodo avs_count_votes_with_tactical
                                                                                                  • Meacutetodo irv_apply_tactical_votes
                                                                                                  • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                  • Meacutetodo bc_sum_candidates_scores
                                                                                                  • Meacutetodo svs_apply_tactical_votes
                                                                                                  • Meacutetodo svs_sum_candidates_scores
                                                                                                  • Meacutetodo bv_count_votes

                                                        28

                                                        volume de eleitores maliciosos O voto uacutetil sob este sistema se manifesta pontuando-seapenas um candidato com uma nota positiva e todos os outros com as notas mais baixasda escala Se todos os eleitores se aproveitarem dessa abordagem natildeo existiraacute distinccedilatildeoefetiva entre uma eleiccedilatildeo sob SVS e FPTP Essencialmente cada eleitor estaacute votando emapenas um candidato Essa eacute a principal desvantagem do SVS e ela consegue eliminarsua principal vantagem dar ao eleitor um poder maior de expressatildeo

                                                        27 BLOC VOTE

                                                        O Bloc Vote eacute um meacutetodo utilizado para a eleiccedilatildeo de candidatos a cargos no governocom mais de uma vacacircncia Pode ser considerado um meio-termo entre o FPTP e oAVS pois os eleitores podem votar em mais de um candidato poreacutem satildeo limitados pelonuacutemero de vagas Em uma eleiccedilatildeo com duas vagas por exemplo cada eleitor selecionaraacutedois candidatos ou menos Sensatamente o candidato mais votado eacute eleito Ele possuialgumas utilizaccedilotildees em eleiccedilotildees locais em algumas partes da Inglaterra (Electoral ReformSociety 2017a)

                                                        271 Exemplo

                                                        Neste exemplo dois candidatos seratildeo eleitos logo cada eleitor votaraacute em no maacuteximodois candidatos A distribuiccedilatildeo de votos pode ser conferida na tabela 10 e o resultado dacontagem de votos na tabela 11 abaixo Os candidatos eleitos satildeo o C totalizando 78do maacuteximo de votos possiacuteveis para um candidato e o A com 43

                                                        Tabela 10 ndash Exemplo BV

                                                        Aprovaccedilotildees Ndeg de eleitoresAC 20AB 16BC 19BD 6CA 7CD 15DC 17

                                                        Tabela 11 ndash Resultado BVCandidatos Total de votos

                                                        A 43B 41C 78D 38

                                                        29

                                                        272 Voto Uacutetil no BV

                                                        Neste sistema eacute possiacutevel que um eleitor evite votar em sua primeira opccedilatildeo quandoeste natildeo tem chances de vitoacuteria e se fazendo isto ele diminuiraacute as chances de algum outrocandidato de seu desgosto ganhar Poreacutem o sistema previne um outro tipo de voto uacutetilEm eleiccedilotildees com mais de uma vaga onde os eleitores soacute podem votar em um candidatose um eleitor sabe que sua primeira opccedilatildeo tambeacutem eacute a primeira opccedilatildeo da maior parteda populaccedilatildeo e portanto muito provavelmente seraacute um dos candidatos eleitos eacute possiacutevelque ele arrisque votar em uma segunda opccedilatildeo sua na esperanccedila de a longo prazo elegersuas duas principais opccedilotildees de voto Com os eleitores podendo votar no nuacutemero exato devagas disponiacuteveis esse tipo de pensamento taacutetico perde o sentido

                                                        30

                                                        3 O SIMULADOR

                                                        Para este trabalho foi implementado um simulador eleitoral na forma de uma aplicaccedilatildeoweb para que a interaccedilatildeo do usuaacuterio fosse facilitada Veremos a seguir como se daacute suautilizaccedilatildeo de forma geral

                                                        Figura 2 ndash Captura de tela 1

                                                        Figura 3 ndash Captura de tela 2

                                                        A primeira opccedilatildeo encontrada pelo usuaacuterio eacute a escolha de quais sistemas de votaccedilatildeo se-ratildeo simulados (Figura 2) Todos eles podem ser selecionados para rodar simultaneamentePoreacutem natildeo eacute permitido rodar uma simulaccedilatildeo do Bloc Vote para uma eleiccedilatildeo onde apenasum candidato eacute eleito aleacutem disso natildeo existe implementaccedilatildeo dos meacutetodos TRS e IRV para

                                                        31

                                                        eleiccedilotildees com mais de um candidato eleito jaacute que eles se comportariam exatamente comono FPTP

                                                        A maioria das linguagens de programaccedilatildeo senatildeo todas possuem um gerador de nuacuteme-ros pseudoaleatoacuterios que fornece a possibilidade de definir uma seed para o gerador Estaseed funciona como um ponto de partida para a geraccedilatildeo dos nuacutemero e portanto todasimulaccedilatildeo que rodar com a mesma seed sempre teraacute os mesmos resultados Se nenhumvalor for fornecido pelo usuaacuterio o tempo atual do sistema eacute utilizado As opccedilotildees subse-quentes satildeo a escolha do nuacutemero de eleitores gerados e o nuacutemero de vagas (Figura 3) Senenhum valor for fornecido o nuacutemero de eleitores padratildeo utilizado eacute 1000 e o nuacutemero devagas igual a 1

                                                        Figura 4 ndash Captura de tela 3

                                                        Este simulador possui dois modos para a criaccedilatildeo dos rankings dos eleitores No modoManipulate (Figura 4) primeiramente se define o nuacutemero de candidatos atraveacutes do campode entrada ao lado do tiacutetulo Candidates ou alternativamente pode-se adicionar candida-tos um a um atraveacutes do sinal de mais na parte inferior da paacutegina Para cada candidatoeacute possiacutevel definir a porcentagem de seus eleitores que optaraacute pelo voto taacutetico e pelovoto de minoria Tambeacutem eacute possiacutevel alterar o nome dos candidatos se for do interessedo usuaacuterio

                                                        32

                                                        Figura 5 ndash Captura de tela 4

                                                        Figura 6 ndash Captura de tela 5

                                                        33

                                                        Figura 7 ndash Captura de tela 6

                                                        Apoacutes a criaccedilatildeo dos candidatos o usuaacuterio pode criar perfis de eleitores que definiratildeo demaneira exata como partes da populaccedilatildeo iraacute votar (Figura 5) Em cada perfil se defineo valor em porcentos da populaccedilatildeo votante que o adotaraacute e a nota de cada candidatoTambeacutem eacute possiacutevel nomear cada perfil livremente

                                                        No modo Generate (Figura 6) eacute onde o gerador de nuacutemeros pseudoaleatoacuterios eacute usadoNesse modo ao inveacutes do usuaacuterio criar perfis de eleitores ele define qual seraacute a distribuiccedilatildeoadotada para a geraccedilatildeo de notas de cada candidato Essas distribuiccedilotildees seratildeo mais bemdetalhadas no Capiacutetulo 5 Da mesma maneira que no modo Manipulate nesse modotambeacutem eacute possiacutevel definir os valores para os dois tipos de voto uacutetil os votos taacuteticos eos votos de minoria No primeiro estatildeo incluiacutedas as estrateacutegias de mudanccedila de votoespeciacuteficas de cada sistema como o bullet voting no AVS e SVS ou quando a preferecircnciade um eleitor claramente natildeo possui chances de vitoacuteria e ele muda seu voto para um doscandidatos que esteja na lideranccedila o que ocorre no FPTP e TRS O voto de minoriase apresenta apenas no FPTP em eleiccedilotildees onde mais de um candidato eacute eleito Se apreferecircncia de um eleitor claramente lidera a eleiccedilatildeo por ser tambeacutem a preferecircncia damaior parte da populaccedilatildeo esse eleitor pode mudar o seu voto para uma segunda opccedilatildeona esperanccedila de eleger dois de seus candidatos favoritos

                                                        Por fim em ambos os modos o usuaacuterio tem a opccedilatildeo de definir coalizotildees entre oscandidatos se o sistema TRS estiver habilitado pois as coalizotildees apenas se manifestamnesse sistema Essas coalizotildees alteraratildeo as notas dos candidatos dependendo dos outroscandidatos pertencentes a elas (Figura 7)

                                                        A aplicaccedilatildeo pode ser encontrada na paacutegina httpelectionsimpythonanywherecom

                                                        34

                                                        4 CENAacuteRIOS PERTINENTES

                                                        Para todos os cenaacuterios deste capiacutetulo seraacute usada a seed do simulador igual a 100 e apopulaccedilatildeo de eleitores igual a 1000 para que exista consistecircncia na anaacutelise e tambeacutem paraque possa haver replicaccedilatildeo dos resultados se necessaacuterio

                                                        41 CENAacuteRIO 1 VOTO TAacuteTICO

                                                        Neste exemplo teremos quatro candidatos Ana Beto Carla e Diego Ana e Betoseratildeo gerados a partir da distribuiccedilatildeo Neutral (Figura 47) Carla da distribuiccedilatildeo Disliked(Figura 51) e Diego da Hated (Figura 55) Para a simulaccedilatildeo com a seed 100 o melhorcandidato a ser eleito ou seja aquele que maximiza a meacutedia das notas dos eleitores eacute oBeto com uma meacutedia de 0073 Para cada sistema seratildeo comparados os resultados semvoto taacutetico aos com 20 de voto taacutetico a favor da Ana Abaixo se encontram osresultados para o sistema FPTP

                                                        Figura 8 ndash FPTP - Cenaacuterio 1 sem voto taacutetico

                                                        Figura 9 ndash TRS segundo turno - Cenaacuterio 1 sem voto taacutetico

                                                        35

                                                        Figura 10 ndash IRV primeiro turno - Cenaacuterio 1

                                                        Figura 11 ndash IRV segundo turno - Cenaacuterio 1

                                                        Figura 12 ndash IRV terceiro turno - Cenaacuterio 1

                                                        36

                                                        Figura 13 ndash AVS - Cenaacuterio 1 sem voto taacutetico

                                                        Figura 14 ndash BC - Cenaacuterio 1 sem voto taacutetico

                                                        Figura 15 ndash SVS - Cenaacuterio 1 sem voto taacutetico

                                                        37

                                                        Nesse cenaacuterio sem voto taacutetico o uacutenico sistema que natildeo elege o Beto eacute o AVS Todosos outros elegem o melhor candidato Ou seja apesar de Beto ter uma melhor meacutediadas notas dos eleitores existem mais eleitores que ranqueiam Ana com uma nota acimade 0 No entanto apenas 20 dos eleitores de Diego e Carla que preferem a Ana aoinveacutes do Beto satildeo o suficiente para fazer Beto natildeo ser eleito se eles decidirem abandonarsua primeira opccedilatildeo e votar na Ana Considerando a vantagem que os votos taacuteticosproporcionam agrave Ana esta eacute eleita em todos os sistemas menos o TRS e o IRV

                                                        Figura 16 ndash FPTP - Cenaacuterio 1 - 20 de voto taacutetico na Ana

                                                        Figura 17 ndash TRS segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                        38

                                                        Figura 18 ndash IRV primeiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                        Figura 19 ndash IRV segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                        Figura 20 ndash IRV terceiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                        39

                                                        Figura 21 ndash AVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                        Figura 22 ndash BC - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                        Figura 23 ndash SVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                        40

                                                        Eacute claro que se os eleitores que preferem o Beto tambeacutem votassem de maneira estra-teacutegica a situaccedilatildeo se equilibraria e haveria o mesmo niacutevel de concorrecircncia entre os doiscandidatos que ocorre quando natildeo haacute voto taacutetico Poreacutem no Borda Count esse equiliacute-brio pode natildeo acontecer e as estrateacutegias de compromising e burying podem acabar saindopela culatra se uma porcentagem elevada dos eleitores as adotarem Abaixo encontram-seos resultados para esse sistema quando 100 dos eleitores de Carla e Diego se comportammaliciosamente

                                                        Figura 24 ndash BC - Cenaacuterio 1 100 de voto taacutetico na Ana e Beto

                                                        Por causa do uso demasiado da estrateacutegia burying Ana e Beto perdem muitos pontose isso abre espaccedilo para uma vitoacuteria da Carla No entanto para porcentagens menores que100 o Beto ainda eacute o vencedor

                                                        Essas duas estrateacutegias tambeacutem foram implementadas nesse simulador para o sistemaIRV e eacute possiacutevel ver como ele eacute resistente a elas Para que seja possiacutevel mudar os resultadosde uma eleiccedilatildeo sob o IRV eacute necessaacuterio mudar a ordem de eliminaccedilatildeo dos candidatos paraque o seu candidato preferido acabe enfrentando um candidato mais fraco nas rodadasfinais Isso natildeo ocorre com compromising e burying No proacuteximo cenaacuterio seraacute analisadacomo eacute possiacutevel modificar os resultados de uma eleiccedilatildeo sob o IRV

                                                        Esses resultados podem ser replicados acessando os linksSem votos taacuteticos lthttpelectionsimpythonanywherecomdirect_res1111110

                                                        --[0021][22Ana2222Beto222022Carla2222Diego22]------100gt

                                                        Com 20 de voto taacutetico lthttpelectionsimpythonanywherecomdirect_res1111110--[0021][22Ana222022Beto2222Carla2222Diego22]1-[02000]---100gt

                                                        Com 100 de voto taacuteticona Ana e Beto lthttpelectionsimpythonanywherecomdirect_res0000100--[0021][22Ana222022Beto222022Carla2222Diego22]1-[101000]---100gt

                                                        41

                                                        42 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV

                                                        Neste cenaacuterio teremos Ana Carla e Beto concorrendo e trecircs perfis distintos que apoiamcada candidato As distribuiccedilotildees de notas dos perfis se encontram na tabela abaixo

                                                        Tabela 12 ndash Distribuiccedilatildeo de notas - Cenaacuterio 2

                                                        Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                        deeleitores

                                                        1 10 5 0 422 0 10 5 303 5 0 10 28

                                                        Com essas distribuiccedilotildees Carla eacute eliminada na primeira rodada e seus 28 de votossatildeo transferidos para a segunda opccedilatildeo de seus eleitores Ana que eacute eleita com 70 dosvotos e uma meacutedia de 56

                                                        Figura 25 ndash IRV primeiro turno - Cenaacuterio 2

                                                        Figura 26 ndash IRV segundo turno - Cenaacuterio 2

                                                        42

                                                        Cientes desse provaacutevel futuro cenaacuterio onde Ana eacute eleita uma pequena parte dos elei-tores de Beto estrategicamente o abandona e decide apoiar Carla na esperanccedila de leva-laao segundo turno contra Ana As novas distribuiccedilotildees de notas se encontram na tabelaabaixo com essa porccedilatildeo de eleitores representada pelo perfil 4

                                                        Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2

                                                        Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                        deeleitores

                                                        1 10 5 0 422 0 10 5 283 5 0 10 284 0 8 10 2

                                                        Essa mudanccedila estrateacutegica de voto altera a ordem de eliminaccedilotildees do sistema com Betosendo o primeiro a ser eliminado Com isso seus votos satildeo naturalmente transferidos paraCarla que derrota Ana no segundo turno com 58 dos votos

                                                        Figura 27 ndash IRV primeiro turno com voto taacutetico - Cenaacuterio 2

                                                        Figura 28 ndash IRV segundo turno com voto taacutetico - Cenaacuterio 2

                                                        43

                                                        Percebendo que a eleiccedilatildeo de Beto natildeo era provaacutevel seus eleitores conseguiram aomenos impedir a eleiccedilatildeo do pior candidato para eles Mas para isso foi necessaacuterio queeles tivessem a informaccedilatildeo de como os outros eleitores votariam Uma aproximaccedilatildeo dessasinformaccedilotildees poderia ser obtida em um cenaacuterio real com poucos candidatos atraveacutes depesquisas eleitorais poreacutem se o nuacutemero de candidatos eacute significativo uma noccedilatildeo completadas distribuiccedilotildees dos rankings dos eleitores se torna muito menos viaacutevel e dificulta aformulaccedilatildeo de estrateacutegias para alterar a ordem em que os candidatos satildeo eliminados

                                                        Esses resultados podem ser replicados acessando os linksSem voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana22

                                                        22Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                        Com voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana

                                                        2222Beto2222Carla22]-----42Voter20Profile2001020520028Voter20Profile2010201020528Voter20Profile202520020102Voter20Profile20302082010100gt

                                                        43 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE

                                                        O interessante dos sistemas IRV e TRS eacute que os resultados do cenaacuterio anterior po-deriam ter sido obtidos ao inveacutes do voto taacutetico pela sua natildeo-monotonicidade Seriapossiacutevel que a Carla derrotasse a Ana no segundo turno atraveacutes do proacuteprio aumento depopularidade da Ana Assumindo que essa popularizaccedilatildeo ocorresse entre os candidatosdo perfil 2 onde 3 passasse a apoiar a Ana ao inveacutes do Beto as novas distribuiccedilotildeesseguiriam a tabela abaixo

                                                        Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                        Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                        deeleitores

                                                        1 10 5 0 452 0 10 5 273 5 0 10 28

                                                        Dessa maneira Beto agora com uma porcentagem dos eleitores menor do que a deCarla seraacute eliminado na primeira rodada e como seus eleitores tecircm a Carla como segundaopccedilatildeo ela receberaacute todos os seus votos e seraacute eleita na segunda rodada As rodadas doIRV podem ser vistas nas figuras 29 e 30

                                                        44

                                                        Figura 29 ndash IRV primeiro turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                        Figura 30 ndash IRV segundo turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                        Tabela 15 ndash Resultados do Cenaacuterio 3Candidato

                                                        eleitoMeacutedia das

                                                        notasAntes da

                                                        popularizaccedilatildeode Ana

                                                        Ana 56

                                                        Apoacutespopularizaccedilatildeo

                                                        de AnaCarla 415

                                                        Os efeitos dessa caracteriacutestica se refletem na satisfaccedilatildeo meacutedia da populaccedilatildeo A Ana eacuteclaramente a melhor candidata e mesmo com o seu ganho de popularidade (ou devido aele) a Carla eacute eleita

                                                        Esses resultados podem ser replicados acessando os linksAntes da popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecom

                                                        direct_res0010000---[22Ana2222Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                        45

                                                        Apoacutes popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana2222Beto2222Carla22]-----45Voter20Profile2001020520027Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                        44 CENAacuteRIO 4 COALIZOtildeES

                                                        O TRS por ser organizado em dois turnos separados normalmente a semanas dedistacircncia um do outro acaba abrindo brecha agrave mudanccedila de opiniatildeo por parte dos eleitorese o desenvolvimento de novas estrateacutegias por parte dos candidatos tais como a coalizatildeocom candidatos jaacute eliminados Com isso em mente nesse cenaacuterio teremos novamenteos quatro candidatos Ana Beto Carla e Diego Os trecircs primeiros seratildeo gerados dadistribuiccedilatildeo Neutral e Diego da distribuiccedilatildeo Disliked

                                                        Figura 31 ndash TRS turno 1 - Cenaacuterio 4

                                                        No TRS normal Ana Beto e Carla possuem com essas distribuiccedilotildees quantidades devotos muito proacuteximas com Beto e Carla indo para o segundo turno Carla estaacute 10 votosatraacutes de Beto e decide aproveitar o espaccedilo de tempo entre os dois turnos para tentaragregar mais votos Com isso Carla se aproxima de Diego e juntos formam uma coalizatildeoNo entanto com sua baixa popularidade Diego acaba ferindo a reputaccedilatildeo de Carla etorna o segundo turno muito mais faacutecil para Beto (Figura 33) Se Carla tivesse buscado osuporte de Ana por outro lado ela se veria vitoriosa no segundo turno e com uma amplavantagem sobre o Beto (Figura 34) Ou ateacute mesmo sem buscar uma coalizatildeo mesmosendo uma corrida apertada Carla teria naturalmente sido eleita (Figura 32)

                                                        Esses resultados podem ser replicados acessando os linksSem coalizotildees lthttpelectionsimpythonanywherecomdirect_res0100000

                                                        --[0002][22Ana222022Beto2222Carla2222Diego22]------100gt

                                                        46

                                                        Figura 32 ndash TRS turno 2 - Cenaacuterio 4

                                                        Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4

                                                        Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4

                                                        47

                                                        Coalizatildeo Carla e Diego lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2203Carla20Diego-100gt

                                                        Coalizatildeo Carla e Ana lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2200Carla20Ana-100gt

                                                        45 CENAacuteRIO 5 DILEMA DO PRISIONEIRO

                                                        Neste cenaacuterio temos uma eleiccedilatildeo de uma vaga com trecircs candidatos concorrentes e trecircsperfis distintos de eleitores que seguiratildeo as seguintes distribuiccedilotildees

                                                        Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5

                                                        Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                        deeleitores

                                                        1 10 -10 5 362 -10 10 5 343 -10 -10 5 30

                                                        Esse contexto nos remete ao notaacutevel dilema do prisioneiro Nele dois prisioneiroscuacutemplices satildeo interrogados individualmente sem poder se comunicar um com o outro ecada um enfrenta o dilema de delatar ou natildeo o seu parceiro Se os dois prisioneirosdecidem se manter calados sobre o crime ambos satildeo sentenciados a um ano de prisatildeo Seapenas um deles dedurar o outro o traidor sai livre enquanto seu parceiro eacute condenadoa trecircs anos Se ambos dedurarem um ao outro eles satildeo condenados juntos a dois anosde prisatildeo Esse dilema eacute uma ideia claacutessica presente no estudo da teoria dos jogos sendooriginalmente elaborada por Merrill Flood e Melvin Dresher em 1950 e mais tarde sendonomeada de dilema dos prisioneiros por Albert W Tucker (POUNDSTONE 1992)

                                                        O que esse dilema nos mostra eacute a tentaccedilatildeo que o indiviacuteduo deteacutem se sua racionalizaccedilatildeoestiver voltada para seus proacuteprios interesses e somente eles em oposiccedilatildeo a pensar no bemdo grupo como um todo Neste cenaacuterio encontramos dois grupos de eleitores expressiva-mente opostos os perfis 1 e 2 Se qualquer uma das preferecircncias desses perfis fosse eleitaisso significaria uma alta rejeiccedilatildeo de maior parte da populaccedilatildeo No entanto eles possuema segunda opccedilatildeo em comum a Carla que por sua vez eacute a preferecircncia do terceiro perfilPortanto a eleiccedilatildeo da Carla seria logicamente o resultado oacutetimo

                                                        Mesmo assim a Ana eacute eleita nos dois sistemas acima o que natildeo parece justo poispela tabela 16 eacute evidente que apenas 36 da populaccedilatildeo a aprova enquanto que os outros64 a reprovam ao maacuteximo O sistema IRV se comporta de maneira idecircntica ao TRS

                                                        48

                                                        Figura 35 ndash FPTP - Cenaacuterio 5

                                                        Figura 36 ndash TRS segundo turno - Cenaacuterio 5

                                                        nesta situaccedilatildeo Com esse resultado a meacutedia das notas eacute -28 No entanto os trecircs sistemasseguintes nos apresentam resultados diferentes

                                                        Tabela 17 ndash Resultados do Cenaacuterio 5

                                                        Sistema Candidatoeleito

                                                        Meacutedia dasnotas

                                                        FPTP Ana -28TRS Ana -28IRV Ana -28AVS Carla 50BC Carla 50SVS Carla 50

                                                        49

                                                        Figura 37 ndash AVS - Cenaacuterio 5

                                                        Figura 38 ndash BC - Cenaacuterio 5

                                                        Tanto o AVS quanto o Borda Count e o SVS satildeo sistemas que consideram todasas opiniotildees de cada eleitor ao mesmo tempo e por isso satildeo capazes de eleger o melhorcandidato nesta situaccedilatildeo diferentemente do TRS que natildeo absorve completamente todosentimento do eleitor por todos os candidatos e o IRV que apesar de ser bem expressivoquebra esse processo em inuacutemeras rodadas o que permite a perda de informaccedilatildeo ao longodelas

                                                        Esses resultados podem ser replicados acessando o linklthttpelectionsimpythonanywherecomdirect_res1111110---[22Ana

                                                        222022Beto222022Carla22]-----36Voter20Profile2001020-1020534Voter20Profile201-10201020530Voter20Profile202-1020-10205100gt

                                                        50

                                                        Figura 39 ndash SVS - Cenaacuterio 5

                                                        46 CENAacuteRIO 6 VOTO DE MINORIA

                                                        Neste cenaacuterio temos uma eleiccedilatildeo com quatro candidatos e duas vagas A Ana seraacutea preferecircncia de uma extensa parte da populaccedilatildeo (distribuiccedilatildeo Loved Figura 53) Betoe Carla seratildeo candidatos razoavelmente populares (distribuiccedilatildeo Neutral Figura 47) eDiego seraacute a preferecircncia de apenas um pequeno grupo especiacutefico e rejeitado pela maioria(distribuiccedilatildeo Disliked Figura 51) Eacute intuitivo esperar que os dois candidatos eleitos seratildeoa Ana e ou o Beto ou a Carla e isso eacute exatamente o que ocorre na figura 40 no sistemaFPTP sem voto de minoria

                                                        Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria

                                                        Eacute evidente a discrepacircncia da quantidade de votos da Ana para os outros candidatose apesar de Beto e Carla serem mais populares que Diego os trecircs natildeo se encontrammuito afastados Poreacutem se a pequena fraccedilatildeo de candidatos que possuem a Ana como

                                                        51

                                                        Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego

                                                        preferecircncia e Diego como segunda opccedilatildeo optarem pelo voto de minoria a situaccedilatildeo mudacompletamente (Figura 41) Assim apesar de extensamente rejeitado Diego conquistaa segunda vaga e a meacutedia das notas despenca de 2929 para 0505 No entanto aindaexiste um cenaacuterio pior Se os outros grupos de eleitores pensarem da mesma forma eevitarem votar na Ana achando que sua eleiccedilatildeo jaacute estaacute assegurada apenas 80 de votode minoria para esses grupos jaacute eacute o suficiente para eliminaacute-la das eleiccedilotildees (Figura 42)Com a Ana eliminada a meacutedia das notas cai ainda mais para 0058

                                                        Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego

                                                        O sistema Bloc Vote eacute uma das soluccedilotildees para o voto de minoria Permitindo queos eleitores votem no mesmo nuacutemero de candidatos que de vagas a serem preenchidasnatildeo existe o iacutempeto a esse tipo de voto estrateacutegico O resultado desse sistema portantoretorna a meacutedia das notas a casa dos 29 (Figura 43) Os sistemas AVS Borda Count eSVS tambeacutem impedem a presenccedila do voto de minoria e atingem resultados semelhantes

                                                        52

                                                        Figura 43 ndash BV - Cenaacuterio 6

                                                        Tabela 18 ndash Resultados do Cenaacuterio 6

                                                        Sistema Candidatoseleitos

                                                        Meacutedia dasnotas

                                                        FPTP sem voto de minoriaAna eBeto 2929

                                                        FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

                                                        FPTP com 80 de voto de minoriaBeto eCarla 0058

                                                        Bloc VoteAna eCarla 2913

                                                        Esses resultados podem ser replicados acessando os links

                                                        Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

                                                        100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

                                                        80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

                                                        53

                                                        5 COMO FUNCIONA O SIMULADOR

                                                        O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

                                                        51 CLASSE ELECTIONS

                                                        Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

                                                        bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

                                                        Figura 44 ndash estrutura candidates

                                                        bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

                                                        bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

                                                        Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

                                                        Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

                                                        54

                                                        Figura 45 ndash estrutura voters

                                                        Figura 46 ndash estrutura votes

                                                        daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

                                                        Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

                                                        55

                                                        Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

                                                        Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

                                                        na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

                                                        56

                                                        Figura 49 ndash PDF - Distribuiccedilatildeo Liked

                                                        Figura 50 ndash CDF - Distribuiccedilatildeo Liked

                                                        (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

                                                        Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

                                                        57

                                                        Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

                                                        Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

                                                        candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

                                                        Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

                                                        58

                                                        Figura 53 ndash PDF - Distribuiccedilatildeo Loved

                                                        Figura 54 ndash CDF - Distribuiccedilatildeo Loved

                                                        funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

                                                        59

                                                        Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                                                        Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                                                        Meacutedia das Notas sumei

                                                        sumvj nij

                                                        etimes v

                                                        Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                                                        Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                                                        60

                                                        Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                                                        Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                                                        52 CLASSE FIRSTPASTTHEPOST

                                                        Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                                                        Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                                                        61

                                                        Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                                                        Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                                                        mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                                                        62

                                                        53 CLASSE TWOROUNDSYSTEM

                                                        A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                                                        54 CLASSE INSTANTRUNOFFVOTING

                                                        A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                                                        Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                                                        63

                                                        cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                                                        55 CLASSE APPROVALVOTING

                                                        Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                                                        56 CLASSE BORDACOUNT

                                                        Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                                                        57 CLASSE SCOREVOTING

                                                        De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                                                        64

                                                        58 CLASSE BLOCVOTE

                                                        O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                                                        59 TECNOLOGIAS UTILIZADAS

                                                        A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                                                        Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                                                        O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                                                        Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                                                        65

                                                        6 CONCLUSAtildeO

                                                        Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                                                        Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                                                        Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                                                        Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                                                        Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                                                        66

                                                        REFEREcircNCIAS

                                                        AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                                                        Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                                                        Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                                                        Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                                                        HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                                                        LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                                                        ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                                                        Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                                                        POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                                                        The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                                                        67

                                                        APEcircNDICES

                                                        APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                                        Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                                        if(not len(selfvoter_profiles))

                                                        for voter in range(selfN_VOTERS)

                                                        candidates_rank = dict()

                                                        for candidate in reversed(range(selfN_CANDIDATES))

                                                        if(selfBIAS_VECTOR[candidate]==4)

                                                        candidates_rank[candidate] = self_sortear(selfloved)

                                                        elif(selfBIAS_VECTOR[candidate]==3)

                                                        candidates_rank[candidate] = self_sortear(selfliked)

                                                        elif(selfBIAS_VECTOR[candidate]==2)

                                                        candidates_rank[candidate] = self_sortear(selfdisliked)

                                                        elif(selfBIAS_VECTOR[candidate]==1)

                                                        candidates_rank[candidate] = self_sortear(selfhated)

                                                        elif(selfBIAS_VECTOR[candidate]==-1)

                                                        candidates_rank[candidate] = self_sortear(selfpolarizer

                                                        )

                                                        elif(selfBIAS_VECTOR[candidate]==-2)

                                                        candidates_rank[candidate] = self_sortear(self

                                                        more_polarizer)

                                                        else

                                                        candidates_rank[candidate] = self_sortear(selfneutral)

                                                        selfvotersappend(candidates_rank)

                                                        else

                                                        ranges = []

                                                        ranks = []

                                                        for prof in selfvoter_profiles

                                                        rangesappend(int(prof[pop_percentage]))

                                                        rank =

                                                        for index score in enumerate(prof[scores])

                                                        rank[index] = score

                                                        ranksappend(rank)

                                                        for index _range in enumerate(ranges)

                                                        for _ in range(int(selfN_VOTERS(_range100)))

                                                        selfvotersappend(ranks[index])

                                                        68

                                                        APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                                        Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                                        for i in range(selfN_CANDIDATES)

                                                        selfcandidates[i] = 0

                                                        selfvotes[i] = set()

                                                        APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                                        Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                                        for candidate in range(selfN_CANDIDATES)

                                                        rating_sum = 0

                                                        for voter in selfvoters

                                                        rating_sum += voter[candidate]

                                                        selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                                        APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                                        Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                                        if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                                        return selfcalculate_mean(winners)

                                                        else

                                                        chose_best = True if winners[0] == selfbest_candidate else

                                                        False

                                                        return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                                        69

                                                        APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                                        Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                                        rating_sum = 0

                                                        for voter in selfvoters

                                                        for candidate in winners

                                                        rating_sum += voter[candidate]

                                                        return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                                        APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                                        Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                                        for i in range(1 selfN_VACANCIES + 2)

                                                        selfleading_candidatesappend(selfsorted_candidates[-i][self

                                                        CANDIDATE_INDEX])

                                                        APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                                        Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                                        for leader in selfelecrounds[-1]

                                                        selfleading_candidatesappend(leader[0])

                                                        70

                                                        APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                                        Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                                        self_account_for_coalitions()

                                                        for voter in selfvoters

                                                        selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                                        (1)))

                                                        temp = []

                                                        for voter in selfsorted_voters

                                                        new_dict = defaultdict(list)

                                                        for k in voter

                                                        new_dict[k[1]]append(k[0])

                                                        tempappend(new_dict)

                                                        selfsorted_voters = []

                                                        for voter_index current_voter in enumerate(temp)

                                                        new_voter = []

                                                        for rating candidate_indexes in current_voteritems()

                                                        if len(current_voter[rating]) gt 1

                                                        shuffle(current_voter[rating])

                                                        for e in candidate_indexes

                                                        new_voterappend((e rating))

                                                        else

                                                        new_voterappend((candidate_indexes[0] rating))

                                                        selfsorted_votersappend(new_voter)

                                                        selfcandidates[new_voter[-1][0]] += 1

                                                        selfvotes[new_voter[-1][0]]add(voter_index)

                                                        71

                                                        APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                                        Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                                        for candidate in selfvotes_copy

                                                        if candidate not in selfelecleading_candidates

                                                        for voter_index in selfvotes_copy[candidate]

                                                        for index _candidate in enumerate(reversed(selfelec

                                                        sorted_voters[voter_index]))

                                                        if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                                        leading_candidates

                                                        if randomrandom() lt selfelec

                                                        tactical_vote_percentages[_candidate[selfelec

                                                        CANDIDATE_INDEX]]

                                                        selfrankings_changed[voter_index] = copy

                                                        deepcopy(selfelecsorted_voters[voter_index])

                                                        selfrankings_changed[voter_index][-(index + 1)]

                                                        selfrankings_changed[voter_index][-1] = self

                                                        rankings_changed[voter_index][-1] self

                                                        rankings_changed[voter_index][-(index + 1)]

                                                        selfcandidates[candidate] -= 1

                                                        selfcandidates[_candidate[selfelec

                                                        CANDIDATE_INDEX]] += 1

                                                        selfvotes[candidate]remove(voter_index)

                                                        selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                                        ]]add(voter_index)

                                                        break

                                                        break

                                                        72

                                                        APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                                        Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                                        half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                                        for candidate in selfelecleading_candidates

                                                        if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                                        continue

                                                        for voter_index in selfvotes_copy[candidate]

                                                        if voter_index in selfrankings_changed

                                                        ranking = selfrankings_changed[voter_index]

                                                        else

                                                        ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                                        ])

                                                        for index _candidate in enumerate(reversed(ranking))

                                                        if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                        leading_candidates or (_candidate[selfelec

                                                        CANDIDATE_INDEX] in selfelecleading_candidates and

                                                        selfelecleading_candidatesindex(_candidate[selfelec

                                                        CANDIDATE_INDEX]) gt= half_vacancies)

                                                        if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                                        if randomrandom() lt selfelec

                                                        minority_vote_percentages[_candidate[selfelec

                                                        CANDIDATE_INDEX]]

                                                        selfcandidates[candidate] -= 1

                                                        selfcandidates[_candidate[selfelec

                                                        CANDIDATE_INDEX]] += 1

                                                        break

                                                        break

                                                        break

                                                        73

                                                        APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                                        Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                                        self_account_for_coalitions()

                                                        for candidate in selfvotes

                                                        if candidate = selfwinner and candidate = selfsecond_place

                                                        for voter_index in selfvotes[candidate]

                                                        if voter_index in selfrankings_changed

                                                        ranking = selfrankings_changed[voter_index]

                                                        else

                                                        ranking = copydeepcopy(selfelecsorted_voters[

                                                        voter_index])

                                                        for index2 candidate in enumerate(reversed(ranking))

                                                        if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                                        selfcandidates[selfwinner] += 1

                                                        selfvotes[selfwinner]add(voter_index)

                                                        break

                                                        elif candidate[selfelecCANDIDATE_INDEX] == self

                                                        second_place

                                                        selfcandidates[selfsecond_place] += 1

                                                        selfvotes[selfsecond_place]add(voter_index)

                                                        break

                                                        selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                        winners = []

                                                        vacancies = selfelecN_VACANCIES

                                                        for candidate in reversed(selfsorted_candidates)

                                                        if vacancies == 0

                                                        break

                                                        winnersappend(candidate[0])

                                                        vacancies -= 1

                                                        mean chose_best = selfelecget_mean(winners = winners)

                                                        74

                                                        APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                                        Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                                        for voter_index voter in enumerate(selfelecsorted_voters)

                                                        voter_dict = dict()

                                                        og_voter_dict = dict()

                                                        for tup in voter

                                                        voter_dict[tup[0]] = tup[1]

                                                        og_voter_dict[tup[0]] = tup[1]

                                                        for coalition in selfeleccoalitions

                                                        for candidate in coalition

                                                        add_to_score = 0

                                                        for candidate2 in coalition

                                                        if candidate == candidate2

                                                        continue

                                                        half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                                        if half lt 0

                                                        add_to_score += mathceil(half)

                                                        else

                                                        add_to_score += mathfloor(half)

                                                        if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                                        voter_dict[candidate[rsquovaluersquo]] = 10

                                                        elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                                        voter_dict[candidate[rsquovaluersquo]] = -10

                                                        else

                                                        voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                                        selfrankings_changed[voter_index] = []

                                                        for candidate in voter_dict

                                                        selfrankings_changed[voter_index]append((candidate voter_dict[

                                                        candidate]))

                                                        selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                                        voter_index] key=lambda x x[1])

                                                        75

                                                        APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                        Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                        selfelecroundsappend(selfsorted_candidates[_round])

                                                        if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                        N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                        N_VACANCIES - 1)

                                                        return 2

                                                        elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                        N_VOTERS gt 05)

                                                        return 1

                                                        else

                                                        selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                        CANDIDATE_INDEX])

                                                        for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                        elecCANDIDATE_INDEX]]

                                                        if voter_index in selfrankings_changed

                                                        for candidate in reversed(selfrankings_changed[voter_index

                                                        ])

                                                        if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                        excluded

                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                        ]] += 1

                                                        selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                        add(voter_index)

                                                        break

                                                        else

                                                        continue

                                                        else

                                                        for candidate in reversed(selfelecsorted_voters[

                                                        voter_index])

                                                        if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                        excluded

                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                        ]] += 1

                                                        selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                        add(voter_index)

                                                        break

                                                        else

                                                        continue

                                                        selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                        return 0

                                                        76

                                                        APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                        Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                        for index in range(selfelecN_CANDIDATES)

                                                        selfcandidates[index] = 0

                                                        for voter in selfelecsorted_voters

                                                        for candidate in reversed(voter)

                                                        if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                        else

                                                        break

                                                        APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                        Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                        for index in range(selfelecN_CANDIDATES)

                                                        selfcandidates[index] = 0

                                                        for voter in selfelecsorted_voters

                                                        if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                        elecCANDIDATE_INDEX]]

                                                        selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                        else

                                                        for candidate in reversed(voter)

                                                        if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                        else

                                                        break

                                                        77

                                                        APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                        Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                        pos = set()

                                                        for index perc in enumerate(selfelectactical_vote_percentages)

                                                        if perc gt 0

                                                        posadd(index)

                                                        for candidate in selfeleccandidates

                                                        if candidate not in selfleading_candidates

                                                        for voter_index in selfvotes[candidate]

                                                        raised = None

                                                        for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                        ])

                                                        if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                        leading_candidates

                                                        if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                        if randomrandom() lt selfelectactical_vote_percentages[

                                                        candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                        ranking = [None]selfelecN_CANDIDATES

                                                        ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                        selfelecvoters[voter_index][candidate_tuple[selfelec

                                                        CANDIDATE_INDEX]])

                                                        raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                        break

                                                        break

                                                        break

                                                        if raised = None

                                                        for _candidate in selfleading_candidates

                                                        if _candidate = ranking[-1][0]

                                                        ranking[0] = (_candidate selfelecvoters[voter_index][

                                                        _candidate])

                                                        buried = _candidate

                                                        break

                                                        i = 1

                                                        for candidate_tuple in selfelecsorted_voters[voter_index]

                                                        if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                        buried]

                                                        continue

                                                        else

                                                        ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                        selfelecvoters[voter_index][candidate_tuple[selfelec

                                                        CANDIDATE_INDEX]])

                                                        i += 1

                                                        selfrankings_changed[voter_index] = ranking

                                                        78

                                                        APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                        Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                        for voter_index in selfvotes[candidate]

                                                        if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                        ]

                                                        for _candidate in selfleading_candidates

                                                        if _candidate = candidate

                                                        ranking = [None]selfelecN_CANDIDATES

                                                        ranking[0] = (_candidate selfelecvoters[voter_index][

                                                        _candidate])

                                                        buried = _candidate

                                                        break

                                                        i = 1

                                                        for candidate_tuple in selfelecsorted_voters[voter_index]

                                                        if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                        continue

                                                        else

                                                        ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                        selfelecvoters[voter_index][candidate_tuple[selfelec

                                                        CANDIDATE_INDEX]])

                                                        i += 1

                                                        selfrankings_changed[voter_index] = ranking

                                                        79

                                                        APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                        Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                        for index in range(selfelecN_CANDIDATES)

                                                        selfcandidates[index] = 0

                                                        for voter_index voter in enumerate(selfelecsorted_voters)

                                                        score = 0

                                                        if voter_index in selfrankings_changed

                                                        for candidate in selfrankings_changed[voter_index]

                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                        score += 1

                                                        else

                                                        for candidate in voter

                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                        score += 1

                                                        APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                        Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                        for voter_index voter in enumerate(selfelecsorted_voters)

                                                        if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                        elecCANDIDATE_INDEX]]

                                                        selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                        sorted_voters[voter_index])

                                                        for candidate_index candidate in enumerate(reversed(voter))

                                                        if candidate_index == 0

                                                        selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                        voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                        else

                                                        selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                        voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                        80

                                                        APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                        Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                        for index in range(selfelecN_CANDIDATES)

                                                        selfcandidates[index] = 0

                                                        for voter_index voter in enumerate(selfelecsorted_voters)

                                                        if voter_index in selfrankings_changed

                                                        for candidate in selfrankings_changed[voter_index]

                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                        selfelecCANDIDATE_RANK]

                                                        else

                                                        for candidate in voter

                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                        selfelecCANDIDATE_RANK]

                                                        APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                        Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                        for index in range(selfelecN_CANDIDATES)

                                                        selfcandidates[index] = 0

                                                        for voter in selfelecsorted_voters

                                                        votes = selfelecN_VACANCIES

                                                        for candidate in reversed(voter)

                                                        if votes == 0

                                                        break

                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                        votes -= 1

                                                        • Folha de aprovaccedilatildeo
                                                        • Agradecimentos
                                                        • Epiacutegrafe
                                                        • Resumo
                                                        • Abstract
                                                        • Lista de ilustraccedilotildees
                                                        • Lista de Coacutedigos
                                                        • Lista de tabelas
                                                        • Lista de abreviaturas e siglas
                                                        • Sumaacuterio
                                                        • INTRODUCcedilAtildeO
                                                          • MOTIVACcedilAtildeO E OBJETIVO
                                                          • MEacuteTODO
                                                          • ESTRUTURA
                                                            • SISTEMAS ELEITORAIS
                                                              • FISRT PAST THE POST
                                                                • Exemplo
                                                                • Vantagens e Desvantagens do FPTP
                                                                • Voto Uacutetil no FPTP
                                                                  • TWO-ROUND SYSTEM
                                                                    • Exemplo
                                                                    • Vantagens e Desvantagens do TRS
                                                                    • Voto Uacutetil no TRS
                                                                      • INSTANT-RUNOFF VOTING
                                                                        • Exemplo
                                                                        • Vantagens e Desvantagens do IRV
                                                                        • Voto Uacutetil no IRV
                                                                          • APPROVAL VOTING SYSTEM
                                                                            • Exemplo
                                                                            • Vantagens e Desvantagens do AVS
                                                                            • Voto Uacutetil no AVS
                                                                              • THE BORDA COUNT
                                                                                • Exemplo
                                                                                • Vantagens e Desvantagens do BC
                                                                                • Voto Uacutetil no BC
                                                                                  • SCORE VOTING SYSTEM
                                                                                    • Exemplo
                                                                                    • Vantagens e Desvantagens do SVS
                                                                                    • Voto Uacutetil no SVS
                                                                                      • BLOC VOTE
                                                                                        • Exemplo
                                                                                        • Voto Uacutetil no BV
                                                                                            • O SIMULADOR
                                                                                            • CENAacuteRIOS PERTINENTES
                                                                                              • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                              • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                              • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                              • CENAacuteRIO 4 COALIZOtildeES
                                                                                              • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                              • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                • COMO FUNCIONA O SIMULADOR
                                                                                                  • CLASSE Elections
                                                                                                  • CLASSE FirstPastThePost
                                                                                                  • CLASSE TwoRoundSystem
                                                                                                  • CLASSE InstantRunoffVoting
                                                                                                  • CLASSE ApprovalVoting
                                                                                                  • CLASSE BordaCount
                                                                                                  • CLASSE ScoreVoting
                                                                                                  • CLASSE BlocVote
                                                                                                  • TECNOLOGIAS UTILIZADAS
                                                                                                    • CONCLUSAtildeO
                                                                                                    • Referecircncias
                                                                                                    • Meacutetodo create_voters
                                                                                                    • Meacutetodo create_candidates
                                                                                                    • Meacutetodo calculate_means
                                                                                                    • Meacutetodo get_mean
                                                                                                    • Meacutetodo calculate_mean
                                                                                                    • Meacutetodo set_leading_candidates
                                                                                                    • Meacutetodo irv_set_leading_candidates
                                                                                                    • Meacutetodo sort_ranks
                                                                                                    • Meacutetodo fptp_count_tactical_votes
                                                                                                    • Meacutetodo fptp_count_minority_votes
                                                                                                    • Meacutetodo trs_second_round
                                                                                                    • Meacutetodo trs_account_for_coalitions
                                                                                                    • Meacutetodo irv_count_votes
                                                                                                    • Meacutetodo avs_count_votes
                                                                                                    • Meacutetodo avs_count_votes_with_tactical
                                                                                                    • Meacutetodo irv_apply_tactical_votes
                                                                                                    • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                    • Meacutetodo bc_sum_candidates_scores
                                                                                                    • Meacutetodo svs_apply_tactical_votes
                                                                                                    • Meacutetodo svs_sum_candidates_scores
                                                                                                    • Meacutetodo bv_count_votes

                                                          29

                                                          272 Voto Uacutetil no BV

                                                          Neste sistema eacute possiacutevel que um eleitor evite votar em sua primeira opccedilatildeo quandoeste natildeo tem chances de vitoacuteria e se fazendo isto ele diminuiraacute as chances de algum outrocandidato de seu desgosto ganhar Poreacutem o sistema previne um outro tipo de voto uacutetilEm eleiccedilotildees com mais de uma vaga onde os eleitores soacute podem votar em um candidatose um eleitor sabe que sua primeira opccedilatildeo tambeacutem eacute a primeira opccedilatildeo da maior parteda populaccedilatildeo e portanto muito provavelmente seraacute um dos candidatos eleitos eacute possiacutevelque ele arrisque votar em uma segunda opccedilatildeo sua na esperanccedila de a longo prazo elegersuas duas principais opccedilotildees de voto Com os eleitores podendo votar no nuacutemero exato devagas disponiacuteveis esse tipo de pensamento taacutetico perde o sentido

                                                          30

                                                          3 O SIMULADOR

                                                          Para este trabalho foi implementado um simulador eleitoral na forma de uma aplicaccedilatildeoweb para que a interaccedilatildeo do usuaacuterio fosse facilitada Veremos a seguir como se daacute suautilizaccedilatildeo de forma geral

                                                          Figura 2 ndash Captura de tela 1

                                                          Figura 3 ndash Captura de tela 2

                                                          A primeira opccedilatildeo encontrada pelo usuaacuterio eacute a escolha de quais sistemas de votaccedilatildeo se-ratildeo simulados (Figura 2) Todos eles podem ser selecionados para rodar simultaneamentePoreacutem natildeo eacute permitido rodar uma simulaccedilatildeo do Bloc Vote para uma eleiccedilatildeo onde apenasum candidato eacute eleito aleacutem disso natildeo existe implementaccedilatildeo dos meacutetodos TRS e IRV para

                                                          31

                                                          eleiccedilotildees com mais de um candidato eleito jaacute que eles se comportariam exatamente comono FPTP

                                                          A maioria das linguagens de programaccedilatildeo senatildeo todas possuem um gerador de nuacuteme-ros pseudoaleatoacuterios que fornece a possibilidade de definir uma seed para o gerador Estaseed funciona como um ponto de partida para a geraccedilatildeo dos nuacutemero e portanto todasimulaccedilatildeo que rodar com a mesma seed sempre teraacute os mesmos resultados Se nenhumvalor for fornecido pelo usuaacuterio o tempo atual do sistema eacute utilizado As opccedilotildees subse-quentes satildeo a escolha do nuacutemero de eleitores gerados e o nuacutemero de vagas (Figura 3) Senenhum valor for fornecido o nuacutemero de eleitores padratildeo utilizado eacute 1000 e o nuacutemero devagas igual a 1

                                                          Figura 4 ndash Captura de tela 3

                                                          Este simulador possui dois modos para a criaccedilatildeo dos rankings dos eleitores No modoManipulate (Figura 4) primeiramente se define o nuacutemero de candidatos atraveacutes do campode entrada ao lado do tiacutetulo Candidates ou alternativamente pode-se adicionar candida-tos um a um atraveacutes do sinal de mais na parte inferior da paacutegina Para cada candidatoeacute possiacutevel definir a porcentagem de seus eleitores que optaraacute pelo voto taacutetico e pelovoto de minoria Tambeacutem eacute possiacutevel alterar o nome dos candidatos se for do interessedo usuaacuterio

                                                          32

                                                          Figura 5 ndash Captura de tela 4

                                                          Figura 6 ndash Captura de tela 5

                                                          33

                                                          Figura 7 ndash Captura de tela 6

                                                          Apoacutes a criaccedilatildeo dos candidatos o usuaacuterio pode criar perfis de eleitores que definiratildeo demaneira exata como partes da populaccedilatildeo iraacute votar (Figura 5) Em cada perfil se defineo valor em porcentos da populaccedilatildeo votante que o adotaraacute e a nota de cada candidatoTambeacutem eacute possiacutevel nomear cada perfil livremente

                                                          No modo Generate (Figura 6) eacute onde o gerador de nuacutemeros pseudoaleatoacuterios eacute usadoNesse modo ao inveacutes do usuaacuterio criar perfis de eleitores ele define qual seraacute a distribuiccedilatildeoadotada para a geraccedilatildeo de notas de cada candidato Essas distribuiccedilotildees seratildeo mais bemdetalhadas no Capiacutetulo 5 Da mesma maneira que no modo Manipulate nesse modotambeacutem eacute possiacutevel definir os valores para os dois tipos de voto uacutetil os votos taacuteticos eos votos de minoria No primeiro estatildeo incluiacutedas as estrateacutegias de mudanccedila de votoespeciacuteficas de cada sistema como o bullet voting no AVS e SVS ou quando a preferecircnciade um eleitor claramente natildeo possui chances de vitoacuteria e ele muda seu voto para um doscandidatos que esteja na lideranccedila o que ocorre no FPTP e TRS O voto de minoriase apresenta apenas no FPTP em eleiccedilotildees onde mais de um candidato eacute eleito Se apreferecircncia de um eleitor claramente lidera a eleiccedilatildeo por ser tambeacutem a preferecircncia damaior parte da populaccedilatildeo esse eleitor pode mudar o seu voto para uma segunda opccedilatildeona esperanccedila de eleger dois de seus candidatos favoritos

                                                          Por fim em ambos os modos o usuaacuterio tem a opccedilatildeo de definir coalizotildees entre oscandidatos se o sistema TRS estiver habilitado pois as coalizotildees apenas se manifestamnesse sistema Essas coalizotildees alteraratildeo as notas dos candidatos dependendo dos outroscandidatos pertencentes a elas (Figura 7)

                                                          A aplicaccedilatildeo pode ser encontrada na paacutegina httpelectionsimpythonanywherecom

                                                          34

                                                          4 CENAacuteRIOS PERTINENTES

                                                          Para todos os cenaacuterios deste capiacutetulo seraacute usada a seed do simulador igual a 100 e apopulaccedilatildeo de eleitores igual a 1000 para que exista consistecircncia na anaacutelise e tambeacutem paraque possa haver replicaccedilatildeo dos resultados se necessaacuterio

                                                          41 CENAacuteRIO 1 VOTO TAacuteTICO

                                                          Neste exemplo teremos quatro candidatos Ana Beto Carla e Diego Ana e Betoseratildeo gerados a partir da distribuiccedilatildeo Neutral (Figura 47) Carla da distribuiccedilatildeo Disliked(Figura 51) e Diego da Hated (Figura 55) Para a simulaccedilatildeo com a seed 100 o melhorcandidato a ser eleito ou seja aquele que maximiza a meacutedia das notas dos eleitores eacute oBeto com uma meacutedia de 0073 Para cada sistema seratildeo comparados os resultados semvoto taacutetico aos com 20 de voto taacutetico a favor da Ana Abaixo se encontram osresultados para o sistema FPTP

                                                          Figura 8 ndash FPTP - Cenaacuterio 1 sem voto taacutetico

                                                          Figura 9 ndash TRS segundo turno - Cenaacuterio 1 sem voto taacutetico

                                                          35

                                                          Figura 10 ndash IRV primeiro turno - Cenaacuterio 1

                                                          Figura 11 ndash IRV segundo turno - Cenaacuterio 1

                                                          Figura 12 ndash IRV terceiro turno - Cenaacuterio 1

                                                          36

                                                          Figura 13 ndash AVS - Cenaacuterio 1 sem voto taacutetico

                                                          Figura 14 ndash BC - Cenaacuterio 1 sem voto taacutetico

                                                          Figura 15 ndash SVS - Cenaacuterio 1 sem voto taacutetico

                                                          37

                                                          Nesse cenaacuterio sem voto taacutetico o uacutenico sistema que natildeo elege o Beto eacute o AVS Todosos outros elegem o melhor candidato Ou seja apesar de Beto ter uma melhor meacutediadas notas dos eleitores existem mais eleitores que ranqueiam Ana com uma nota acimade 0 No entanto apenas 20 dos eleitores de Diego e Carla que preferem a Ana aoinveacutes do Beto satildeo o suficiente para fazer Beto natildeo ser eleito se eles decidirem abandonarsua primeira opccedilatildeo e votar na Ana Considerando a vantagem que os votos taacuteticosproporcionam agrave Ana esta eacute eleita em todos os sistemas menos o TRS e o IRV

                                                          Figura 16 ndash FPTP - Cenaacuterio 1 - 20 de voto taacutetico na Ana

                                                          Figura 17 ndash TRS segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                          38

                                                          Figura 18 ndash IRV primeiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                          Figura 19 ndash IRV segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                          Figura 20 ndash IRV terceiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                          39

                                                          Figura 21 ndash AVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                          Figura 22 ndash BC - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                          Figura 23 ndash SVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                          40

                                                          Eacute claro que se os eleitores que preferem o Beto tambeacutem votassem de maneira estra-teacutegica a situaccedilatildeo se equilibraria e haveria o mesmo niacutevel de concorrecircncia entre os doiscandidatos que ocorre quando natildeo haacute voto taacutetico Poreacutem no Borda Count esse equiliacute-brio pode natildeo acontecer e as estrateacutegias de compromising e burying podem acabar saindopela culatra se uma porcentagem elevada dos eleitores as adotarem Abaixo encontram-seos resultados para esse sistema quando 100 dos eleitores de Carla e Diego se comportammaliciosamente

                                                          Figura 24 ndash BC - Cenaacuterio 1 100 de voto taacutetico na Ana e Beto

                                                          Por causa do uso demasiado da estrateacutegia burying Ana e Beto perdem muitos pontose isso abre espaccedilo para uma vitoacuteria da Carla No entanto para porcentagens menores que100 o Beto ainda eacute o vencedor

                                                          Essas duas estrateacutegias tambeacutem foram implementadas nesse simulador para o sistemaIRV e eacute possiacutevel ver como ele eacute resistente a elas Para que seja possiacutevel mudar os resultadosde uma eleiccedilatildeo sob o IRV eacute necessaacuterio mudar a ordem de eliminaccedilatildeo dos candidatos paraque o seu candidato preferido acabe enfrentando um candidato mais fraco nas rodadasfinais Isso natildeo ocorre com compromising e burying No proacuteximo cenaacuterio seraacute analisadacomo eacute possiacutevel modificar os resultados de uma eleiccedilatildeo sob o IRV

                                                          Esses resultados podem ser replicados acessando os linksSem votos taacuteticos lthttpelectionsimpythonanywherecomdirect_res1111110

                                                          --[0021][22Ana2222Beto222022Carla2222Diego22]------100gt

                                                          Com 20 de voto taacutetico lthttpelectionsimpythonanywherecomdirect_res1111110--[0021][22Ana222022Beto2222Carla2222Diego22]1-[02000]---100gt

                                                          Com 100 de voto taacuteticona Ana e Beto lthttpelectionsimpythonanywherecomdirect_res0000100--[0021][22Ana222022Beto222022Carla2222Diego22]1-[101000]---100gt

                                                          41

                                                          42 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV

                                                          Neste cenaacuterio teremos Ana Carla e Beto concorrendo e trecircs perfis distintos que apoiamcada candidato As distribuiccedilotildees de notas dos perfis se encontram na tabela abaixo

                                                          Tabela 12 ndash Distribuiccedilatildeo de notas - Cenaacuterio 2

                                                          Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                          deeleitores

                                                          1 10 5 0 422 0 10 5 303 5 0 10 28

                                                          Com essas distribuiccedilotildees Carla eacute eliminada na primeira rodada e seus 28 de votossatildeo transferidos para a segunda opccedilatildeo de seus eleitores Ana que eacute eleita com 70 dosvotos e uma meacutedia de 56

                                                          Figura 25 ndash IRV primeiro turno - Cenaacuterio 2

                                                          Figura 26 ndash IRV segundo turno - Cenaacuterio 2

                                                          42

                                                          Cientes desse provaacutevel futuro cenaacuterio onde Ana eacute eleita uma pequena parte dos elei-tores de Beto estrategicamente o abandona e decide apoiar Carla na esperanccedila de leva-laao segundo turno contra Ana As novas distribuiccedilotildees de notas se encontram na tabelaabaixo com essa porccedilatildeo de eleitores representada pelo perfil 4

                                                          Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2

                                                          Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                          deeleitores

                                                          1 10 5 0 422 0 10 5 283 5 0 10 284 0 8 10 2

                                                          Essa mudanccedila estrateacutegica de voto altera a ordem de eliminaccedilotildees do sistema com Betosendo o primeiro a ser eliminado Com isso seus votos satildeo naturalmente transferidos paraCarla que derrota Ana no segundo turno com 58 dos votos

                                                          Figura 27 ndash IRV primeiro turno com voto taacutetico - Cenaacuterio 2

                                                          Figura 28 ndash IRV segundo turno com voto taacutetico - Cenaacuterio 2

                                                          43

                                                          Percebendo que a eleiccedilatildeo de Beto natildeo era provaacutevel seus eleitores conseguiram aomenos impedir a eleiccedilatildeo do pior candidato para eles Mas para isso foi necessaacuterio queeles tivessem a informaccedilatildeo de como os outros eleitores votariam Uma aproximaccedilatildeo dessasinformaccedilotildees poderia ser obtida em um cenaacuterio real com poucos candidatos atraveacutes depesquisas eleitorais poreacutem se o nuacutemero de candidatos eacute significativo uma noccedilatildeo completadas distribuiccedilotildees dos rankings dos eleitores se torna muito menos viaacutevel e dificulta aformulaccedilatildeo de estrateacutegias para alterar a ordem em que os candidatos satildeo eliminados

                                                          Esses resultados podem ser replicados acessando os linksSem voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana22

                                                          22Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                          Com voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana

                                                          2222Beto2222Carla22]-----42Voter20Profile2001020520028Voter20Profile2010201020528Voter20Profile202520020102Voter20Profile20302082010100gt

                                                          43 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE

                                                          O interessante dos sistemas IRV e TRS eacute que os resultados do cenaacuterio anterior po-deriam ter sido obtidos ao inveacutes do voto taacutetico pela sua natildeo-monotonicidade Seriapossiacutevel que a Carla derrotasse a Ana no segundo turno atraveacutes do proacuteprio aumento depopularidade da Ana Assumindo que essa popularizaccedilatildeo ocorresse entre os candidatosdo perfil 2 onde 3 passasse a apoiar a Ana ao inveacutes do Beto as novas distribuiccedilotildeesseguiriam a tabela abaixo

                                                          Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                          Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                          deeleitores

                                                          1 10 5 0 452 0 10 5 273 5 0 10 28

                                                          Dessa maneira Beto agora com uma porcentagem dos eleitores menor do que a deCarla seraacute eliminado na primeira rodada e como seus eleitores tecircm a Carla como segundaopccedilatildeo ela receberaacute todos os seus votos e seraacute eleita na segunda rodada As rodadas doIRV podem ser vistas nas figuras 29 e 30

                                                          44

                                                          Figura 29 ndash IRV primeiro turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                          Figura 30 ndash IRV segundo turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                          Tabela 15 ndash Resultados do Cenaacuterio 3Candidato

                                                          eleitoMeacutedia das

                                                          notasAntes da

                                                          popularizaccedilatildeode Ana

                                                          Ana 56

                                                          Apoacutespopularizaccedilatildeo

                                                          de AnaCarla 415

                                                          Os efeitos dessa caracteriacutestica se refletem na satisfaccedilatildeo meacutedia da populaccedilatildeo A Ana eacuteclaramente a melhor candidata e mesmo com o seu ganho de popularidade (ou devido aele) a Carla eacute eleita

                                                          Esses resultados podem ser replicados acessando os linksAntes da popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecom

                                                          direct_res0010000---[22Ana2222Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                          45

                                                          Apoacutes popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana2222Beto2222Carla22]-----45Voter20Profile2001020520027Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                          44 CENAacuteRIO 4 COALIZOtildeES

                                                          O TRS por ser organizado em dois turnos separados normalmente a semanas dedistacircncia um do outro acaba abrindo brecha agrave mudanccedila de opiniatildeo por parte dos eleitorese o desenvolvimento de novas estrateacutegias por parte dos candidatos tais como a coalizatildeocom candidatos jaacute eliminados Com isso em mente nesse cenaacuterio teremos novamenteos quatro candidatos Ana Beto Carla e Diego Os trecircs primeiros seratildeo gerados dadistribuiccedilatildeo Neutral e Diego da distribuiccedilatildeo Disliked

                                                          Figura 31 ndash TRS turno 1 - Cenaacuterio 4

                                                          No TRS normal Ana Beto e Carla possuem com essas distribuiccedilotildees quantidades devotos muito proacuteximas com Beto e Carla indo para o segundo turno Carla estaacute 10 votosatraacutes de Beto e decide aproveitar o espaccedilo de tempo entre os dois turnos para tentaragregar mais votos Com isso Carla se aproxima de Diego e juntos formam uma coalizatildeoNo entanto com sua baixa popularidade Diego acaba ferindo a reputaccedilatildeo de Carla etorna o segundo turno muito mais faacutecil para Beto (Figura 33) Se Carla tivesse buscado osuporte de Ana por outro lado ela se veria vitoriosa no segundo turno e com uma amplavantagem sobre o Beto (Figura 34) Ou ateacute mesmo sem buscar uma coalizatildeo mesmosendo uma corrida apertada Carla teria naturalmente sido eleita (Figura 32)

                                                          Esses resultados podem ser replicados acessando os linksSem coalizotildees lthttpelectionsimpythonanywherecomdirect_res0100000

                                                          --[0002][22Ana222022Beto2222Carla2222Diego22]------100gt

                                                          46

                                                          Figura 32 ndash TRS turno 2 - Cenaacuterio 4

                                                          Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4

                                                          Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4

                                                          47

                                                          Coalizatildeo Carla e Diego lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2203Carla20Diego-100gt

                                                          Coalizatildeo Carla e Ana lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2200Carla20Ana-100gt

                                                          45 CENAacuteRIO 5 DILEMA DO PRISIONEIRO

                                                          Neste cenaacuterio temos uma eleiccedilatildeo de uma vaga com trecircs candidatos concorrentes e trecircsperfis distintos de eleitores que seguiratildeo as seguintes distribuiccedilotildees

                                                          Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5

                                                          Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                          deeleitores

                                                          1 10 -10 5 362 -10 10 5 343 -10 -10 5 30

                                                          Esse contexto nos remete ao notaacutevel dilema do prisioneiro Nele dois prisioneiroscuacutemplices satildeo interrogados individualmente sem poder se comunicar um com o outro ecada um enfrenta o dilema de delatar ou natildeo o seu parceiro Se os dois prisioneirosdecidem se manter calados sobre o crime ambos satildeo sentenciados a um ano de prisatildeo Seapenas um deles dedurar o outro o traidor sai livre enquanto seu parceiro eacute condenadoa trecircs anos Se ambos dedurarem um ao outro eles satildeo condenados juntos a dois anosde prisatildeo Esse dilema eacute uma ideia claacutessica presente no estudo da teoria dos jogos sendooriginalmente elaborada por Merrill Flood e Melvin Dresher em 1950 e mais tarde sendonomeada de dilema dos prisioneiros por Albert W Tucker (POUNDSTONE 1992)

                                                          O que esse dilema nos mostra eacute a tentaccedilatildeo que o indiviacuteduo deteacutem se sua racionalizaccedilatildeoestiver voltada para seus proacuteprios interesses e somente eles em oposiccedilatildeo a pensar no bemdo grupo como um todo Neste cenaacuterio encontramos dois grupos de eleitores expressiva-mente opostos os perfis 1 e 2 Se qualquer uma das preferecircncias desses perfis fosse eleitaisso significaria uma alta rejeiccedilatildeo de maior parte da populaccedilatildeo No entanto eles possuema segunda opccedilatildeo em comum a Carla que por sua vez eacute a preferecircncia do terceiro perfilPortanto a eleiccedilatildeo da Carla seria logicamente o resultado oacutetimo

                                                          Mesmo assim a Ana eacute eleita nos dois sistemas acima o que natildeo parece justo poispela tabela 16 eacute evidente que apenas 36 da populaccedilatildeo a aprova enquanto que os outros64 a reprovam ao maacuteximo O sistema IRV se comporta de maneira idecircntica ao TRS

                                                          48

                                                          Figura 35 ndash FPTP - Cenaacuterio 5

                                                          Figura 36 ndash TRS segundo turno - Cenaacuterio 5

                                                          nesta situaccedilatildeo Com esse resultado a meacutedia das notas eacute -28 No entanto os trecircs sistemasseguintes nos apresentam resultados diferentes

                                                          Tabela 17 ndash Resultados do Cenaacuterio 5

                                                          Sistema Candidatoeleito

                                                          Meacutedia dasnotas

                                                          FPTP Ana -28TRS Ana -28IRV Ana -28AVS Carla 50BC Carla 50SVS Carla 50

                                                          49

                                                          Figura 37 ndash AVS - Cenaacuterio 5

                                                          Figura 38 ndash BC - Cenaacuterio 5

                                                          Tanto o AVS quanto o Borda Count e o SVS satildeo sistemas que consideram todasas opiniotildees de cada eleitor ao mesmo tempo e por isso satildeo capazes de eleger o melhorcandidato nesta situaccedilatildeo diferentemente do TRS que natildeo absorve completamente todosentimento do eleitor por todos os candidatos e o IRV que apesar de ser bem expressivoquebra esse processo em inuacutemeras rodadas o que permite a perda de informaccedilatildeo ao longodelas

                                                          Esses resultados podem ser replicados acessando o linklthttpelectionsimpythonanywherecomdirect_res1111110---[22Ana

                                                          222022Beto222022Carla22]-----36Voter20Profile2001020-1020534Voter20Profile201-10201020530Voter20Profile202-1020-10205100gt

                                                          50

                                                          Figura 39 ndash SVS - Cenaacuterio 5

                                                          46 CENAacuteRIO 6 VOTO DE MINORIA

                                                          Neste cenaacuterio temos uma eleiccedilatildeo com quatro candidatos e duas vagas A Ana seraacutea preferecircncia de uma extensa parte da populaccedilatildeo (distribuiccedilatildeo Loved Figura 53) Betoe Carla seratildeo candidatos razoavelmente populares (distribuiccedilatildeo Neutral Figura 47) eDiego seraacute a preferecircncia de apenas um pequeno grupo especiacutefico e rejeitado pela maioria(distribuiccedilatildeo Disliked Figura 51) Eacute intuitivo esperar que os dois candidatos eleitos seratildeoa Ana e ou o Beto ou a Carla e isso eacute exatamente o que ocorre na figura 40 no sistemaFPTP sem voto de minoria

                                                          Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria

                                                          Eacute evidente a discrepacircncia da quantidade de votos da Ana para os outros candidatose apesar de Beto e Carla serem mais populares que Diego os trecircs natildeo se encontrammuito afastados Poreacutem se a pequena fraccedilatildeo de candidatos que possuem a Ana como

                                                          51

                                                          Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego

                                                          preferecircncia e Diego como segunda opccedilatildeo optarem pelo voto de minoria a situaccedilatildeo mudacompletamente (Figura 41) Assim apesar de extensamente rejeitado Diego conquistaa segunda vaga e a meacutedia das notas despenca de 2929 para 0505 No entanto aindaexiste um cenaacuterio pior Se os outros grupos de eleitores pensarem da mesma forma eevitarem votar na Ana achando que sua eleiccedilatildeo jaacute estaacute assegurada apenas 80 de votode minoria para esses grupos jaacute eacute o suficiente para eliminaacute-la das eleiccedilotildees (Figura 42)Com a Ana eliminada a meacutedia das notas cai ainda mais para 0058

                                                          Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego

                                                          O sistema Bloc Vote eacute uma das soluccedilotildees para o voto de minoria Permitindo queos eleitores votem no mesmo nuacutemero de candidatos que de vagas a serem preenchidasnatildeo existe o iacutempeto a esse tipo de voto estrateacutegico O resultado desse sistema portantoretorna a meacutedia das notas a casa dos 29 (Figura 43) Os sistemas AVS Borda Count eSVS tambeacutem impedem a presenccedila do voto de minoria e atingem resultados semelhantes

                                                          52

                                                          Figura 43 ndash BV - Cenaacuterio 6

                                                          Tabela 18 ndash Resultados do Cenaacuterio 6

                                                          Sistema Candidatoseleitos

                                                          Meacutedia dasnotas

                                                          FPTP sem voto de minoriaAna eBeto 2929

                                                          FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

                                                          FPTP com 80 de voto de minoriaBeto eCarla 0058

                                                          Bloc VoteAna eCarla 2913

                                                          Esses resultados podem ser replicados acessando os links

                                                          Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

                                                          100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

                                                          80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

                                                          53

                                                          5 COMO FUNCIONA O SIMULADOR

                                                          O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

                                                          51 CLASSE ELECTIONS

                                                          Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

                                                          bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

                                                          Figura 44 ndash estrutura candidates

                                                          bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

                                                          bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

                                                          Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

                                                          Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

                                                          54

                                                          Figura 45 ndash estrutura voters

                                                          Figura 46 ndash estrutura votes

                                                          daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

                                                          Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

                                                          55

                                                          Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

                                                          Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

                                                          na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

                                                          56

                                                          Figura 49 ndash PDF - Distribuiccedilatildeo Liked

                                                          Figura 50 ndash CDF - Distribuiccedilatildeo Liked

                                                          (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

                                                          Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

                                                          57

                                                          Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

                                                          Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

                                                          candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

                                                          Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

                                                          58

                                                          Figura 53 ndash PDF - Distribuiccedilatildeo Loved

                                                          Figura 54 ndash CDF - Distribuiccedilatildeo Loved

                                                          funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

                                                          59

                                                          Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                                                          Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                                                          Meacutedia das Notas sumei

                                                          sumvj nij

                                                          etimes v

                                                          Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                                                          Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                                                          60

                                                          Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                                                          Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                                                          52 CLASSE FIRSTPASTTHEPOST

                                                          Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                                                          Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                                                          61

                                                          Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                                                          Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                                                          mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                                                          62

                                                          53 CLASSE TWOROUNDSYSTEM

                                                          A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                                                          54 CLASSE INSTANTRUNOFFVOTING

                                                          A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                                                          Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                                                          63

                                                          cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                                                          55 CLASSE APPROVALVOTING

                                                          Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                                                          56 CLASSE BORDACOUNT

                                                          Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                                                          57 CLASSE SCOREVOTING

                                                          De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                                                          64

                                                          58 CLASSE BLOCVOTE

                                                          O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                                                          59 TECNOLOGIAS UTILIZADAS

                                                          A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                                                          Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                                                          O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                                                          Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                                                          65

                                                          6 CONCLUSAtildeO

                                                          Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                                                          Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                                                          Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                                                          Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                                                          Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                                                          66

                                                          REFEREcircNCIAS

                                                          AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                                                          Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                                                          Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                                                          Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                                                          HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                                                          LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                                                          ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                                                          Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                                                          POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                                                          The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                                                          67

                                                          APEcircNDICES

                                                          APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                                          Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                                          if(not len(selfvoter_profiles))

                                                          for voter in range(selfN_VOTERS)

                                                          candidates_rank = dict()

                                                          for candidate in reversed(range(selfN_CANDIDATES))

                                                          if(selfBIAS_VECTOR[candidate]==4)

                                                          candidates_rank[candidate] = self_sortear(selfloved)

                                                          elif(selfBIAS_VECTOR[candidate]==3)

                                                          candidates_rank[candidate] = self_sortear(selfliked)

                                                          elif(selfBIAS_VECTOR[candidate]==2)

                                                          candidates_rank[candidate] = self_sortear(selfdisliked)

                                                          elif(selfBIAS_VECTOR[candidate]==1)

                                                          candidates_rank[candidate] = self_sortear(selfhated)

                                                          elif(selfBIAS_VECTOR[candidate]==-1)

                                                          candidates_rank[candidate] = self_sortear(selfpolarizer

                                                          )

                                                          elif(selfBIAS_VECTOR[candidate]==-2)

                                                          candidates_rank[candidate] = self_sortear(self

                                                          more_polarizer)

                                                          else

                                                          candidates_rank[candidate] = self_sortear(selfneutral)

                                                          selfvotersappend(candidates_rank)

                                                          else

                                                          ranges = []

                                                          ranks = []

                                                          for prof in selfvoter_profiles

                                                          rangesappend(int(prof[pop_percentage]))

                                                          rank =

                                                          for index score in enumerate(prof[scores])

                                                          rank[index] = score

                                                          ranksappend(rank)

                                                          for index _range in enumerate(ranges)

                                                          for _ in range(int(selfN_VOTERS(_range100)))

                                                          selfvotersappend(ranks[index])

                                                          68

                                                          APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                                          Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                                          for i in range(selfN_CANDIDATES)

                                                          selfcandidates[i] = 0

                                                          selfvotes[i] = set()

                                                          APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                                          Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                                          for candidate in range(selfN_CANDIDATES)

                                                          rating_sum = 0

                                                          for voter in selfvoters

                                                          rating_sum += voter[candidate]

                                                          selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                                          APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                                          Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                                          if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                                          return selfcalculate_mean(winners)

                                                          else

                                                          chose_best = True if winners[0] == selfbest_candidate else

                                                          False

                                                          return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                                          69

                                                          APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                                          Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                                          rating_sum = 0

                                                          for voter in selfvoters

                                                          for candidate in winners

                                                          rating_sum += voter[candidate]

                                                          return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                                          APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                                          Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                                          for i in range(1 selfN_VACANCIES + 2)

                                                          selfleading_candidatesappend(selfsorted_candidates[-i][self

                                                          CANDIDATE_INDEX])

                                                          APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                                          Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                                          for leader in selfelecrounds[-1]

                                                          selfleading_candidatesappend(leader[0])

                                                          70

                                                          APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                                          Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                                          self_account_for_coalitions()

                                                          for voter in selfvoters

                                                          selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                                          (1)))

                                                          temp = []

                                                          for voter in selfsorted_voters

                                                          new_dict = defaultdict(list)

                                                          for k in voter

                                                          new_dict[k[1]]append(k[0])

                                                          tempappend(new_dict)

                                                          selfsorted_voters = []

                                                          for voter_index current_voter in enumerate(temp)

                                                          new_voter = []

                                                          for rating candidate_indexes in current_voteritems()

                                                          if len(current_voter[rating]) gt 1

                                                          shuffle(current_voter[rating])

                                                          for e in candidate_indexes

                                                          new_voterappend((e rating))

                                                          else

                                                          new_voterappend((candidate_indexes[0] rating))

                                                          selfsorted_votersappend(new_voter)

                                                          selfcandidates[new_voter[-1][0]] += 1

                                                          selfvotes[new_voter[-1][0]]add(voter_index)

                                                          71

                                                          APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                                          Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                                          for candidate in selfvotes_copy

                                                          if candidate not in selfelecleading_candidates

                                                          for voter_index in selfvotes_copy[candidate]

                                                          for index _candidate in enumerate(reversed(selfelec

                                                          sorted_voters[voter_index]))

                                                          if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                                          leading_candidates

                                                          if randomrandom() lt selfelec

                                                          tactical_vote_percentages[_candidate[selfelec

                                                          CANDIDATE_INDEX]]

                                                          selfrankings_changed[voter_index] = copy

                                                          deepcopy(selfelecsorted_voters[voter_index])

                                                          selfrankings_changed[voter_index][-(index + 1)]

                                                          selfrankings_changed[voter_index][-1] = self

                                                          rankings_changed[voter_index][-1] self

                                                          rankings_changed[voter_index][-(index + 1)]

                                                          selfcandidates[candidate] -= 1

                                                          selfcandidates[_candidate[selfelec

                                                          CANDIDATE_INDEX]] += 1

                                                          selfvotes[candidate]remove(voter_index)

                                                          selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                                          ]]add(voter_index)

                                                          break

                                                          break

                                                          72

                                                          APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                                          Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                                          half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                                          for candidate in selfelecleading_candidates

                                                          if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                                          continue

                                                          for voter_index in selfvotes_copy[candidate]

                                                          if voter_index in selfrankings_changed

                                                          ranking = selfrankings_changed[voter_index]

                                                          else

                                                          ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                                          ])

                                                          for index _candidate in enumerate(reversed(ranking))

                                                          if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                          leading_candidates or (_candidate[selfelec

                                                          CANDIDATE_INDEX] in selfelecleading_candidates and

                                                          selfelecleading_candidatesindex(_candidate[selfelec

                                                          CANDIDATE_INDEX]) gt= half_vacancies)

                                                          if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                                          if randomrandom() lt selfelec

                                                          minority_vote_percentages[_candidate[selfelec

                                                          CANDIDATE_INDEX]]

                                                          selfcandidates[candidate] -= 1

                                                          selfcandidates[_candidate[selfelec

                                                          CANDIDATE_INDEX]] += 1

                                                          break

                                                          break

                                                          break

                                                          73

                                                          APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                                          Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                                          self_account_for_coalitions()

                                                          for candidate in selfvotes

                                                          if candidate = selfwinner and candidate = selfsecond_place

                                                          for voter_index in selfvotes[candidate]

                                                          if voter_index in selfrankings_changed

                                                          ranking = selfrankings_changed[voter_index]

                                                          else

                                                          ranking = copydeepcopy(selfelecsorted_voters[

                                                          voter_index])

                                                          for index2 candidate in enumerate(reversed(ranking))

                                                          if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                                          selfcandidates[selfwinner] += 1

                                                          selfvotes[selfwinner]add(voter_index)

                                                          break

                                                          elif candidate[selfelecCANDIDATE_INDEX] == self

                                                          second_place

                                                          selfcandidates[selfsecond_place] += 1

                                                          selfvotes[selfsecond_place]add(voter_index)

                                                          break

                                                          selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                          winners = []

                                                          vacancies = selfelecN_VACANCIES

                                                          for candidate in reversed(selfsorted_candidates)

                                                          if vacancies == 0

                                                          break

                                                          winnersappend(candidate[0])

                                                          vacancies -= 1

                                                          mean chose_best = selfelecget_mean(winners = winners)

                                                          74

                                                          APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                                          Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                                          for voter_index voter in enumerate(selfelecsorted_voters)

                                                          voter_dict = dict()

                                                          og_voter_dict = dict()

                                                          for tup in voter

                                                          voter_dict[tup[0]] = tup[1]

                                                          og_voter_dict[tup[0]] = tup[1]

                                                          for coalition in selfeleccoalitions

                                                          for candidate in coalition

                                                          add_to_score = 0

                                                          for candidate2 in coalition

                                                          if candidate == candidate2

                                                          continue

                                                          half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                                          if half lt 0

                                                          add_to_score += mathceil(half)

                                                          else

                                                          add_to_score += mathfloor(half)

                                                          if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                                          voter_dict[candidate[rsquovaluersquo]] = 10

                                                          elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                                          voter_dict[candidate[rsquovaluersquo]] = -10

                                                          else

                                                          voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                                          selfrankings_changed[voter_index] = []

                                                          for candidate in voter_dict

                                                          selfrankings_changed[voter_index]append((candidate voter_dict[

                                                          candidate]))

                                                          selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                                          voter_index] key=lambda x x[1])

                                                          75

                                                          APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                          Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                          selfelecroundsappend(selfsorted_candidates[_round])

                                                          if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                          N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                          N_VACANCIES - 1)

                                                          return 2

                                                          elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                          N_VOTERS gt 05)

                                                          return 1

                                                          else

                                                          selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                          CANDIDATE_INDEX])

                                                          for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                          elecCANDIDATE_INDEX]]

                                                          if voter_index in selfrankings_changed

                                                          for candidate in reversed(selfrankings_changed[voter_index

                                                          ])

                                                          if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                          excluded

                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                          ]] += 1

                                                          selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                          add(voter_index)

                                                          break

                                                          else

                                                          continue

                                                          else

                                                          for candidate in reversed(selfelecsorted_voters[

                                                          voter_index])

                                                          if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                          excluded

                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                          ]] += 1

                                                          selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                          add(voter_index)

                                                          break

                                                          else

                                                          continue

                                                          selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                          return 0

                                                          76

                                                          APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                          Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                          for index in range(selfelecN_CANDIDATES)

                                                          selfcandidates[index] = 0

                                                          for voter in selfelecsorted_voters

                                                          for candidate in reversed(voter)

                                                          if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                          else

                                                          break

                                                          APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                          Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                          for index in range(selfelecN_CANDIDATES)

                                                          selfcandidates[index] = 0

                                                          for voter in selfelecsorted_voters

                                                          if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                          elecCANDIDATE_INDEX]]

                                                          selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                          else

                                                          for candidate in reversed(voter)

                                                          if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                          else

                                                          break

                                                          77

                                                          APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                          Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                          pos = set()

                                                          for index perc in enumerate(selfelectactical_vote_percentages)

                                                          if perc gt 0

                                                          posadd(index)

                                                          for candidate in selfeleccandidates

                                                          if candidate not in selfleading_candidates

                                                          for voter_index in selfvotes[candidate]

                                                          raised = None

                                                          for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                          ])

                                                          if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                          leading_candidates

                                                          if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                          if randomrandom() lt selfelectactical_vote_percentages[

                                                          candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                          ranking = [None]selfelecN_CANDIDATES

                                                          ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                          selfelecvoters[voter_index][candidate_tuple[selfelec

                                                          CANDIDATE_INDEX]])

                                                          raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                          break

                                                          break

                                                          break

                                                          if raised = None

                                                          for _candidate in selfleading_candidates

                                                          if _candidate = ranking[-1][0]

                                                          ranking[0] = (_candidate selfelecvoters[voter_index][

                                                          _candidate])

                                                          buried = _candidate

                                                          break

                                                          i = 1

                                                          for candidate_tuple in selfelecsorted_voters[voter_index]

                                                          if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                          buried]

                                                          continue

                                                          else

                                                          ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                          selfelecvoters[voter_index][candidate_tuple[selfelec

                                                          CANDIDATE_INDEX]])

                                                          i += 1

                                                          selfrankings_changed[voter_index] = ranking

                                                          78

                                                          APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                          Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                          for voter_index in selfvotes[candidate]

                                                          if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                          ]

                                                          for _candidate in selfleading_candidates

                                                          if _candidate = candidate

                                                          ranking = [None]selfelecN_CANDIDATES

                                                          ranking[0] = (_candidate selfelecvoters[voter_index][

                                                          _candidate])

                                                          buried = _candidate

                                                          break

                                                          i = 1

                                                          for candidate_tuple in selfelecsorted_voters[voter_index]

                                                          if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                          continue

                                                          else

                                                          ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                          selfelecvoters[voter_index][candidate_tuple[selfelec

                                                          CANDIDATE_INDEX]])

                                                          i += 1

                                                          selfrankings_changed[voter_index] = ranking

                                                          79

                                                          APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                          Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                          for index in range(selfelecN_CANDIDATES)

                                                          selfcandidates[index] = 0

                                                          for voter_index voter in enumerate(selfelecsorted_voters)

                                                          score = 0

                                                          if voter_index in selfrankings_changed

                                                          for candidate in selfrankings_changed[voter_index]

                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                          score += 1

                                                          else

                                                          for candidate in voter

                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                          score += 1

                                                          APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                          Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                          for voter_index voter in enumerate(selfelecsorted_voters)

                                                          if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                          elecCANDIDATE_INDEX]]

                                                          selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                          sorted_voters[voter_index])

                                                          for candidate_index candidate in enumerate(reversed(voter))

                                                          if candidate_index == 0

                                                          selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                          voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                          else

                                                          selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                          voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                          80

                                                          APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                          Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                          for index in range(selfelecN_CANDIDATES)

                                                          selfcandidates[index] = 0

                                                          for voter_index voter in enumerate(selfelecsorted_voters)

                                                          if voter_index in selfrankings_changed

                                                          for candidate in selfrankings_changed[voter_index]

                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                          selfelecCANDIDATE_RANK]

                                                          else

                                                          for candidate in voter

                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                          selfelecCANDIDATE_RANK]

                                                          APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                          Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                          for index in range(selfelecN_CANDIDATES)

                                                          selfcandidates[index] = 0

                                                          for voter in selfelecsorted_voters

                                                          votes = selfelecN_VACANCIES

                                                          for candidate in reversed(voter)

                                                          if votes == 0

                                                          break

                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                          votes -= 1

                                                          • Folha de aprovaccedilatildeo
                                                          • Agradecimentos
                                                          • Epiacutegrafe
                                                          • Resumo
                                                          • Abstract
                                                          • Lista de ilustraccedilotildees
                                                          • Lista de Coacutedigos
                                                          • Lista de tabelas
                                                          • Lista de abreviaturas e siglas
                                                          • Sumaacuterio
                                                          • INTRODUCcedilAtildeO
                                                            • MOTIVACcedilAtildeO E OBJETIVO
                                                            • MEacuteTODO
                                                            • ESTRUTURA
                                                              • SISTEMAS ELEITORAIS
                                                                • FISRT PAST THE POST
                                                                  • Exemplo
                                                                  • Vantagens e Desvantagens do FPTP
                                                                  • Voto Uacutetil no FPTP
                                                                    • TWO-ROUND SYSTEM
                                                                      • Exemplo
                                                                      • Vantagens e Desvantagens do TRS
                                                                      • Voto Uacutetil no TRS
                                                                        • INSTANT-RUNOFF VOTING
                                                                          • Exemplo
                                                                          • Vantagens e Desvantagens do IRV
                                                                          • Voto Uacutetil no IRV
                                                                            • APPROVAL VOTING SYSTEM
                                                                              • Exemplo
                                                                              • Vantagens e Desvantagens do AVS
                                                                              • Voto Uacutetil no AVS
                                                                                • THE BORDA COUNT
                                                                                  • Exemplo
                                                                                  • Vantagens e Desvantagens do BC
                                                                                  • Voto Uacutetil no BC
                                                                                    • SCORE VOTING SYSTEM
                                                                                      • Exemplo
                                                                                      • Vantagens e Desvantagens do SVS
                                                                                      • Voto Uacutetil no SVS
                                                                                        • BLOC VOTE
                                                                                          • Exemplo
                                                                                          • Voto Uacutetil no BV
                                                                                              • O SIMULADOR
                                                                                              • CENAacuteRIOS PERTINENTES
                                                                                                • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                • CENAacuteRIO 4 COALIZOtildeES
                                                                                                • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                  • COMO FUNCIONA O SIMULADOR
                                                                                                    • CLASSE Elections
                                                                                                    • CLASSE FirstPastThePost
                                                                                                    • CLASSE TwoRoundSystem
                                                                                                    • CLASSE InstantRunoffVoting
                                                                                                    • CLASSE ApprovalVoting
                                                                                                    • CLASSE BordaCount
                                                                                                    • CLASSE ScoreVoting
                                                                                                    • CLASSE BlocVote
                                                                                                    • TECNOLOGIAS UTILIZADAS
                                                                                                      • CONCLUSAtildeO
                                                                                                      • Referecircncias
                                                                                                      • Meacutetodo create_voters
                                                                                                      • Meacutetodo create_candidates
                                                                                                      • Meacutetodo calculate_means
                                                                                                      • Meacutetodo get_mean
                                                                                                      • Meacutetodo calculate_mean
                                                                                                      • Meacutetodo set_leading_candidates
                                                                                                      • Meacutetodo irv_set_leading_candidates
                                                                                                      • Meacutetodo sort_ranks
                                                                                                      • Meacutetodo fptp_count_tactical_votes
                                                                                                      • Meacutetodo fptp_count_minority_votes
                                                                                                      • Meacutetodo trs_second_round
                                                                                                      • Meacutetodo trs_account_for_coalitions
                                                                                                      • Meacutetodo irv_count_votes
                                                                                                      • Meacutetodo avs_count_votes
                                                                                                      • Meacutetodo avs_count_votes_with_tactical
                                                                                                      • Meacutetodo irv_apply_tactical_votes
                                                                                                      • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                      • Meacutetodo bc_sum_candidates_scores
                                                                                                      • Meacutetodo svs_apply_tactical_votes
                                                                                                      • Meacutetodo svs_sum_candidates_scores
                                                                                                      • Meacutetodo bv_count_votes

                                                            30

                                                            3 O SIMULADOR

                                                            Para este trabalho foi implementado um simulador eleitoral na forma de uma aplicaccedilatildeoweb para que a interaccedilatildeo do usuaacuterio fosse facilitada Veremos a seguir como se daacute suautilizaccedilatildeo de forma geral

                                                            Figura 2 ndash Captura de tela 1

                                                            Figura 3 ndash Captura de tela 2

                                                            A primeira opccedilatildeo encontrada pelo usuaacuterio eacute a escolha de quais sistemas de votaccedilatildeo se-ratildeo simulados (Figura 2) Todos eles podem ser selecionados para rodar simultaneamentePoreacutem natildeo eacute permitido rodar uma simulaccedilatildeo do Bloc Vote para uma eleiccedilatildeo onde apenasum candidato eacute eleito aleacutem disso natildeo existe implementaccedilatildeo dos meacutetodos TRS e IRV para

                                                            31

                                                            eleiccedilotildees com mais de um candidato eleito jaacute que eles se comportariam exatamente comono FPTP

                                                            A maioria das linguagens de programaccedilatildeo senatildeo todas possuem um gerador de nuacuteme-ros pseudoaleatoacuterios que fornece a possibilidade de definir uma seed para o gerador Estaseed funciona como um ponto de partida para a geraccedilatildeo dos nuacutemero e portanto todasimulaccedilatildeo que rodar com a mesma seed sempre teraacute os mesmos resultados Se nenhumvalor for fornecido pelo usuaacuterio o tempo atual do sistema eacute utilizado As opccedilotildees subse-quentes satildeo a escolha do nuacutemero de eleitores gerados e o nuacutemero de vagas (Figura 3) Senenhum valor for fornecido o nuacutemero de eleitores padratildeo utilizado eacute 1000 e o nuacutemero devagas igual a 1

                                                            Figura 4 ndash Captura de tela 3

                                                            Este simulador possui dois modos para a criaccedilatildeo dos rankings dos eleitores No modoManipulate (Figura 4) primeiramente se define o nuacutemero de candidatos atraveacutes do campode entrada ao lado do tiacutetulo Candidates ou alternativamente pode-se adicionar candida-tos um a um atraveacutes do sinal de mais na parte inferior da paacutegina Para cada candidatoeacute possiacutevel definir a porcentagem de seus eleitores que optaraacute pelo voto taacutetico e pelovoto de minoria Tambeacutem eacute possiacutevel alterar o nome dos candidatos se for do interessedo usuaacuterio

                                                            32

                                                            Figura 5 ndash Captura de tela 4

                                                            Figura 6 ndash Captura de tela 5

                                                            33

                                                            Figura 7 ndash Captura de tela 6

                                                            Apoacutes a criaccedilatildeo dos candidatos o usuaacuterio pode criar perfis de eleitores que definiratildeo demaneira exata como partes da populaccedilatildeo iraacute votar (Figura 5) Em cada perfil se defineo valor em porcentos da populaccedilatildeo votante que o adotaraacute e a nota de cada candidatoTambeacutem eacute possiacutevel nomear cada perfil livremente

                                                            No modo Generate (Figura 6) eacute onde o gerador de nuacutemeros pseudoaleatoacuterios eacute usadoNesse modo ao inveacutes do usuaacuterio criar perfis de eleitores ele define qual seraacute a distribuiccedilatildeoadotada para a geraccedilatildeo de notas de cada candidato Essas distribuiccedilotildees seratildeo mais bemdetalhadas no Capiacutetulo 5 Da mesma maneira que no modo Manipulate nesse modotambeacutem eacute possiacutevel definir os valores para os dois tipos de voto uacutetil os votos taacuteticos eos votos de minoria No primeiro estatildeo incluiacutedas as estrateacutegias de mudanccedila de votoespeciacuteficas de cada sistema como o bullet voting no AVS e SVS ou quando a preferecircnciade um eleitor claramente natildeo possui chances de vitoacuteria e ele muda seu voto para um doscandidatos que esteja na lideranccedila o que ocorre no FPTP e TRS O voto de minoriase apresenta apenas no FPTP em eleiccedilotildees onde mais de um candidato eacute eleito Se apreferecircncia de um eleitor claramente lidera a eleiccedilatildeo por ser tambeacutem a preferecircncia damaior parte da populaccedilatildeo esse eleitor pode mudar o seu voto para uma segunda opccedilatildeona esperanccedila de eleger dois de seus candidatos favoritos

                                                            Por fim em ambos os modos o usuaacuterio tem a opccedilatildeo de definir coalizotildees entre oscandidatos se o sistema TRS estiver habilitado pois as coalizotildees apenas se manifestamnesse sistema Essas coalizotildees alteraratildeo as notas dos candidatos dependendo dos outroscandidatos pertencentes a elas (Figura 7)

                                                            A aplicaccedilatildeo pode ser encontrada na paacutegina httpelectionsimpythonanywherecom

                                                            34

                                                            4 CENAacuteRIOS PERTINENTES

                                                            Para todos os cenaacuterios deste capiacutetulo seraacute usada a seed do simulador igual a 100 e apopulaccedilatildeo de eleitores igual a 1000 para que exista consistecircncia na anaacutelise e tambeacutem paraque possa haver replicaccedilatildeo dos resultados se necessaacuterio

                                                            41 CENAacuteRIO 1 VOTO TAacuteTICO

                                                            Neste exemplo teremos quatro candidatos Ana Beto Carla e Diego Ana e Betoseratildeo gerados a partir da distribuiccedilatildeo Neutral (Figura 47) Carla da distribuiccedilatildeo Disliked(Figura 51) e Diego da Hated (Figura 55) Para a simulaccedilatildeo com a seed 100 o melhorcandidato a ser eleito ou seja aquele que maximiza a meacutedia das notas dos eleitores eacute oBeto com uma meacutedia de 0073 Para cada sistema seratildeo comparados os resultados semvoto taacutetico aos com 20 de voto taacutetico a favor da Ana Abaixo se encontram osresultados para o sistema FPTP

                                                            Figura 8 ndash FPTP - Cenaacuterio 1 sem voto taacutetico

                                                            Figura 9 ndash TRS segundo turno - Cenaacuterio 1 sem voto taacutetico

                                                            35

                                                            Figura 10 ndash IRV primeiro turno - Cenaacuterio 1

                                                            Figura 11 ndash IRV segundo turno - Cenaacuterio 1

                                                            Figura 12 ndash IRV terceiro turno - Cenaacuterio 1

                                                            36

                                                            Figura 13 ndash AVS - Cenaacuterio 1 sem voto taacutetico

                                                            Figura 14 ndash BC - Cenaacuterio 1 sem voto taacutetico

                                                            Figura 15 ndash SVS - Cenaacuterio 1 sem voto taacutetico

                                                            37

                                                            Nesse cenaacuterio sem voto taacutetico o uacutenico sistema que natildeo elege o Beto eacute o AVS Todosos outros elegem o melhor candidato Ou seja apesar de Beto ter uma melhor meacutediadas notas dos eleitores existem mais eleitores que ranqueiam Ana com uma nota acimade 0 No entanto apenas 20 dos eleitores de Diego e Carla que preferem a Ana aoinveacutes do Beto satildeo o suficiente para fazer Beto natildeo ser eleito se eles decidirem abandonarsua primeira opccedilatildeo e votar na Ana Considerando a vantagem que os votos taacuteticosproporcionam agrave Ana esta eacute eleita em todos os sistemas menos o TRS e o IRV

                                                            Figura 16 ndash FPTP - Cenaacuterio 1 - 20 de voto taacutetico na Ana

                                                            Figura 17 ndash TRS segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                            38

                                                            Figura 18 ndash IRV primeiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                            Figura 19 ndash IRV segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                            Figura 20 ndash IRV terceiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                            39

                                                            Figura 21 ndash AVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                            Figura 22 ndash BC - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                            Figura 23 ndash SVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                            40

                                                            Eacute claro que se os eleitores que preferem o Beto tambeacutem votassem de maneira estra-teacutegica a situaccedilatildeo se equilibraria e haveria o mesmo niacutevel de concorrecircncia entre os doiscandidatos que ocorre quando natildeo haacute voto taacutetico Poreacutem no Borda Count esse equiliacute-brio pode natildeo acontecer e as estrateacutegias de compromising e burying podem acabar saindopela culatra se uma porcentagem elevada dos eleitores as adotarem Abaixo encontram-seos resultados para esse sistema quando 100 dos eleitores de Carla e Diego se comportammaliciosamente

                                                            Figura 24 ndash BC - Cenaacuterio 1 100 de voto taacutetico na Ana e Beto

                                                            Por causa do uso demasiado da estrateacutegia burying Ana e Beto perdem muitos pontose isso abre espaccedilo para uma vitoacuteria da Carla No entanto para porcentagens menores que100 o Beto ainda eacute o vencedor

                                                            Essas duas estrateacutegias tambeacutem foram implementadas nesse simulador para o sistemaIRV e eacute possiacutevel ver como ele eacute resistente a elas Para que seja possiacutevel mudar os resultadosde uma eleiccedilatildeo sob o IRV eacute necessaacuterio mudar a ordem de eliminaccedilatildeo dos candidatos paraque o seu candidato preferido acabe enfrentando um candidato mais fraco nas rodadasfinais Isso natildeo ocorre com compromising e burying No proacuteximo cenaacuterio seraacute analisadacomo eacute possiacutevel modificar os resultados de uma eleiccedilatildeo sob o IRV

                                                            Esses resultados podem ser replicados acessando os linksSem votos taacuteticos lthttpelectionsimpythonanywherecomdirect_res1111110

                                                            --[0021][22Ana2222Beto222022Carla2222Diego22]------100gt

                                                            Com 20 de voto taacutetico lthttpelectionsimpythonanywherecomdirect_res1111110--[0021][22Ana222022Beto2222Carla2222Diego22]1-[02000]---100gt

                                                            Com 100 de voto taacuteticona Ana e Beto lthttpelectionsimpythonanywherecomdirect_res0000100--[0021][22Ana222022Beto222022Carla2222Diego22]1-[101000]---100gt

                                                            41

                                                            42 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV

                                                            Neste cenaacuterio teremos Ana Carla e Beto concorrendo e trecircs perfis distintos que apoiamcada candidato As distribuiccedilotildees de notas dos perfis se encontram na tabela abaixo

                                                            Tabela 12 ndash Distribuiccedilatildeo de notas - Cenaacuterio 2

                                                            Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                            deeleitores

                                                            1 10 5 0 422 0 10 5 303 5 0 10 28

                                                            Com essas distribuiccedilotildees Carla eacute eliminada na primeira rodada e seus 28 de votossatildeo transferidos para a segunda opccedilatildeo de seus eleitores Ana que eacute eleita com 70 dosvotos e uma meacutedia de 56

                                                            Figura 25 ndash IRV primeiro turno - Cenaacuterio 2

                                                            Figura 26 ndash IRV segundo turno - Cenaacuterio 2

                                                            42

                                                            Cientes desse provaacutevel futuro cenaacuterio onde Ana eacute eleita uma pequena parte dos elei-tores de Beto estrategicamente o abandona e decide apoiar Carla na esperanccedila de leva-laao segundo turno contra Ana As novas distribuiccedilotildees de notas se encontram na tabelaabaixo com essa porccedilatildeo de eleitores representada pelo perfil 4

                                                            Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2

                                                            Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                            deeleitores

                                                            1 10 5 0 422 0 10 5 283 5 0 10 284 0 8 10 2

                                                            Essa mudanccedila estrateacutegica de voto altera a ordem de eliminaccedilotildees do sistema com Betosendo o primeiro a ser eliminado Com isso seus votos satildeo naturalmente transferidos paraCarla que derrota Ana no segundo turno com 58 dos votos

                                                            Figura 27 ndash IRV primeiro turno com voto taacutetico - Cenaacuterio 2

                                                            Figura 28 ndash IRV segundo turno com voto taacutetico - Cenaacuterio 2

                                                            43

                                                            Percebendo que a eleiccedilatildeo de Beto natildeo era provaacutevel seus eleitores conseguiram aomenos impedir a eleiccedilatildeo do pior candidato para eles Mas para isso foi necessaacuterio queeles tivessem a informaccedilatildeo de como os outros eleitores votariam Uma aproximaccedilatildeo dessasinformaccedilotildees poderia ser obtida em um cenaacuterio real com poucos candidatos atraveacutes depesquisas eleitorais poreacutem se o nuacutemero de candidatos eacute significativo uma noccedilatildeo completadas distribuiccedilotildees dos rankings dos eleitores se torna muito menos viaacutevel e dificulta aformulaccedilatildeo de estrateacutegias para alterar a ordem em que os candidatos satildeo eliminados

                                                            Esses resultados podem ser replicados acessando os linksSem voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana22

                                                            22Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                            Com voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana

                                                            2222Beto2222Carla22]-----42Voter20Profile2001020520028Voter20Profile2010201020528Voter20Profile202520020102Voter20Profile20302082010100gt

                                                            43 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE

                                                            O interessante dos sistemas IRV e TRS eacute que os resultados do cenaacuterio anterior po-deriam ter sido obtidos ao inveacutes do voto taacutetico pela sua natildeo-monotonicidade Seriapossiacutevel que a Carla derrotasse a Ana no segundo turno atraveacutes do proacuteprio aumento depopularidade da Ana Assumindo que essa popularizaccedilatildeo ocorresse entre os candidatosdo perfil 2 onde 3 passasse a apoiar a Ana ao inveacutes do Beto as novas distribuiccedilotildeesseguiriam a tabela abaixo

                                                            Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                            Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                            deeleitores

                                                            1 10 5 0 452 0 10 5 273 5 0 10 28

                                                            Dessa maneira Beto agora com uma porcentagem dos eleitores menor do que a deCarla seraacute eliminado na primeira rodada e como seus eleitores tecircm a Carla como segundaopccedilatildeo ela receberaacute todos os seus votos e seraacute eleita na segunda rodada As rodadas doIRV podem ser vistas nas figuras 29 e 30

                                                            44

                                                            Figura 29 ndash IRV primeiro turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                            Figura 30 ndash IRV segundo turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                            Tabela 15 ndash Resultados do Cenaacuterio 3Candidato

                                                            eleitoMeacutedia das

                                                            notasAntes da

                                                            popularizaccedilatildeode Ana

                                                            Ana 56

                                                            Apoacutespopularizaccedilatildeo

                                                            de AnaCarla 415

                                                            Os efeitos dessa caracteriacutestica se refletem na satisfaccedilatildeo meacutedia da populaccedilatildeo A Ana eacuteclaramente a melhor candidata e mesmo com o seu ganho de popularidade (ou devido aele) a Carla eacute eleita

                                                            Esses resultados podem ser replicados acessando os linksAntes da popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecom

                                                            direct_res0010000---[22Ana2222Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                            45

                                                            Apoacutes popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana2222Beto2222Carla22]-----45Voter20Profile2001020520027Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                            44 CENAacuteRIO 4 COALIZOtildeES

                                                            O TRS por ser organizado em dois turnos separados normalmente a semanas dedistacircncia um do outro acaba abrindo brecha agrave mudanccedila de opiniatildeo por parte dos eleitorese o desenvolvimento de novas estrateacutegias por parte dos candidatos tais como a coalizatildeocom candidatos jaacute eliminados Com isso em mente nesse cenaacuterio teremos novamenteos quatro candidatos Ana Beto Carla e Diego Os trecircs primeiros seratildeo gerados dadistribuiccedilatildeo Neutral e Diego da distribuiccedilatildeo Disliked

                                                            Figura 31 ndash TRS turno 1 - Cenaacuterio 4

                                                            No TRS normal Ana Beto e Carla possuem com essas distribuiccedilotildees quantidades devotos muito proacuteximas com Beto e Carla indo para o segundo turno Carla estaacute 10 votosatraacutes de Beto e decide aproveitar o espaccedilo de tempo entre os dois turnos para tentaragregar mais votos Com isso Carla se aproxima de Diego e juntos formam uma coalizatildeoNo entanto com sua baixa popularidade Diego acaba ferindo a reputaccedilatildeo de Carla etorna o segundo turno muito mais faacutecil para Beto (Figura 33) Se Carla tivesse buscado osuporte de Ana por outro lado ela se veria vitoriosa no segundo turno e com uma amplavantagem sobre o Beto (Figura 34) Ou ateacute mesmo sem buscar uma coalizatildeo mesmosendo uma corrida apertada Carla teria naturalmente sido eleita (Figura 32)

                                                            Esses resultados podem ser replicados acessando os linksSem coalizotildees lthttpelectionsimpythonanywherecomdirect_res0100000

                                                            --[0002][22Ana222022Beto2222Carla2222Diego22]------100gt

                                                            46

                                                            Figura 32 ndash TRS turno 2 - Cenaacuterio 4

                                                            Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4

                                                            Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4

                                                            47

                                                            Coalizatildeo Carla e Diego lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2203Carla20Diego-100gt

                                                            Coalizatildeo Carla e Ana lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2200Carla20Ana-100gt

                                                            45 CENAacuteRIO 5 DILEMA DO PRISIONEIRO

                                                            Neste cenaacuterio temos uma eleiccedilatildeo de uma vaga com trecircs candidatos concorrentes e trecircsperfis distintos de eleitores que seguiratildeo as seguintes distribuiccedilotildees

                                                            Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5

                                                            Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                            deeleitores

                                                            1 10 -10 5 362 -10 10 5 343 -10 -10 5 30

                                                            Esse contexto nos remete ao notaacutevel dilema do prisioneiro Nele dois prisioneiroscuacutemplices satildeo interrogados individualmente sem poder se comunicar um com o outro ecada um enfrenta o dilema de delatar ou natildeo o seu parceiro Se os dois prisioneirosdecidem se manter calados sobre o crime ambos satildeo sentenciados a um ano de prisatildeo Seapenas um deles dedurar o outro o traidor sai livre enquanto seu parceiro eacute condenadoa trecircs anos Se ambos dedurarem um ao outro eles satildeo condenados juntos a dois anosde prisatildeo Esse dilema eacute uma ideia claacutessica presente no estudo da teoria dos jogos sendooriginalmente elaborada por Merrill Flood e Melvin Dresher em 1950 e mais tarde sendonomeada de dilema dos prisioneiros por Albert W Tucker (POUNDSTONE 1992)

                                                            O que esse dilema nos mostra eacute a tentaccedilatildeo que o indiviacuteduo deteacutem se sua racionalizaccedilatildeoestiver voltada para seus proacuteprios interesses e somente eles em oposiccedilatildeo a pensar no bemdo grupo como um todo Neste cenaacuterio encontramos dois grupos de eleitores expressiva-mente opostos os perfis 1 e 2 Se qualquer uma das preferecircncias desses perfis fosse eleitaisso significaria uma alta rejeiccedilatildeo de maior parte da populaccedilatildeo No entanto eles possuema segunda opccedilatildeo em comum a Carla que por sua vez eacute a preferecircncia do terceiro perfilPortanto a eleiccedilatildeo da Carla seria logicamente o resultado oacutetimo

                                                            Mesmo assim a Ana eacute eleita nos dois sistemas acima o que natildeo parece justo poispela tabela 16 eacute evidente que apenas 36 da populaccedilatildeo a aprova enquanto que os outros64 a reprovam ao maacuteximo O sistema IRV se comporta de maneira idecircntica ao TRS

                                                            48

                                                            Figura 35 ndash FPTP - Cenaacuterio 5

                                                            Figura 36 ndash TRS segundo turno - Cenaacuterio 5

                                                            nesta situaccedilatildeo Com esse resultado a meacutedia das notas eacute -28 No entanto os trecircs sistemasseguintes nos apresentam resultados diferentes

                                                            Tabela 17 ndash Resultados do Cenaacuterio 5

                                                            Sistema Candidatoeleito

                                                            Meacutedia dasnotas

                                                            FPTP Ana -28TRS Ana -28IRV Ana -28AVS Carla 50BC Carla 50SVS Carla 50

                                                            49

                                                            Figura 37 ndash AVS - Cenaacuterio 5

                                                            Figura 38 ndash BC - Cenaacuterio 5

                                                            Tanto o AVS quanto o Borda Count e o SVS satildeo sistemas que consideram todasas opiniotildees de cada eleitor ao mesmo tempo e por isso satildeo capazes de eleger o melhorcandidato nesta situaccedilatildeo diferentemente do TRS que natildeo absorve completamente todosentimento do eleitor por todos os candidatos e o IRV que apesar de ser bem expressivoquebra esse processo em inuacutemeras rodadas o que permite a perda de informaccedilatildeo ao longodelas

                                                            Esses resultados podem ser replicados acessando o linklthttpelectionsimpythonanywherecomdirect_res1111110---[22Ana

                                                            222022Beto222022Carla22]-----36Voter20Profile2001020-1020534Voter20Profile201-10201020530Voter20Profile202-1020-10205100gt

                                                            50

                                                            Figura 39 ndash SVS - Cenaacuterio 5

                                                            46 CENAacuteRIO 6 VOTO DE MINORIA

                                                            Neste cenaacuterio temos uma eleiccedilatildeo com quatro candidatos e duas vagas A Ana seraacutea preferecircncia de uma extensa parte da populaccedilatildeo (distribuiccedilatildeo Loved Figura 53) Betoe Carla seratildeo candidatos razoavelmente populares (distribuiccedilatildeo Neutral Figura 47) eDiego seraacute a preferecircncia de apenas um pequeno grupo especiacutefico e rejeitado pela maioria(distribuiccedilatildeo Disliked Figura 51) Eacute intuitivo esperar que os dois candidatos eleitos seratildeoa Ana e ou o Beto ou a Carla e isso eacute exatamente o que ocorre na figura 40 no sistemaFPTP sem voto de minoria

                                                            Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria

                                                            Eacute evidente a discrepacircncia da quantidade de votos da Ana para os outros candidatose apesar de Beto e Carla serem mais populares que Diego os trecircs natildeo se encontrammuito afastados Poreacutem se a pequena fraccedilatildeo de candidatos que possuem a Ana como

                                                            51

                                                            Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego

                                                            preferecircncia e Diego como segunda opccedilatildeo optarem pelo voto de minoria a situaccedilatildeo mudacompletamente (Figura 41) Assim apesar de extensamente rejeitado Diego conquistaa segunda vaga e a meacutedia das notas despenca de 2929 para 0505 No entanto aindaexiste um cenaacuterio pior Se os outros grupos de eleitores pensarem da mesma forma eevitarem votar na Ana achando que sua eleiccedilatildeo jaacute estaacute assegurada apenas 80 de votode minoria para esses grupos jaacute eacute o suficiente para eliminaacute-la das eleiccedilotildees (Figura 42)Com a Ana eliminada a meacutedia das notas cai ainda mais para 0058

                                                            Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego

                                                            O sistema Bloc Vote eacute uma das soluccedilotildees para o voto de minoria Permitindo queos eleitores votem no mesmo nuacutemero de candidatos que de vagas a serem preenchidasnatildeo existe o iacutempeto a esse tipo de voto estrateacutegico O resultado desse sistema portantoretorna a meacutedia das notas a casa dos 29 (Figura 43) Os sistemas AVS Borda Count eSVS tambeacutem impedem a presenccedila do voto de minoria e atingem resultados semelhantes

                                                            52

                                                            Figura 43 ndash BV - Cenaacuterio 6

                                                            Tabela 18 ndash Resultados do Cenaacuterio 6

                                                            Sistema Candidatoseleitos

                                                            Meacutedia dasnotas

                                                            FPTP sem voto de minoriaAna eBeto 2929

                                                            FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

                                                            FPTP com 80 de voto de minoriaBeto eCarla 0058

                                                            Bloc VoteAna eCarla 2913

                                                            Esses resultados podem ser replicados acessando os links

                                                            Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

                                                            100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

                                                            80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

                                                            53

                                                            5 COMO FUNCIONA O SIMULADOR

                                                            O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

                                                            51 CLASSE ELECTIONS

                                                            Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

                                                            bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

                                                            Figura 44 ndash estrutura candidates

                                                            bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

                                                            bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

                                                            Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

                                                            Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

                                                            54

                                                            Figura 45 ndash estrutura voters

                                                            Figura 46 ndash estrutura votes

                                                            daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

                                                            Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

                                                            55

                                                            Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

                                                            Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

                                                            na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

                                                            56

                                                            Figura 49 ndash PDF - Distribuiccedilatildeo Liked

                                                            Figura 50 ndash CDF - Distribuiccedilatildeo Liked

                                                            (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

                                                            Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

                                                            57

                                                            Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

                                                            Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

                                                            candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

                                                            Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

                                                            58

                                                            Figura 53 ndash PDF - Distribuiccedilatildeo Loved

                                                            Figura 54 ndash CDF - Distribuiccedilatildeo Loved

                                                            funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

                                                            59

                                                            Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                                                            Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                                                            Meacutedia das Notas sumei

                                                            sumvj nij

                                                            etimes v

                                                            Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                                                            Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                                                            60

                                                            Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                                                            Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                                                            52 CLASSE FIRSTPASTTHEPOST

                                                            Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                                                            Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                                                            61

                                                            Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                                                            Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                                                            mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                                                            62

                                                            53 CLASSE TWOROUNDSYSTEM

                                                            A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                                                            54 CLASSE INSTANTRUNOFFVOTING

                                                            A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                                                            Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                                                            63

                                                            cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                                                            55 CLASSE APPROVALVOTING

                                                            Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                                                            56 CLASSE BORDACOUNT

                                                            Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                                                            57 CLASSE SCOREVOTING

                                                            De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                                                            64

                                                            58 CLASSE BLOCVOTE

                                                            O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                                                            59 TECNOLOGIAS UTILIZADAS

                                                            A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                                                            Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                                                            O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                                                            Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                                                            65

                                                            6 CONCLUSAtildeO

                                                            Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                                                            Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                                                            Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                                                            Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                                                            Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                                                            66

                                                            REFEREcircNCIAS

                                                            AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                                                            Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                                                            Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                                                            Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                                                            HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                                                            LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                                                            ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                                                            Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                                                            POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                                                            The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                                                            67

                                                            APEcircNDICES

                                                            APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                                            Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                                            if(not len(selfvoter_profiles))

                                                            for voter in range(selfN_VOTERS)

                                                            candidates_rank = dict()

                                                            for candidate in reversed(range(selfN_CANDIDATES))

                                                            if(selfBIAS_VECTOR[candidate]==4)

                                                            candidates_rank[candidate] = self_sortear(selfloved)

                                                            elif(selfBIAS_VECTOR[candidate]==3)

                                                            candidates_rank[candidate] = self_sortear(selfliked)

                                                            elif(selfBIAS_VECTOR[candidate]==2)

                                                            candidates_rank[candidate] = self_sortear(selfdisliked)

                                                            elif(selfBIAS_VECTOR[candidate]==1)

                                                            candidates_rank[candidate] = self_sortear(selfhated)

                                                            elif(selfBIAS_VECTOR[candidate]==-1)

                                                            candidates_rank[candidate] = self_sortear(selfpolarizer

                                                            )

                                                            elif(selfBIAS_VECTOR[candidate]==-2)

                                                            candidates_rank[candidate] = self_sortear(self

                                                            more_polarizer)

                                                            else

                                                            candidates_rank[candidate] = self_sortear(selfneutral)

                                                            selfvotersappend(candidates_rank)

                                                            else

                                                            ranges = []

                                                            ranks = []

                                                            for prof in selfvoter_profiles

                                                            rangesappend(int(prof[pop_percentage]))

                                                            rank =

                                                            for index score in enumerate(prof[scores])

                                                            rank[index] = score

                                                            ranksappend(rank)

                                                            for index _range in enumerate(ranges)

                                                            for _ in range(int(selfN_VOTERS(_range100)))

                                                            selfvotersappend(ranks[index])

                                                            68

                                                            APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                                            Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                                            for i in range(selfN_CANDIDATES)

                                                            selfcandidates[i] = 0

                                                            selfvotes[i] = set()

                                                            APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                                            Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                                            for candidate in range(selfN_CANDIDATES)

                                                            rating_sum = 0

                                                            for voter in selfvoters

                                                            rating_sum += voter[candidate]

                                                            selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                                            APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                                            Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                                            if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                                            return selfcalculate_mean(winners)

                                                            else

                                                            chose_best = True if winners[0] == selfbest_candidate else

                                                            False

                                                            return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                                            69

                                                            APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                                            Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                                            rating_sum = 0

                                                            for voter in selfvoters

                                                            for candidate in winners

                                                            rating_sum += voter[candidate]

                                                            return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                                            APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                                            Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                                            for i in range(1 selfN_VACANCIES + 2)

                                                            selfleading_candidatesappend(selfsorted_candidates[-i][self

                                                            CANDIDATE_INDEX])

                                                            APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                                            Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                                            for leader in selfelecrounds[-1]

                                                            selfleading_candidatesappend(leader[0])

                                                            70

                                                            APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                                            Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                                            self_account_for_coalitions()

                                                            for voter in selfvoters

                                                            selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                                            (1)))

                                                            temp = []

                                                            for voter in selfsorted_voters

                                                            new_dict = defaultdict(list)

                                                            for k in voter

                                                            new_dict[k[1]]append(k[0])

                                                            tempappend(new_dict)

                                                            selfsorted_voters = []

                                                            for voter_index current_voter in enumerate(temp)

                                                            new_voter = []

                                                            for rating candidate_indexes in current_voteritems()

                                                            if len(current_voter[rating]) gt 1

                                                            shuffle(current_voter[rating])

                                                            for e in candidate_indexes

                                                            new_voterappend((e rating))

                                                            else

                                                            new_voterappend((candidate_indexes[0] rating))

                                                            selfsorted_votersappend(new_voter)

                                                            selfcandidates[new_voter[-1][0]] += 1

                                                            selfvotes[new_voter[-1][0]]add(voter_index)

                                                            71

                                                            APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                                            Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                                            for candidate in selfvotes_copy

                                                            if candidate not in selfelecleading_candidates

                                                            for voter_index in selfvotes_copy[candidate]

                                                            for index _candidate in enumerate(reversed(selfelec

                                                            sorted_voters[voter_index]))

                                                            if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                                            leading_candidates

                                                            if randomrandom() lt selfelec

                                                            tactical_vote_percentages[_candidate[selfelec

                                                            CANDIDATE_INDEX]]

                                                            selfrankings_changed[voter_index] = copy

                                                            deepcopy(selfelecsorted_voters[voter_index])

                                                            selfrankings_changed[voter_index][-(index + 1)]

                                                            selfrankings_changed[voter_index][-1] = self

                                                            rankings_changed[voter_index][-1] self

                                                            rankings_changed[voter_index][-(index + 1)]

                                                            selfcandidates[candidate] -= 1

                                                            selfcandidates[_candidate[selfelec

                                                            CANDIDATE_INDEX]] += 1

                                                            selfvotes[candidate]remove(voter_index)

                                                            selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                                            ]]add(voter_index)

                                                            break

                                                            break

                                                            72

                                                            APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                                            Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                                            half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                                            for candidate in selfelecleading_candidates

                                                            if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                                            continue

                                                            for voter_index in selfvotes_copy[candidate]

                                                            if voter_index in selfrankings_changed

                                                            ranking = selfrankings_changed[voter_index]

                                                            else

                                                            ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                                            ])

                                                            for index _candidate in enumerate(reversed(ranking))

                                                            if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                            leading_candidates or (_candidate[selfelec

                                                            CANDIDATE_INDEX] in selfelecleading_candidates and

                                                            selfelecleading_candidatesindex(_candidate[selfelec

                                                            CANDIDATE_INDEX]) gt= half_vacancies)

                                                            if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                                            if randomrandom() lt selfelec

                                                            minority_vote_percentages[_candidate[selfelec

                                                            CANDIDATE_INDEX]]

                                                            selfcandidates[candidate] -= 1

                                                            selfcandidates[_candidate[selfelec

                                                            CANDIDATE_INDEX]] += 1

                                                            break

                                                            break

                                                            break

                                                            73

                                                            APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                                            Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                                            self_account_for_coalitions()

                                                            for candidate in selfvotes

                                                            if candidate = selfwinner and candidate = selfsecond_place

                                                            for voter_index in selfvotes[candidate]

                                                            if voter_index in selfrankings_changed

                                                            ranking = selfrankings_changed[voter_index]

                                                            else

                                                            ranking = copydeepcopy(selfelecsorted_voters[

                                                            voter_index])

                                                            for index2 candidate in enumerate(reversed(ranking))

                                                            if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                                            selfcandidates[selfwinner] += 1

                                                            selfvotes[selfwinner]add(voter_index)

                                                            break

                                                            elif candidate[selfelecCANDIDATE_INDEX] == self

                                                            second_place

                                                            selfcandidates[selfsecond_place] += 1

                                                            selfvotes[selfsecond_place]add(voter_index)

                                                            break

                                                            selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                            winners = []

                                                            vacancies = selfelecN_VACANCIES

                                                            for candidate in reversed(selfsorted_candidates)

                                                            if vacancies == 0

                                                            break

                                                            winnersappend(candidate[0])

                                                            vacancies -= 1

                                                            mean chose_best = selfelecget_mean(winners = winners)

                                                            74

                                                            APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                                            Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                                            for voter_index voter in enumerate(selfelecsorted_voters)

                                                            voter_dict = dict()

                                                            og_voter_dict = dict()

                                                            for tup in voter

                                                            voter_dict[tup[0]] = tup[1]

                                                            og_voter_dict[tup[0]] = tup[1]

                                                            for coalition in selfeleccoalitions

                                                            for candidate in coalition

                                                            add_to_score = 0

                                                            for candidate2 in coalition

                                                            if candidate == candidate2

                                                            continue

                                                            half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                                            if half lt 0

                                                            add_to_score += mathceil(half)

                                                            else

                                                            add_to_score += mathfloor(half)

                                                            if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                                            voter_dict[candidate[rsquovaluersquo]] = 10

                                                            elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                                            voter_dict[candidate[rsquovaluersquo]] = -10

                                                            else

                                                            voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                                            selfrankings_changed[voter_index] = []

                                                            for candidate in voter_dict

                                                            selfrankings_changed[voter_index]append((candidate voter_dict[

                                                            candidate]))

                                                            selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                                            voter_index] key=lambda x x[1])

                                                            75

                                                            APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                            Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                            selfelecroundsappend(selfsorted_candidates[_round])

                                                            if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                            N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                            N_VACANCIES - 1)

                                                            return 2

                                                            elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                            N_VOTERS gt 05)

                                                            return 1

                                                            else

                                                            selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                            CANDIDATE_INDEX])

                                                            for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                            elecCANDIDATE_INDEX]]

                                                            if voter_index in selfrankings_changed

                                                            for candidate in reversed(selfrankings_changed[voter_index

                                                            ])

                                                            if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                            excluded

                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                            ]] += 1

                                                            selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                            add(voter_index)

                                                            break

                                                            else

                                                            continue

                                                            else

                                                            for candidate in reversed(selfelecsorted_voters[

                                                            voter_index])

                                                            if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                            excluded

                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                            ]] += 1

                                                            selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                            add(voter_index)

                                                            break

                                                            else

                                                            continue

                                                            selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                            return 0

                                                            76

                                                            APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                            Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                            for index in range(selfelecN_CANDIDATES)

                                                            selfcandidates[index] = 0

                                                            for voter in selfelecsorted_voters

                                                            for candidate in reversed(voter)

                                                            if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                            else

                                                            break

                                                            APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                            Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                            for index in range(selfelecN_CANDIDATES)

                                                            selfcandidates[index] = 0

                                                            for voter in selfelecsorted_voters

                                                            if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                            elecCANDIDATE_INDEX]]

                                                            selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                            else

                                                            for candidate in reversed(voter)

                                                            if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                            else

                                                            break

                                                            77

                                                            APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                            Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                            pos = set()

                                                            for index perc in enumerate(selfelectactical_vote_percentages)

                                                            if perc gt 0

                                                            posadd(index)

                                                            for candidate in selfeleccandidates

                                                            if candidate not in selfleading_candidates

                                                            for voter_index in selfvotes[candidate]

                                                            raised = None

                                                            for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                            ])

                                                            if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                            leading_candidates

                                                            if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                            if randomrandom() lt selfelectactical_vote_percentages[

                                                            candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                            ranking = [None]selfelecN_CANDIDATES

                                                            ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                            selfelecvoters[voter_index][candidate_tuple[selfelec

                                                            CANDIDATE_INDEX]])

                                                            raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                            break

                                                            break

                                                            break

                                                            if raised = None

                                                            for _candidate in selfleading_candidates

                                                            if _candidate = ranking[-1][0]

                                                            ranking[0] = (_candidate selfelecvoters[voter_index][

                                                            _candidate])

                                                            buried = _candidate

                                                            break

                                                            i = 1

                                                            for candidate_tuple in selfelecsorted_voters[voter_index]

                                                            if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                            buried]

                                                            continue

                                                            else

                                                            ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                            selfelecvoters[voter_index][candidate_tuple[selfelec

                                                            CANDIDATE_INDEX]])

                                                            i += 1

                                                            selfrankings_changed[voter_index] = ranking

                                                            78

                                                            APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                            Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                            for voter_index in selfvotes[candidate]

                                                            if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                            ]

                                                            for _candidate in selfleading_candidates

                                                            if _candidate = candidate

                                                            ranking = [None]selfelecN_CANDIDATES

                                                            ranking[0] = (_candidate selfelecvoters[voter_index][

                                                            _candidate])

                                                            buried = _candidate

                                                            break

                                                            i = 1

                                                            for candidate_tuple in selfelecsorted_voters[voter_index]

                                                            if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                            continue

                                                            else

                                                            ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                            selfelecvoters[voter_index][candidate_tuple[selfelec

                                                            CANDIDATE_INDEX]])

                                                            i += 1

                                                            selfrankings_changed[voter_index] = ranking

                                                            79

                                                            APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                            Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                            for index in range(selfelecN_CANDIDATES)

                                                            selfcandidates[index] = 0

                                                            for voter_index voter in enumerate(selfelecsorted_voters)

                                                            score = 0

                                                            if voter_index in selfrankings_changed

                                                            for candidate in selfrankings_changed[voter_index]

                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                            score += 1

                                                            else

                                                            for candidate in voter

                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                            score += 1

                                                            APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                            Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                            for voter_index voter in enumerate(selfelecsorted_voters)

                                                            if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                            elecCANDIDATE_INDEX]]

                                                            selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                            sorted_voters[voter_index])

                                                            for candidate_index candidate in enumerate(reversed(voter))

                                                            if candidate_index == 0

                                                            selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                            voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                            else

                                                            selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                            voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                            80

                                                            APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                            Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                            for index in range(selfelecN_CANDIDATES)

                                                            selfcandidates[index] = 0

                                                            for voter_index voter in enumerate(selfelecsorted_voters)

                                                            if voter_index in selfrankings_changed

                                                            for candidate in selfrankings_changed[voter_index]

                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                            selfelecCANDIDATE_RANK]

                                                            else

                                                            for candidate in voter

                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                            selfelecCANDIDATE_RANK]

                                                            APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                            Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                            for index in range(selfelecN_CANDIDATES)

                                                            selfcandidates[index] = 0

                                                            for voter in selfelecsorted_voters

                                                            votes = selfelecN_VACANCIES

                                                            for candidate in reversed(voter)

                                                            if votes == 0

                                                            break

                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                            votes -= 1

                                                            • Folha de aprovaccedilatildeo
                                                            • Agradecimentos
                                                            • Epiacutegrafe
                                                            • Resumo
                                                            • Abstract
                                                            • Lista de ilustraccedilotildees
                                                            • Lista de Coacutedigos
                                                            • Lista de tabelas
                                                            • Lista de abreviaturas e siglas
                                                            • Sumaacuterio
                                                            • INTRODUCcedilAtildeO
                                                              • MOTIVACcedilAtildeO E OBJETIVO
                                                              • MEacuteTODO
                                                              • ESTRUTURA
                                                                • SISTEMAS ELEITORAIS
                                                                  • FISRT PAST THE POST
                                                                    • Exemplo
                                                                    • Vantagens e Desvantagens do FPTP
                                                                    • Voto Uacutetil no FPTP
                                                                      • TWO-ROUND SYSTEM
                                                                        • Exemplo
                                                                        • Vantagens e Desvantagens do TRS
                                                                        • Voto Uacutetil no TRS
                                                                          • INSTANT-RUNOFF VOTING
                                                                            • Exemplo
                                                                            • Vantagens e Desvantagens do IRV
                                                                            • Voto Uacutetil no IRV
                                                                              • APPROVAL VOTING SYSTEM
                                                                                • Exemplo
                                                                                • Vantagens e Desvantagens do AVS
                                                                                • Voto Uacutetil no AVS
                                                                                  • THE BORDA COUNT
                                                                                    • Exemplo
                                                                                    • Vantagens e Desvantagens do BC
                                                                                    • Voto Uacutetil no BC
                                                                                      • SCORE VOTING SYSTEM
                                                                                        • Exemplo
                                                                                        • Vantagens e Desvantagens do SVS
                                                                                        • Voto Uacutetil no SVS
                                                                                          • BLOC VOTE
                                                                                            • Exemplo
                                                                                            • Voto Uacutetil no BV
                                                                                                • O SIMULADOR
                                                                                                • CENAacuteRIOS PERTINENTES
                                                                                                  • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                  • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                  • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                  • CENAacuteRIO 4 COALIZOtildeES
                                                                                                  • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                  • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                    • COMO FUNCIONA O SIMULADOR
                                                                                                      • CLASSE Elections
                                                                                                      • CLASSE FirstPastThePost
                                                                                                      • CLASSE TwoRoundSystem
                                                                                                      • CLASSE InstantRunoffVoting
                                                                                                      • CLASSE ApprovalVoting
                                                                                                      • CLASSE BordaCount
                                                                                                      • CLASSE ScoreVoting
                                                                                                      • CLASSE BlocVote
                                                                                                      • TECNOLOGIAS UTILIZADAS
                                                                                                        • CONCLUSAtildeO
                                                                                                        • Referecircncias
                                                                                                        • Meacutetodo create_voters
                                                                                                        • Meacutetodo create_candidates
                                                                                                        • Meacutetodo calculate_means
                                                                                                        • Meacutetodo get_mean
                                                                                                        • Meacutetodo calculate_mean
                                                                                                        • Meacutetodo set_leading_candidates
                                                                                                        • Meacutetodo irv_set_leading_candidates
                                                                                                        • Meacutetodo sort_ranks
                                                                                                        • Meacutetodo fptp_count_tactical_votes
                                                                                                        • Meacutetodo fptp_count_minority_votes
                                                                                                        • Meacutetodo trs_second_round
                                                                                                        • Meacutetodo trs_account_for_coalitions
                                                                                                        • Meacutetodo irv_count_votes
                                                                                                        • Meacutetodo avs_count_votes
                                                                                                        • Meacutetodo avs_count_votes_with_tactical
                                                                                                        • Meacutetodo irv_apply_tactical_votes
                                                                                                        • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                        • Meacutetodo bc_sum_candidates_scores
                                                                                                        • Meacutetodo svs_apply_tactical_votes
                                                                                                        • Meacutetodo svs_sum_candidates_scores
                                                                                                        • Meacutetodo bv_count_votes

                                                              31

                                                              eleiccedilotildees com mais de um candidato eleito jaacute que eles se comportariam exatamente comono FPTP

                                                              A maioria das linguagens de programaccedilatildeo senatildeo todas possuem um gerador de nuacuteme-ros pseudoaleatoacuterios que fornece a possibilidade de definir uma seed para o gerador Estaseed funciona como um ponto de partida para a geraccedilatildeo dos nuacutemero e portanto todasimulaccedilatildeo que rodar com a mesma seed sempre teraacute os mesmos resultados Se nenhumvalor for fornecido pelo usuaacuterio o tempo atual do sistema eacute utilizado As opccedilotildees subse-quentes satildeo a escolha do nuacutemero de eleitores gerados e o nuacutemero de vagas (Figura 3) Senenhum valor for fornecido o nuacutemero de eleitores padratildeo utilizado eacute 1000 e o nuacutemero devagas igual a 1

                                                              Figura 4 ndash Captura de tela 3

                                                              Este simulador possui dois modos para a criaccedilatildeo dos rankings dos eleitores No modoManipulate (Figura 4) primeiramente se define o nuacutemero de candidatos atraveacutes do campode entrada ao lado do tiacutetulo Candidates ou alternativamente pode-se adicionar candida-tos um a um atraveacutes do sinal de mais na parte inferior da paacutegina Para cada candidatoeacute possiacutevel definir a porcentagem de seus eleitores que optaraacute pelo voto taacutetico e pelovoto de minoria Tambeacutem eacute possiacutevel alterar o nome dos candidatos se for do interessedo usuaacuterio

                                                              32

                                                              Figura 5 ndash Captura de tela 4

                                                              Figura 6 ndash Captura de tela 5

                                                              33

                                                              Figura 7 ndash Captura de tela 6

                                                              Apoacutes a criaccedilatildeo dos candidatos o usuaacuterio pode criar perfis de eleitores que definiratildeo demaneira exata como partes da populaccedilatildeo iraacute votar (Figura 5) Em cada perfil se defineo valor em porcentos da populaccedilatildeo votante que o adotaraacute e a nota de cada candidatoTambeacutem eacute possiacutevel nomear cada perfil livremente

                                                              No modo Generate (Figura 6) eacute onde o gerador de nuacutemeros pseudoaleatoacuterios eacute usadoNesse modo ao inveacutes do usuaacuterio criar perfis de eleitores ele define qual seraacute a distribuiccedilatildeoadotada para a geraccedilatildeo de notas de cada candidato Essas distribuiccedilotildees seratildeo mais bemdetalhadas no Capiacutetulo 5 Da mesma maneira que no modo Manipulate nesse modotambeacutem eacute possiacutevel definir os valores para os dois tipos de voto uacutetil os votos taacuteticos eos votos de minoria No primeiro estatildeo incluiacutedas as estrateacutegias de mudanccedila de votoespeciacuteficas de cada sistema como o bullet voting no AVS e SVS ou quando a preferecircnciade um eleitor claramente natildeo possui chances de vitoacuteria e ele muda seu voto para um doscandidatos que esteja na lideranccedila o que ocorre no FPTP e TRS O voto de minoriase apresenta apenas no FPTP em eleiccedilotildees onde mais de um candidato eacute eleito Se apreferecircncia de um eleitor claramente lidera a eleiccedilatildeo por ser tambeacutem a preferecircncia damaior parte da populaccedilatildeo esse eleitor pode mudar o seu voto para uma segunda opccedilatildeona esperanccedila de eleger dois de seus candidatos favoritos

                                                              Por fim em ambos os modos o usuaacuterio tem a opccedilatildeo de definir coalizotildees entre oscandidatos se o sistema TRS estiver habilitado pois as coalizotildees apenas se manifestamnesse sistema Essas coalizotildees alteraratildeo as notas dos candidatos dependendo dos outroscandidatos pertencentes a elas (Figura 7)

                                                              A aplicaccedilatildeo pode ser encontrada na paacutegina httpelectionsimpythonanywherecom

                                                              34

                                                              4 CENAacuteRIOS PERTINENTES

                                                              Para todos os cenaacuterios deste capiacutetulo seraacute usada a seed do simulador igual a 100 e apopulaccedilatildeo de eleitores igual a 1000 para que exista consistecircncia na anaacutelise e tambeacutem paraque possa haver replicaccedilatildeo dos resultados se necessaacuterio

                                                              41 CENAacuteRIO 1 VOTO TAacuteTICO

                                                              Neste exemplo teremos quatro candidatos Ana Beto Carla e Diego Ana e Betoseratildeo gerados a partir da distribuiccedilatildeo Neutral (Figura 47) Carla da distribuiccedilatildeo Disliked(Figura 51) e Diego da Hated (Figura 55) Para a simulaccedilatildeo com a seed 100 o melhorcandidato a ser eleito ou seja aquele que maximiza a meacutedia das notas dos eleitores eacute oBeto com uma meacutedia de 0073 Para cada sistema seratildeo comparados os resultados semvoto taacutetico aos com 20 de voto taacutetico a favor da Ana Abaixo se encontram osresultados para o sistema FPTP

                                                              Figura 8 ndash FPTP - Cenaacuterio 1 sem voto taacutetico

                                                              Figura 9 ndash TRS segundo turno - Cenaacuterio 1 sem voto taacutetico

                                                              35

                                                              Figura 10 ndash IRV primeiro turno - Cenaacuterio 1

                                                              Figura 11 ndash IRV segundo turno - Cenaacuterio 1

                                                              Figura 12 ndash IRV terceiro turno - Cenaacuterio 1

                                                              36

                                                              Figura 13 ndash AVS - Cenaacuterio 1 sem voto taacutetico

                                                              Figura 14 ndash BC - Cenaacuterio 1 sem voto taacutetico

                                                              Figura 15 ndash SVS - Cenaacuterio 1 sem voto taacutetico

                                                              37

                                                              Nesse cenaacuterio sem voto taacutetico o uacutenico sistema que natildeo elege o Beto eacute o AVS Todosos outros elegem o melhor candidato Ou seja apesar de Beto ter uma melhor meacutediadas notas dos eleitores existem mais eleitores que ranqueiam Ana com uma nota acimade 0 No entanto apenas 20 dos eleitores de Diego e Carla que preferem a Ana aoinveacutes do Beto satildeo o suficiente para fazer Beto natildeo ser eleito se eles decidirem abandonarsua primeira opccedilatildeo e votar na Ana Considerando a vantagem que os votos taacuteticosproporcionam agrave Ana esta eacute eleita em todos os sistemas menos o TRS e o IRV

                                                              Figura 16 ndash FPTP - Cenaacuterio 1 - 20 de voto taacutetico na Ana

                                                              Figura 17 ndash TRS segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                              38

                                                              Figura 18 ndash IRV primeiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                              Figura 19 ndash IRV segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                              Figura 20 ndash IRV terceiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                              39

                                                              Figura 21 ndash AVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                              Figura 22 ndash BC - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                              Figura 23 ndash SVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                              40

                                                              Eacute claro que se os eleitores que preferem o Beto tambeacutem votassem de maneira estra-teacutegica a situaccedilatildeo se equilibraria e haveria o mesmo niacutevel de concorrecircncia entre os doiscandidatos que ocorre quando natildeo haacute voto taacutetico Poreacutem no Borda Count esse equiliacute-brio pode natildeo acontecer e as estrateacutegias de compromising e burying podem acabar saindopela culatra se uma porcentagem elevada dos eleitores as adotarem Abaixo encontram-seos resultados para esse sistema quando 100 dos eleitores de Carla e Diego se comportammaliciosamente

                                                              Figura 24 ndash BC - Cenaacuterio 1 100 de voto taacutetico na Ana e Beto

                                                              Por causa do uso demasiado da estrateacutegia burying Ana e Beto perdem muitos pontose isso abre espaccedilo para uma vitoacuteria da Carla No entanto para porcentagens menores que100 o Beto ainda eacute o vencedor

                                                              Essas duas estrateacutegias tambeacutem foram implementadas nesse simulador para o sistemaIRV e eacute possiacutevel ver como ele eacute resistente a elas Para que seja possiacutevel mudar os resultadosde uma eleiccedilatildeo sob o IRV eacute necessaacuterio mudar a ordem de eliminaccedilatildeo dos candidatos paraque o seu candidato preferido acabe enfrentando um candidato mais fraco nas rodadasfinais Isso natildeo ocorre com compromising e burying No proacuteximo cenaacuterio seraacute analisadacomo eacute possiacutevel modificar os resultados de uma eleiccedilatildeo sob o IRV

                                                              Esses resultados podem ser replicados acessando os linksSem votos taacuteticos lthttpelectionsimpythonanywherecomdirect_res1111110

                                                              --[0021][22Ana2222Beto222022Carla2222Diego22]------100gt

                                                              Com 20 de voto taacutetico lthttpelectionsimpythonanywherecomdirect_res1111110--[0021][22Ana222022Beto2222Carla2222Diego22]1-[02000]---100gt

                                                              Com 100 de voto taacuteticona Ana e Beto lthttpelectionsimpythonanywherecomdirect_res0000100--[0021][22Ana222022Beto222022Carla2222Diego22]1-[101000]---100gt

                                                              41

                                                              42 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV

                                                              Neste cenaacuterio teremos Ana Carla e Beto concorrendo e trecircs perfis distintos que apoiamcada candidato As distribuiccedilotildees de notas dos perfis se encontram na tabela abaixo

                                                              Tabela 12 ndash Distribuiccedilatildeo de notas - Cenaacuterio 2

                                                              Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                              deeleitores

                                                              1 10 5 0 422 0 10 5 303 5 0 10 28

                                                              Com essas distribuiccedilotildees Carla eacute eliminada na primeira rodada e seus 28 de votossatildeo transferidos para a segunda opccedilatildeo de seus eleitores Ana que eacute eleita com 70 dosvotos e uma meacutedia de 56

                                                              Figura 25 ndash IRV primeiro turno - Cenaacuterio 2

                                                              Figura 26 ndash IRV segundo turno - Cenaacuterio 2

                                                              42

                                                              Cientes desse provaacutevel futuro cenaacuterio onde Ana eacute eleita uma pequena parte dos elei-tores de Beto estrategicamente o abandona e decide apoiar Carla na esperanccedila de leva-laao segundo turno contra Ana As novas distribuiccedilotildees de notas se encontram na tabelaabaixo com essa porccedilatildeo de eleitores representada pelo perfil 4

                                                              Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2

                                                              Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                              deeleitores

                                                              1 10 5 0 422 0 10 5 283 5 0 10 284 0 8 10 2

                                                              Essa mudanccedila estrateacutegica de voto altera a ordem de eliminaccedilotildees do sistema com Betosendo o primeiro a ser eliminado Com isso seus votos satildeo naturalmente transferidos paraCarla que derrota Ana no segundo turno com 58 dos votos

                                                              Figura 27 ndash IRV primeiro turno com voto taacutetico - Cenaacuterio 2

                                                              Figura 28 ndash IRV segundo turno com voto taacutetico - Cenaacuterio 2

                                                              43

                                                              Percebendo que a eleiccedilatildeo de Beto natildeo era provaacutevel seus eleitores conseguiram aomenos impedir a eleiccedilatildeo do pior candidato para eles Mas para isso foi necessaacuterio queeles tivessem a informaccedilatildeo de como os outros eleitores votariam Uma aproximaccedilatildeo dessasinformaccedilotildees poderia ser obtida em um cenaacuterio real com poucos candidatos atraveacutes depesquisas eleitorais poreacutem se o nuacutemero de candidatos eacute significativo uma noccedilatildeo completadas distribuiccedilotildees dos rankings dos eleitores se torna muito menos viaacutevel e dificulta aformulaccedilatildeo de estrateacutegias para alterar a ordem em que os candidatos satildeo eliminados

                                                              Esses resultados podem ser replicados acessando os linksSem voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana22

                                                              22Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                              Com voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana

                                                              2222Beto2222Carla22]-----42Voter20Profile2001020520028Voter20Profile2010201020528Voter20Profile202520020102Voter20Profile20302082010100gt

                                                              43 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE

                                                              O interessante dos sistemas IRV e TRS eacute que os resultados do cenaacuterio anterior po-deriam ter sido obtidos ao inveacutes do voto taacutetico pela sua natildeo-monotonicidade Seriapossiacutevel que a Carla derrotasse a Ana no segundo turno atraveacutes do proacuteprio aumento depopularidade da Ana Assumindo que essa popularizaccedilatildeo ocorresse entre os candidatosdo perfil 2 onde 3 passasse a apoiar a Ana ao inveacutes do Beto as novas distribuiccedilotildeesseguiriam a tabela abaixo

                                                              Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                              Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                              deeleitores

                                                              1 10 5 0 452 0 10 5 273 5 0 10 28

                                                              Dessa maneira Beto agora com uma porcentagem dos eleitores menor do que a deCarla seraacute eliminado na primeira rodada e como seus eleitores tecircm a Carla como segundaopccedilatildeo ela receberaacute todos os seus votos e seraacute eleita na segunda rodada As rodadas doIRV podem ser vistas nas figuras 29 e 30

                                                              44

                                                              Figura 29 ndash IRV primeiro turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                              Figura 30 ndash IRV segundo turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                              Tabela 15 ndash Resultados do Cenaacuterio 3Candidato

                                                              eleitoMeacutedia das

                                                              notasAntes da

                                                              popularizaccedilatildeode Ana

                                                              Ana 56

                                                              Apoacutespopularizaccedilatildeo

                                                              de AnaCarla 415

                                                              Os efeitos dessa caracteriacutestica se refletem na satisfaccedilatildeo meacutedia da populaccedilatildeo A Ana eacuteclaramente a melhor candidata e mesmo com o seu ganho de popularidade (ou devido aele) a Carla eacute eleita

                                                              Esses resultados podem ser replicados acessando os linksAntes da popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecom

                                                              direct_res0010000---[22Ana2222Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                              45

                                                              Apoacutes popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana2222Beto2222Carla22]-----45Voter20Profile2001020520027Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                              44 CENAacuteRIO 4 COALIZOtildeES

                                                              O TRS por ser organizado em dois turnos separados normalmente a semanas dedistacircncia um do outro acaba abrindo brecha agrave mudanccedila de opiniatildeo por parte dos eleitorese o desenvolvimento de novas estrateacutegias por parte dos candidatos tais como a coalizatildeocom candidatos jaacute eliminados Com isso em mente nesse cenaacuterio teremos novamenteos quatro candidatos Ana Beto Carla e Diego Os trecircs primeiros seratildeo gerados dadistribuiccedilatildeo Neutral e Diego da distribuiccedilatildeo Disliked

                                                              Figura 31 ndash TRS turno 1 - Cenaacuterio 4

                                                              No TRS normal Ana Beto e Carla possuem com essas distribuiccedilotildees quantidades devotos muito proacuteximas com Beto e Carla indo para o segundo turno Carla estaacute 10 votosatraacutes de Beto e decide aproveitar o espaccedilo de tempo entre os dois turnos para tentaragregar mais votos Com isso Carla se aproxima de Diego e juntos formam uma coalizatildeoNo entanto com sua baixa popularidade Diego acaba ferindo a reputaccedilatildeo de Carla etorna o segundo turno muito mais faacutecil para Beto (Figura 33) Se Carla tivesse buscado osuporte de Ana por outro lado ela se veria vitoriosa no segundo turno e com uma amplavantagem sobre o Beto (Figura 34) Ou ateacute mesmo sem buscar uma coalizatildeo mesmosendo uma corrida apertada Carla teria naturalmente sido eleita (Figura 32)

                                                              Esses resultados podem ser replicados acessando os linksSem coalizotildees lthttpelectionsimpythonanywherecomdirect_res0100000

                                                              --[0002][22Ana222022Beto2222Carla2222Diego22]------100gt

                                                              46

                                                              Figura 32 ndash TRS turno 2 - Cenaacuterio 4

                                                              Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4

                                                              Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4

                                                              47

                                                              Coalizatildeo Carla e Diego lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2203Carla20Diego-100gt

                                                              Coalizatildeo Carla e Ana lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2200Carla20Ana-100gt

                                                              45 CENAacuteRIO 5 DILEMA DO PRISIONEIRO

                                                              Neste cenaacuterio temos uma eleiccedilatildeo de uma vaga com trecircs candidatos concorrentes e trecircsperfis distintos de eleitores que seguiratildeo as seguintes distribuiccedilotildees

                                                              Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5

                                                              Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                              deeleitores

                                                              1 10 -10 5 362 -10 10 5 343 -10 -10 5 30

                                                              Esse contexto nos remete ao notaacutevel dilema do prisioneiro Nele dois prisioneiroscuacutemplices satildeo interrogados individualmente sem poder se comunicar um com o outro ecada um enfrenta o dilema de delatar ou natildeo o seu parceiro Se os dois prisioneirosdecidem se manter calados sobre o crime ambos satildeo sentenciados a um ano de prisatildeo Seapenas um deles dedurar o outro o traidor sai livre enquanto seu parceiro eacute condenadoa trecircs anos Se ambos dedurarem um ao outro eles satildeo condenados juntos a dois anosde prisatildeo Esse dilema eacute uma ideia claacutessica presente no estudo da teoria dos jogos sendooriginalmente elaborada por Merrill Flood e Melvin Dresher em 1950 e mais tarde sendonomeada de dilema dos prisioneiros por Albert W Tucker (POUNDSTONE 1992)

                                                              O que esse dilema nos mostra eacute a tentaccedilatildeo que o indiviacuteduo deteacutem se sua racionalizaccedilatildeoestiver voltada para seus proacuteprios interesses e somente eles em oposiccedilatildeo a pensar no bemdo grupo como um todo Neste cenaacuterio encontramos dois grupos de eleitores expressiva-mente opostos os perfis 1 e 2 Se qualquer uma das preferecircncias desses perfis fosse eleitaisso significaria uma alta rejeiccedilatildeo de maior parte da populaccedilatildeo No entanto eles possuema segunda opccedilatildeo em comum a Carla que por sua vez eacute a preferecircncia do terceiro perfilPortanto a eleiccedilatildeo da Carla seria logicamente o resultado oacutetimo

                                                              Mesmo assim a Ana eacute eleita nos dois sistemas acima o que natildeo parece justo poispela tabela 16 eacute evidente que apenas 36 da populaccedilatildeo a aprova enquanto que os outros64 a reprovam ao maacuteximo O sistema IRV se comporta de maneira idecircntica ao TRS

                                                              48

                                                              Figura 35 ndash FPTP - Cenaacuterio 5

                                                              Figura 36 ndash TRS segundo turno - Cenaacuterio 5

                                                              nesta situaccedilatildeo Com esse resultado a meacutedia das notas eacute -28 No entanto os trecircs sistemasseguintes nos apresentam resultados diferentes

                                                              Tabela 17 ndash Resultados do Cenaacuterio 5

                                                              Sistema Candidatoeleito

                                                              Meacutedia dasnotas

                                                              FPTP Ana -28TRS Ana -28IRV Ana -28AVS Carla 50BC Carla 50SVS Carla 50

                                                              49

                                                              Figura 37 ndash AVS - Cenaacuterio 5

                                                              Figura 38 ndash BC - Cenaacuterio 5

                                                              Tanto o AVS quanto o Borda Count e o SVS satildeo sistemas que consideram todasas opiniotildees de cada eleitor ao mesmo tempo e por isso satildeo capazes de eleger o melhorcandidato nesta situaccedilatildeo diferentemente do TRS que natildeo absorve completamente todosentimento do eleitor por todos os candidatos e o IRV que apesar de ser bem expressivoquebra esse processo em inuacutemeras rodadas o que permite a perda de informaccedilatildeo ao longodelas

                                                              Esses resultados podem ser replicados acessando o linklthttpelectionsimpythonanywherecomdirect_res1111110---[22Ana

                                                              222022Beto222022Carla22]-----36Voter20Profile2001020-1020534Voter20Profile201-10201020530Voter20Profile202-1020-10205100gt

                                                              50

                                                              Figura 39 ndash SVS - Cenaacuterio 5

                                                              46 CENAacuteRIO 6 VOTO DE MINORIA

                                                              Neste cenaacuterio temos uma eleiccedilatildeo com quatro candidatos e duas vagas A Ana seraacutea preferecircncia de uma extensa parte da populaccedilatildeo (distribuiccedilatildeo Loved Figura 53) Betoe Carla seratildeo candidatos razoavelmente populares (distribuiccedilatildeo Neutral Figura 47) eDiego seraacute a preferecircncia de apenas um pequeno grupo especiacutefico e rejeitado pela maioria(distribuiccedilatildeo Disliked Figura 51) Eacute intuitivo esperar que os dois candidatos eleitos seratildeoa Ana e ou o Beto ou a Carla e isso eacute exatamente o que ocorre na figura 40 no sistemaFPTP sem voto de minoria

                                                              Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria

                                                              Eacute evidente a discrepacircncia da quantidade de votos da Ana para os outros candidatose apesar de Beto e Carla serem mais populares que Diego os trecircs natildeo se encontrammuito afastados Poreacutem se a pequena fraccedilatildeo de candidatos que possuem a Ana como

                                                              51

                                                              Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego

                                                              preferecircncia e Diego como segunda opccedilatildeo optarem pelo voto de minoria a situaccedilatildeo mudacompletamente (Figura 41) Assim apesar de extensamente rejeitado Diego conquistaa segunda vaga e a meacutedia das notas despenca de 2929 para 0505 No entanto aindaexiste um cenaacuterio pior Se os outros grupos de eleitores pensarem da mesma forma eevitarem votar na Ana achando que sua eleiccedilatildeo jaacute estaacute assegurada apenas 80 de votode minoria para esses grupos jaacute eacute o suficiente para eliminaacute-la das eleiccedilotildees (Figura 42)Com a Ana eliminada a meacutedia das notas cai ainda mais para 0058

                                                              Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego

                                                              O sistema Bloc Vote eacute uma das soluccedilotildees para o voto de minoria Permitindo queos eleitores votem no mesmo nuacutemero de candidatos que de vagas a serem preenchidasnatildeo existe o iacutempeto a esse tipo de voto estrateacutegico O resultado desse sistema portantoretorna a meacutedia das notas a casa dos 29 (Figura 43) Os sistemas AVS Borda Count eSVS tambeacutem impedem a presenccedila do voto de minoria e atingem resultados semelhantes

                                                              52

                                                              Figura 43 ndash BV - Cenaacuterio 6

                                                              Tabela 18 ndash Resultados do Cenaacuterio 6

                                                              Sistema Candidatoseleitos

                                                              Meacutedia dasnotas

                                                              FPTP sem voto de minoriaAna eBeto 2929

                                                              FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

                                                              FPTP com 80 de voto de minoriaBeto eCarla 0058

                                                              Bloc VoteAna eCarla 2913

                                                              Esses resultados podem ser replicados acessando os links

                                                              Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

                                                              100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

                                                              80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

                                                              53

                                                              5 COMO FUNCIONA O SIMULADOR

                                                              O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

                                                              51 CLASSE ELECTIONS

                                                              Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

                                                              bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

                                                              Figura 44 ndash estrutura candidates

                                                              bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

                                                              bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

                                                              Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

                                                              Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

                                                              54

                                                              Figura 45 ndash estrutura voters

                                                              Figura 46 ndash estrutura votes

                                                              daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

                                                              Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

                                                              55

                                                              Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

                                                              Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

                                                              na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

                                                              56

                                                              Figura 49 ndash PDF - Distribuiccedilatildeo Liked

                                                              Figura 50 ndash CDF - Distribuiccedilatildeo Liked

                                                              (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

                                                              Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

                                                              57

                                                              Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

                                                              Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

                                                              candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

                                                              Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

                                                              58

                                                              Figura 53 ndash PDF - Distribuiccedilatildeo Loved

                                                              Figura 54 ndash CDF - Distribuiccedilatildeo Loved

                                                              funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

                                                              59

                                                              Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                                                              Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                                                              Meacutedia das Notas sumei

                                                              sumvj nij

                                                              etimes v

                                                              Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                                                              Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                                                              60

                                                              Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                                                              Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                                                              52 CLASSE FIRSTPASTTHEPOST

                                                              Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                                                              Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                                                              61

                                                              Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                                                              Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                                                              mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                                                              62

                                                              53 CLASSE TWOROUNDSYSTEM

                                                              A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                                                              54 CLASSE INSTANTRUNOFFVOTING

                                                              A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                                                              Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                                                              63

                                                              cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                                                              55 CLASSE APPROVALVOTING

                                                              Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                                                              56 CLASSE BORDACOUNT

                                                              Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                                                              57 CLASSE SCOREVOTING

                                                              De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                                                              64

                                                              58 CLASSE BLOCVOTE

                                                              O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                                                              59 TECNOLOGIAS UTILIZADAS

                                                              A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                                                              Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                                                              O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                                                              Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                                                              65

                                                              6 CONCLUSAtildeO

                                                              Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                                                              Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                                                              Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                                                              Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                                                              Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                                                              66

                                                              REFEREcircNCIAS

                                                              AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                                                              Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                                                              Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                                                              Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                                                              HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                                                              LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                                                              ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                                                              Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                                                              POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                                                              The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                                                              67

                                                              APEcircNDICES

                                                              APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                                              Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                                              if(not len(selfvoter_profiles))

                                                              for voter in range(selfN_VOTERS)

                                                              candidates_rank = dict()

                                                              for candidate in reversed(range(selfN_CANDIDATES))

                                                              if(selfBIAS_VECTOR[candidate]==4)

                                                              candidates_rank[candidate] = self_sortear(selfloved)

                                                              elif(selfBIAS_VECTOR[candidate]==3)

                                                              candidates_rank[candidate] = self_sortear(selfliked)

                                                              elif(selfBIAS_VECTOR[candidate]==2)

                                                              candidates_rank[candidate] = self_sortear(selfdisliked)

                                                              elif(selfBIAS_VECTOR[candidate]==1)

                                                              candidates_rank[candidate] = self_sortear(selfhated)

                                                              elif(selfBIAS_VECTOR[candidate]==-1)

                                                              candidates_rank[candidate] = self_sortear(selfpolarizer

                                                              )

                                                              elif(selfBIAS_VECTOR[candidate]==-2)

                                                              candidates_rank[candidate] = self_sortear(self

                                                              more_polarizer)

                                                              else

                                                              candidates_rank[candidate] = self_sortear(selfneutral)

                                                              selfvotersappend(candidates_rank)

                                                              else

                                                              ranges = []

                                                              ranks = []

                                                              for prof in selfvoter_profiles

                                                              rangesappend(int(prof[pop_percentage]))

                                                              rank =

                                                              for index score in enumerate(prof[scores])

                                                              rank[index] = score

                                                              ranksappend(rank)

                                                              for index _range in enumerate(ranges)

                                                              for _ in range(int(selfN_VOTERS(_range100)))

                                                              selfvotersappend(ranks[index])

                                                              68

                                                              APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                                              Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                                              for i in range(selfN_CANDIDATES)

                                                              selfcandidates[i] = 0

                                                              selfvotes[i] = set()

                                                              APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                                              Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                                              for candidate in range(selfN_CANDIDATES)

                                                              rating_sum = 0

                                                              for voter in selfvoters

                                                              rating_sum += voter[candidate]

                                                              selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                                              APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                                              Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                                              if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                                              return selfcalculate_mean(winners)

                                                              else

                                                              chose_best = True if winners[0] == selfbest_candidate else

                                                              False

                                                              return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                                              69

                                                              APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                                              Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                                              rating_sum = 0

                                                              for voter in selfvoters

                                                              for candidate in winners

                                                              rating_sum += voter[candidate]

                                                              return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                                              APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                                              Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                                              for i in range(1 selfN_VACANCIES + 2)

                                                              selfleading_candidatesappend(selfsorted_candidates[-i][self

                                                              CANDIDATE_INDEX])

                                                              APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                                              Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                                              for leader in selfelecrounds[-1]

                                                              selfleading_candidatesappend(leader[0])

                                                              70

                                                              APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                                              Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                                              self_account_for_coalitions()

                                                              for voter in selfvoters

                                                              selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                                              (1)))

                                                              temp = []

                                                              for voter in selfsorted_voters

                                                              new_dict = defaultdict(list)

                                                              for k in voter

                                                              new_dict[k[1]]append(k[0])

                                                              tempappend(new_dict)

                                                              selfsorted_voters = []

                                                              for voter_index current_voter in enumerate(temp)

                                                              new_voter = []

                                                              for rating candidate_indexes in current_voteritems()

                                                              if len(current_voter[rating]) gt 1

                                                              shuffle(current_voter[rating])

                                                              for e in candidate_indexes

                                                              new_voterappend((e rating))

                                                              else

                                                              new_voterappend((candidate_indexes[0] rating))

                                                              selfsorted_votersappend(new_voter)

                                                              selfcandidates[new_voter[-1][0]] += 1

                                                              selfvotes[new_voter[-1][0]]add(voter_index)

                                                              71

                                                              APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                                              Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                                              for candidate in selfvotes_copy

                                                              if candidate not in selfelecleading_candidates

                                                              for voter_index in selfvotes_copy[candidate]

                                                              for index _candidate in enumerate(reversed(selfelec

                                                              sorted_voters[voter_index]))

                                                              if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                                              leading_candidates

                                                              if randomrandom() lt selfelec

                                                              tactical_vote_percentages[_candidate[selfelec

                                                              CANDIDATE_INDEX]]

                                                              selfrankings_changed[voter_index] = copy

                                                              deepcopy(selfelecsorted_voters[voter_index])

                                                              selfrankings_changed[voter_index][-(index + 1)]

                                                              selfrankings_changed[voter_index][-1] = self

                                                              rankings_changed[voter_index][-1] self

                                                              rankings_changed[voter_index][-(index + 1)]

                                                              selfcandidates[candidate] -= 1

                                                              selfcandidates[_candidate[selfelec

                                                              CANDIDATE_INDEX]] += 1

                                                              selfvotes[candidate]remove(voter_index)

                                                              selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                                              ]]add(voter_index)

                                                              break

                                                              break

                                                              72

                                                              APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                                              Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                                              half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                                              for candidate in selfelecleading_candidates

                                                              if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                                              continue

                                                              for voter_index in selfvotes_copy[candidate]

                                                              if voter_index in selfrankings_changed

                                                              ranking = selfrankings_changed[voter_index]

                                                              else

                                                              ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                                              ])

                                                              for index _candidate in enumerate(reversed(ranking))

                                                              if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                              leading_candidates or (_candidate[selfelec

                                                              CANDIDATE_INDEX] in selfelecleading_candidates and

                                                              selfelecleading_candidatesindex(_candidate[selfelec

                                                              CANDIDATE_INDEX]) gt= half_vacancies)

                                                              if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                                              if randomrandom() lt selfelec

                                                              minority_vote_percentages[_candidate[selfelec

                                                              CANDIDATE_INDEX]]

                                                              selfcandidates[candidate] -= 1

                                                              selfcandidates[_candidate[selfelec

                                                              CANDIDATE_INDEX]] += 1

                                                              break

                                                              break

                                                              break

                                                              73

                                                              APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                                              Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                                              self_account_for_coalitions()

                                                              for candidate in selfvotes

                                                              if candidate = selfwinner and candidate = selfsecond_place

                                                              for voter_index in selfvotes[candidate]

                                                              if voter_index in selfrankings_changed

                                                              ranking = selfrankings_changed[voter_index]

                                                              else

                                                              ranking = copydeepcopy(selfelecsorted_voters[

                                                              voter_index])

                                                              for index2 candidate in enumerate(reversed(ranking))

                                                              if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                                              selfcandidates[selfwinner] += 1

                                                              selfvotes[selfwinner]add(voter_index)

                                                              break

                                                              elif candidate[selfelecCANDIDATE_INDEX] == self

                                                              second_place

                                                              selfcandidates[selfsecond_place] += 1

                                                              selfvotes[selfsecond_place]add(voter_index)

                                                              break

                                                              selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                              winners = []

                                                              vacancies = selfelecN_VACANCIES

                                                              for candidate in reversed(selfsorted_candidates)

                                                              if vacancies == 0

                                                              break

                                                              winnersappend(candidate[0])

                                                              vacancies -= 1

                                                              mean chose_best = selfelecget_mean(winners = winners)

                                                              74

                                                              APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                                              Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                                              for voter_index voter in enumerate(selfelecsorted_voters)

                                                              voter_dict = dict()

                                                              og_voter_dict = dict()

                                                              for tup in voter

                                                              voter_dict[tup[0]] = tup[1]

                                                              og_voter_dict[tup[0]] = tup[1]

                                                              for coalition in selfeleccoalitions

                                                              for candidate in coalition

                                                              add_to_score = 0

                                                              for candidate2 in coalition

                                                              if candidate == candidate2

                                                              continue

                                                              half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                                              if half lt 0

                                                              add_to_score += mathceil(half)

                                                              else

                                                              add_to_score += mathfloor(half)

                                                              if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                                              voter_dict[candidate[rsquovaluersquo]] = 10

                                                              elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                                              voter_dict[candidate[rsquovaluersquo]] = -10

                                                              else

                                                              voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                                              selfrankings_changed[voter_index] = []

                                                              for candidate in voter_dict

                                                              selfrankings_changed[voter_index]append((candidate voter_dict[

                                                              candidate]))

                                                              selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                                              voter_index] key=lambda x x[1])

                                                              75

                                                              APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                              Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                              selfelecroundsappend(selfsorted_candidates[_round])

                                                              if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                              N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                              N_VACANCIES - 1)

                                                              return 2

                                                              elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                              N_VOTERS gt 05)

                                                              return 1

                                                              else

                                                              selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                              CANDIDATE_INDEX])

                                                              for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                              elecCANDIDATE_INDEX]]

                                                              if voter_index in selfrankings_changed

                                                              for candidate in reversed(selfrankings_changed[voter_index

                                                              ])

                                                              if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                              excluded

                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                              ]] += 1

                                                              selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                              add(voter_index)

                                                              break

                                                              else

                                                              continue

                                                              else

                                                              for candidate in reversed(selfelecsorted_voters[

                                                              voter_index])

                                                              if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                              excluded

                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                              ]] += 1

                                                              selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                              add(voter_index)

                                                              break

                                                              else

                                                              continue

                                                              selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                              return 0

                                                              76

                                                              APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                              Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                              for index in range(selfelecN_CANDIDATES)

                                                              selfcandidates[index] = 0

                                                              for voter in selfelecsorted_voters

                                                              for candidate in reversed(voter)

                                                              if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                              else

                                                              break

                                                              APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                              Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                              for index in range(selfelecN_CANDIDATES)

                                                              selfcandidates[index] = 0

                                                              for voter in selfelecsorted_voters

                                                              if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                              elecCANDIDATE_INDEX]]

                                                              selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                              else

                                                              for candidate in reversed(voter)

                                                              if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                              else

                                                              break

                                                              77

                                                              APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                              Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                              pos = set()

                                                              for index perc in enumerate(selfelectactical_vote_percentages)

                                                              if perc gt 0

                                                              posadd(index)

                                                              for candidate in selfeleccandidates

                                                              if candidate not in selfleading_candidates

                                                              for voter_index in selfvotes[candidate]

                                                              raised = None

                                                              for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                              ])

                                                              if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                              leading_candidates

                                                              if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                              if randomrandom() lt selfelectactical_vote_percentages[

                                                              candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                              ranking = [None]selfelecN_CANDIDATES

                                                              ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                              selfelecvoters[voter_index][candidate_tuple[selfelec

                                                              CANDIDATE_INDEX]])

                                                              raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                              break

                                                              break

                                                              break

                                                              if raised = None

                                                              for _candidate in selfleading_candidates

                                                              if _candidate = ranking[-1][0]

                                                              ranking[0] = (_candidate selfelecvoters[voter_index][

                                                              _candidate])

                                                              buried = _candidate

                                                              break

                                                              i = 1

                                                              for candidate_tuple in selfelecsorted_voters[voter_index]

                                                              if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                              buried]

                                                              continue

                                                              else

                                                              ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                              selfelecvoters[voter_index][candidate_tuple[selfelec

                                                              CANDIDATE_INDEX]])

                                                              i += 1

                                                              selfrankings_changed[voter_index] = ranking

                                                              78

                                                              APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                              Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                              for voter_index in selfvotes[candidate]

                                                              if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                              ]

                                                              for _candidate in selfleading_candidates

                                                              if _candidate = candidate

                                                              ranking = [None]selfelecN_CANDIDATES

                                                              ranking[0] = (_candidate selfelecvoters[voter_index][

                                                              _candidate])

                                                              buried = _candidate

                                                              break

                                                              i = 1

                                                              for candidate_tuple in selfelecsorted_voters[voter_index]

                                                              if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                              continue

                                                              else

                                                              ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                              selfelecvoters[voter_index][candidate_tuple[selfelec

                                                              CANDIDATE_INDEX]])

                                                              i += 1

                                                              selfrankings_changed[voter_index] = ranking

                                                              79

                                                              APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                              Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                              for index in range(selfelecN_CANDIDATES)

                                                              selfcandidates[index] = 0

                                                              for voter_index voter in enumerate(selfelecsorted_voters)

                                                              score = 0

                                                              if voter_index in selfrankings_changed

                                                              for candidate in selfrankings_changed[voter_index]

                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                              score += 1

                                                              else

                                                              for candidate in voter

                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                              score += 1

                                                              APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                              Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                              for voter_index voter in enumerate(selfelecsorted_voters)

                                                              if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                              elecCANDIDATE_INDEX]]

                                                              selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                              sorted_voters[voter_index])

                                                              for candidate_index candidate in enumerate(reversed(voter))

                                                              if candidate_index == 0

                                                              selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                              voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                              else

                                                              selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                              voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                              80

                                                              APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                              Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                              for index in range(selfelecN_CANDIDATES)

                                                              selfcandidates[index] = 0

                                                              for voter_index voter in enumerate(selfelecsorted_voters)

                                                              if voter_index in selfrankings_changed

                                                              for candidate in selfrankings_changed[voter_index]

                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                              selfelecCANDIDATE_RANK]

                                                              else

                                                              for candidate in voter

                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                              selfelecCANDIDATE_RANK]

                                                              APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                              Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                              for index in range(selfelecN_CANDIDATES)

                                                              selfcandidates[index] = 0

                                                              for voter in selfelecsorted_voters

                                                              votes = selfelecN_VACANCIES

                                                              for candidate in reversed(voter)

                                                              if votes == 0

                                                              break

                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                              votes -= 1

                                                              • Folha de aprovaccedilatildeo
                                                              • Agradecimentos
                                                              • Epiacutegrafe
                                                              • Resumo
                                                              • Abstract
                                                              • Lista de ilustraccedilotildees
                                                              • Lista de Coacutedigos
                                                              • Lista de tabelas
                                                              • Lista de abreviaturas e siglas
                                                              • Sumaacuterio
                                                              • INTRODUCcedilAtildeO
                                                                • MOTIVACcedilAtildeO E OBJETIVO
                                                                • MEacuteTODO
                                                                • ESTRUTURA
                                                                  • SISTEMAS ELEITORAIS
                                                                    • FISRT PAST THE POST
                                                                      • Exemplo
                                                                      • Vantagens e Desvantagens do FPTP
                                                                      • Voto Uacutetil no FPTP
                                                                        • TWO-ROUND SYSTEM
                                                                          • Exemplo
                                                                          • Vantagens e Desvantagens do TRS
                                                                          • Voto Uacutetil no TRS
                                                                            • INSTANT-RUNOFF VOTING
                                                                              • Exemplo
                                                                              • Vantagens e Desvantagens do IRV
                                                                              • Voto Uacutetil no IRV
                                                                                • APPROVAL VOTING SYSTEM
                                                                                  • Exemplo
                                                                                  • Vantagens e Desvantagens do AVS
                                                                                  • Voto Uacutetil no AVS
                                                                                    • THE BORDA COUNT
                                                                                      • Exemplo
                                                                                      • Vantagens e Desvantagens do BC
                                                                                      • Voto Uacutetil no BC
                                                                                        • SCORE VOTING SYSTEM
                                                                                          • Exemplo
                                                                                          • Vantagens e Desvantagens do SVS
                                                                                          • Voto Uacutetil no SVS
                                                                                            • BLOC VOTE
                                                                                              • Exemplo
                                                                                              • Voto Uacutetil no BV
                                                                                                  • O SIMULADOR
                                                                                                  • CENAacuteRIOS PERTINENTES
                                                                                                    • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                    • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                    • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                    • CENAacuteRIO 4 COALIZOtildeES
                                                                                                    • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                    • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                      • COMO FUNCIONA O SIMULADOR
                                                                                                        • CLASSE Elections
                                                                                                        • CLASSE FirstPastThePost
                                                                                                        • CLASSE TwoRoundSystem
                                                                                                        • CLASSE InstantRunoffVoting
                                                                                                        • CLASSE ApprovalVoting
                                                                                                        • CLASSE BordaCount
                                                                                                        • CLASSE ScoreVoting
                                                                                                        • CLASSE BlocVote
                                                                                                        • TECNOLOGIAS UTILIZADAS
                                                                                                          • CONCLUSAtildeO
                                                                                                          • Referecircncias
                                                                                                          • Meacutetodo create_voters
                                                                                                          • Meacutetodo create_candidates
                                                                                                          • Meacutetodo calculate_means
                                                                                                          • Meacutetodo get_mean
                                                                                                          • Meacutetodo calculate_mean
                                                                                                          • Meacutetodo set_leading_candidates
                                                                                                          • Meacutetodo irv_set_leading_candidates
                                                                                                          • Meacutetodo sort_ranks
                                                                                                          • Meacutetodo fptp_count_tactical_votes
                                                                                                          • Meacutetodo fptp_count_minority_votes
                                                                                                          • Meacutetodo trs_second_round
                                                                                                          • Meacutetodo trs_account_for_coalitions
                                                                                                          • Meacutetodo irv_count_votes
                                                                                                          • Meacutetodo avs_count_votes
                                                                                                          • Meacutetodo avs_count_votes_with_tactical
                                                                                                          • Meacutetodo irv_apply_tactical_votes
                                                                                                          • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                          • Meacutetodo bc_sum_candidates_scores
                                                                                                          • Meacutetodo svs_apply_tactical_votes
                                                                                                          • Meacutetodo svs_sum_candidates_scores
                                                                                                          • Meacutetodo bv_count_votes

                                                                32

                                                                Figura 5 ndash Captura de tela 4

                                                                Figura 6 ndash Captura de tela 5

                                                                33

                                                                Figura 7 ndash Captura de tela 6

                                                                Apoacutes a criaccedilatildeo dos candidatos o usuaacuterio pode criar perfis de eleitores que definiratildeo demaneira exata como partes da populaccedilatildeo iraacute votar (Figura 5) Em cada perfil se defineo valor em porcentos da populaccedilatildeo votante que o adotaraacute e a nota de cada candidatoTambeacutem eacute possiacutevel nomear cada perfil livremente

                                                                No modo Generate (Figura 6) eacute onde o gerador de nuacutemeros pseudoaleatoacuterios eacute usadoNesse modo ao inveacutes do usuaacuterio criar perfis de eleitores ele define qual seraacute a distribuiccedilatildeoadotada para a geraccedilatildeo de notas de cada candidato Essas distribuiccedilotildees seratildeo mais bemdetalhadas no Capiacutetulo 5 Da mesma maneira que no modo Manipulate nesse modotambeacutem eacute possiacutevel definir os valores para os dois tipos de voto uacutetil os votos taacuteticos eos votos de minoria No primeiro estatildeo incluiacutedas as estrateacutegias de mudanccedila de votoespeciacuteficas de cada sistema como o bullet voting no AVS e SVS ou quando a preferecircnciade um eleitor claramente natildeo possui chances de vitoacuteria e ele muda seu voto para um doscandidatos que esteja na lideranccedila o que ocorre no FPTP e TRS O voto de minoriase apresenta apenas no FPTP em eleiccedilotildees onde mais de um candidato eacute eleito Se apreferecircncia de um eleitor claramente lidera a eleiccedilatildeo por ser tambeacutem a preferecircncia damaior parte da populaccedilatildeo esse eleitor pode mudar o seu voto para uma segunda opccedilatildeona esperanccedila de eleger dois de seus candidatos favoritos

                                                                Por fim em ambos os modos o usuaacuterio tem a opccedilatildeo de definir coalizotildees entre oscandidatos se o sistema TRS estiver habilitado pois as coalizotildees apenas se manifestamnesse sistema Essas coalizotildees alteraratildeo as notas dos candidatos dependendo dos outroscandidatos pertencentes a elas (Figura 7)

                                                                A aplicaccedilatildeo pode ser encontrada na paacutegina httpelectionsimpythonanywherecom

                                                                34

                                                                4 CENAacuteRIOS PERTINENTES

                                                                Para todos os cenaacuterios deste capiacutetulo seraacute usada a seed do simulador igual a 100 e apopulaccedilatildeo de eleitores igual a 1000 para que exista consistecircncia na anaacutelise e tambeacutem paraque possa haver replicaccedilatildeo dos resultados se necessaacuterio

                                                                41 CENAacuteRIO 1 VOTO TAacuteTICO

                                                                Neste exemplo teremos quatro candidatos Ana Beto Carla e Diego Ana e Betoseratildeo gerados a partir da distribuiccedilatildeo Neutral (Figura 47) Carla da distribuiccedilatildeo Disliked(Figura 51) e Diego da Hated (Figura 55) Para a simulaccedilatildeo com a seed 100 o melhorcandidato a ser eleito ou seja aquele que maximiza a meacutedia das notas dos eleitores eacute oBeto com uma meacutedia de 0073 Para cada sistema seratildeo comparados os resultados semvoto taacutetico aos com 20 de voto taacutetico a favor da Ana Abaixo se encontram osresultados para o sistema FPTP

                                                                Figura 8 ndash FPTP - Cenaacuterio 1 sem voto taacutetico

                                                                Figura 9 ndash TRS segundo turno - Cenaacuterio 1 sem voto taacutetico

                                                                35

                                                                Figura 10 ndash IRV primeiro turno - Cenaacuterio 1

                                                                Figura 11 ndash IRV segundo turno - Cenaacuterio 1

                                                                Figura 12 ndash IRV terceiro turno - Cenaacuterio 1

                                                                36

                                                                Figura 13 ndash AVS - Cenaacuterio 1 sem voto taacutetico

                                                                Figura 14 ndash BC - Cenaacuterio 1 sem voto taacutetico

                                                                Figura 15 ndash SVS - Cenaacuterio 1 sem voto taacutetico

                                                                37

                                                                Nesse cenaacuterio sem voto taacutetico o uacutenico sistema que natildeo elege o Beto eacute o AVS Todosos outros elegem o melhor candidato Ou seja apesar de Beto ter uma melhor meacutediadas notas dos eleitores existem mais eleitores que ranqueiam Ana com uma nota acimade 0 No entanto apenas 20 dos eleitores de Diego e Carla que preferem a Ana aoinveacutes do Beto satildeo o suficiente para fazer Beto natildeo ser eleito se eles decidirem abandonarsua primeira opccedilatildeo e votar na Ana Considerando a vantagem que os votos taacuteticosproporcionam agrave Ana esta eacute eleita em todos os sistemas menos o TRS e o IRV

                                                                Figura 16 ndash FPTP - Cenaacuterio 1 - 20 de voto taacutetico na Ana

                                                                Figura 17 ndash TRS segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                                38

                                                                Figura 18 ndash IRV primeiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                                Figura 19 ndash IRV segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                                Figura 20 ndash IRV terceiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                                39

                                                                Figura 21 ndash AVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                                Figura 22 ndash BC - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                                Figura 23 ndash SVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                                40

                                                                Eacute claro que se os eleitores que preferem o Beto tambeacutem votassem de maneira estra-teacutegica a situaccedilatildeo se equilibraria e haveria o mesmo niacutevel de concorrecircncia entre os doiscandidatos que ocorre quando natildeo haacute voto taacutetico Poreacutem no Borda Count esse equiliacute-brio pode natildeo acontecer e as estrateacutegias de compromising e burying podem acabar saindopela culatra se uma porcentagem elevada dos eleitores as adotarem Abaixo encontram-seos resultados para esse sistema quando 100 dos eleitores de Carla e Diego se comportammaliciosamente

                                                                Figura 24 ndash BC - Cenaacuterio 1 100 de voto taacutetico na Ana e Beto

                                                                Por causa do uso demasiado da estrateacutegia burying Ana e Beto perdem muitos pontose isso abre espaccedilo para uma vitoacuteria da Carla No entanto para porcentagens menores que100 o Beto ainda eacute o vencedor

                                                                Essas duas estrateacutegias tambeacutem foram implementadas nesse simulador para o sistemaIRV e eacute possiacutevel ver como ele eacute resistente a elas Para que seja possiacutevel mudar os resultadosde uma eleiccedilatildeo sob o IRV eacute necessaacuterio mudar a ordem de eliminaccedilatildeo dos candidatos paraque o seu candidato preferido acabe enfrentando um candidato mais fraco nas rodadasfinais Isso natildeo ocorre com compromising e burying No proacuteximo cenaacuterio seraacute analisadacomo eacute possiacutevel modificar os resultados de uma eleiccedilatildeo sob o IRV

                                                                Esses resultados podem ser replicados acessando os linksSem votos taacuteticos lthttpelectionsimpythonanywherecomdirect_res1111110

                                                                --[0021][22Ana2222Beto222022Carla2222Diego22]------100gt

                                                                Com 20 de voto taacutetico lthttpelectionsimpythonanywherecomdirect_res1111110--[0021][22Ana222022Beto2222Carla2222Diego22]1-[02000]---100gt

                                                                Com 100 de voto taacuteticona Ana e Beto lthttpelectionsimpythonanywherecomdirect_res0000100--[0021][22Ana222022Beto222022Carla2222Diego22]1-[101000]---100gt

                                                                41

                                                                42 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV

                                                                Neste cenaacuterio teremos Ana Carla e Beto concorrendo e trecircs perfis distintos que apoiamcada candidato As distribuiccedilotildees de notas dos perfis se encontram na tabela abaixo

                                                                Tabela 12 ndash Distribuiccedilatildeo de notas - Cenaacuterio 2

                                                                Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                                deeleitores

                                                                1 10 5 0 422 0 10 5 303 5 0 10 28

                                                                Com essas distribuiccedilotildees Carla eacute eliminada na primeira rodada e seus 28 de votossatildeo transferidos para a segunda opccedilatildeo de seus eleitores Ana que eacute eleita com 70 dosvotos e uma meacutedia de 56

                                                                Figura 25 ndash IRV primeiro turno - Cenaacuterio 2

                                                                Figura 26 ndash IRV segundo turno - Cenaacuterio 2

                                                                42

                                                                Cientes desse provaacutevel futuro cenaacuterio onde Ana eacute eleita uma pequena parte dos elei-tores de Beto estrategicamente o abandona e decide apoiar Carla na esperanccedila de leva-laao segundo turno contra Ana As novas distribuiccedilotildees de notas se encontram na tabelaabaixo com essa porccedilatildeo de eleitores representada pelo perfil 4

                                                                Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2

                                                                Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                                deeleitores

                                                                1 10 5 0 422 0 10 5 283 5 0 10 284 0 8 10 2

                                                                Essa mudanccedila estrateacutegica de voto altera a ordem de eliminaccedilotildees do sistema com Betosendo o primeiro a ser eliminado Com isso seus votos satildeo naturalmente transferidos paraCarla que derrota Ana no segundo turno com 58 dos votos

                                                                Figura 27 ndash IRV primeiro turno com voto taacutetico - Cenaacuterio 2

                                                                Figura 28 ndash IRV segundo turno com voto taacutetico - Cenaacuterio 2

                                                                43

                                                                Percebendo que a eleiccedilatildeo de Beto natildeo era provaacutevel seus eleitores conseguiram aomenos impedir a eleiccedilatildeo do pior candidato para eles Mas para isso foi necessaacuterio queeles tivessem a informaccedilatildeo de como os outros eleitores votariam Uma aproximaccedilatildeo dessasinformaccedilotildees poderia ser obtida em um cenaacuterio real com poucos candidatos atraveacutes depesquisas eleitorais poreacutem se o nuacutemero de candidatos eacute significativo uma noccedilatildeo completadas distribuiccedilotildees dos rankings dos eleitores se torna muito menos viaacutevel e dificulta aformulaccedilatildeo de estrateacutegias para alterar a ordem em que os candidatos satildeo eliminados

                                                                Esses resultados podem ser replicados acessando os linksSem voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana22

                                                                22Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                                Com voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana

                                                                2222Beto2222Carla22]-----42Voter20Profile2001020520028Voter20Profile2010201020528Voter20Profile202520020102Voter20Profile20302082010100gt

                                                                43 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE

                                                                O interessante dos sistemas IRV e TRS eacute que os resultados do cenaacuterio anterior po-deriam ter sido obtidos ao inveacutes do voto taacutetico pela sua natildeo-monotonicidade Seriapossiacutevel que a Carla derrotasse a Ana no segundo turno atraveacutes do proacuteprio aumento depopularidade da Ana Assumindo que essa popularizaccedilatildeo ocorresse entre os candidatosdo perfil 2 onde 3 passasse a apoiar a Ana ao inveacutes do Beto as novas distribuiccedilotildeesseguiriam a tabela abaixo

                                                                Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                                Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                                deeleitores

                                                                1 10 5 0 452 0 10 5 273 5 0 10 28

                                                                Dessa maneira Beto agora com uma porcentagem dos eleitores menor do que a deCarla seraacute eliminado na primeira rodada e como seus eleitores tecircm a Carla como segundaopccedilatildeo ela receberaacute todos os seus votos e seraacute eleita na segunda rodada As rodadas doIRV podem ser vistas nas figuras 29 e 30

                                                                44

                                                                Figura 29 ndash IRV primeiro turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                                Figura 30 ndash IRV segundo turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                                Tabela 15 ndash Resultados do Cenaacuterio 3Candidato

                                                                eleitoMeacutedia das

                                                                notasAntes da

                                                                popularizaccedilatildeode Ana

                                                                Ana 56

                                                                Apoacutespopularizaccedilatildeo

                                                                de AnaCarla 415

                                                                Os efeitos dessa caracteriacutestica se refletem na satisfaccedilatildeo meacutedia da populaccedilatildeo A Ana eacuteclaramente a melhor candidata e mesmo com o seu ganho de popularidade (ou devido aele) a Carla eacute eleita

                                                                Esses resultados podem ser replicados acessando os linksAntes da popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecom

                                                                direct_res0010000---[22Ana2222Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                                45

                                                                Apoacutes popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana2222Beto2222Carla22]-----45Voter20Profile2001020520027Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                                44 CENAacuteRIO 4 COALIZOtildeES

                                                                O TRS por ser organizado em dois turnos separados normalmente a semanas dedistacircncia um do outro acaba abrindo brecha agrave mudanccedila de opiniatildeo por parte dos eleitorese o desenvolvimento de novas estrateacutegias por parte dos candidatos tais como a coalizatildeocom candidatos jaacute eliminados Com isso em mente nesse cenaacuterio teremos novamenteos quatro candidatos Ana Beto Carla e Diego Os trecircs primeiros seratildeo gerados dadistribuiccedilatildeo Neutral e Diego da distribuiccedilatildeo Disliked

                                                                Figura 31 ndash TRS turno 1 - Cenaacuterio 4

                                                                No TRS normal Ana Beto e Carla possuem com essas distribuiccedilotildees quantidades devotos muito proacuteximas com Beto e Carla indo para o segundo turno Carla estaacute 10 votosatraacutes de Beto e decide aproveitar o espaccedilo de tempo entre os dois turnos para tentaragregar mais votos Com isso Carla se aproxima de Diego e juntos formam uma coalizatildeoNo entanto com sua baixa popularidade Diego acaba ferindo a reputaccedilatildeo de Carla etorna o segundo turno muito mais faacutecil para Beto (Figura 33) Se Carla tivesse buscado osuporte de Ana por outro lado ela se veria vitoriosa no segundo turno e com uma amplavantagem sobre o Beto (Figura 34) Ou ateacute mesmo sem buscar uma coalizatildeo mesmosendo uma corrida apertada Carla teria naturalmente sido eleita (Figura 32)

                                                                Esses resultados podem ser replicados acessando os linksSem coalizotildees lthttpelectionsimpythonanywherecomdirect_res0100000

                                                                --[0002][22Ana222022Beto2222Carla2222Diego22]------100gt

                                                                46

                                                                Figura 32 ndash TRS turno 2 - Cenaacuterio 4

                                                                Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4

                                                                Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4

                                                                47

                                                                Coalizatildeo Carla e Diego lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2203Carla20Diego-100gt

                                                                Coalizatildeo Carla e Ana lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2200Carla20Ana-100gt

                                                                45 CENAacuteRIO 5 DILEMA DO PRISIONEIRO

                                                                Neste cenaacuterio temos uma eleiccedilatildeo de uma vaga com trecircs candidatos concorrentes e trecircsperfis distintos de eleitores que seguiratildeo as seguintes distribuiccedilotildees

                                                                Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5

                                                                Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                                deeleitores

                                                                1 10 -10 5 362 -10 10 5 343 -10 -10 5 30

                                                                Esse contexto nos remete ao notaacutevel dilema do prisioneiro Nele dois prisioneiroscuacutemplices satildeo interrogados individualmente sem poder se comunicar um com o outro ecada um enfrenta o dilema de delatar ou natildeo o seu parceiro Se os dois prisioneirosdecidem se manter calados sobre o crime ambos satildeo sentenciados a um ano de prisatildeo Seapenas um deles dedurar o outro o traidor sai livre enquanto seu parceiro eacute condenadoa trecircs anos Se ambos dedurarem um ao outro eles satildeo condenados juntos a dois anosde prisatildeo Esse dilema eacute uma ideia claacutessica presente no estudo da teoria dos jogos sendooriginalmente elaborada por Merrill Flood e Melvin Dresher em 1950 e mais tarde sendonomeada de dilema dos prisioneiros por Albert W Tucker (POUNDSTONE 1992)

                                                                O que esse dilema nos mostra eacute a tentaccedilatildeo que o indiviacuteduo deteacutem se sua racionalizaccedilatildeoestiver voltada para seus proacuteprios interesses e somente eles em oposiccedilatildeo a pensar no bemdo grupo como um todo Neste cenaacuterio encontramos dois grupos de eleitores expressiva-mente opostos os perfis 1 e 2 Se qualquer uma das preferecircncias desses perfis fosse eleitaisso significaria uma alta rejeiccedilatildeo de maior parte da populaccedilatildeo No entanto eles possuema segunda opccedilatildeo em comum a Carla que por sua vez eacute a preferecircncia do terceiro perfilPortanto a eleiccedilatildeo da Carla seria logicamente o resultado oacutetimo

                                                                Mesmo assim a Ana eacute eleita nos dois sistemas acima o que natildeo parece justo poispela tabela 16 eacute evidente que apenas 36 da populaccedilatildeo a aprova enquanto que os outros64 a reprovam ao maacuteximo O sistema IRV se comporta de maneira idecircntica ao TRS

                                                                48

                                                                Figura 35 ndash FPTP - Cenaacuterio 5

                                                                Figura 36 ndash TRS segundo turno - Cenaacuterio 5

                                                                nesta situaccedilatildeo Com esse resultado a meacutedia das notas eacute -28 No entanto os trecircs sistemasseguintes nos apresentam resultados diferentes

                                                                Tabela 17 ndash Resultados do Cenaacuterio 5

                                                                Sistema Candidatoeleito

                                                                Meacutedia dasnotas

                                                                FPTP Ana -28TRS Ana -28IRV Ana -28AVS Carla 50BC Carla 50SVS Carla 50

                                                                49

                                                                Figura 37 ndash AVS - Cenaacuterio 5

                                                                Figura 38 ndash BC - Cenaacuterio 5

                                                                Tanto o AVS quanto o Borda Count e o SVS satildeo sistemas que consideram todasas opiniotildees de cada eleitor ao mesmo tempo e por isso satildeo capazes de eleger o melhorcandidato nesta situaccedilatildeo diferentemente do TRS que natildeo absorve completamente todosentimento do eleitor por todos os candidatos e o IRV que apesar de ser bem expressivoquebra esse processo em inuacutemeras rodadas o que permite a perda de informaccedilatildeo ao longodelas

                                                                Esses resultados podem ser replicados acessando o linklthttpelectionsimpythonanywherecomdirect_res1111110---[22Ana

                                                                222022Beto222022Carla22]-----36Voter20Profile2001020-1020534Voter20Profile201-10201020530Voter20Profile202-1020-10205100gt

                                                                50

                                                                Figura 39 ndash SVS - Cenaacuterio 5

                                                                46 CENAacuteRIO 6 VOTO DE MINORIA

                                                                Neste cenaacuterio temos uma eleiccedilatildeo com quatro candidatos e duas vagas A Ana seraacutea preferecircncia de uma extensa parte da populaccedilatildeo (distribuiccedilatildeo Loved Figura 53) Betoe Carla seratildeo candidatos razoavelmente populares (distribuiccedilatildeo Neutral Figura 47) eDiego seraacute a preferecircncia de apenas um pequeno grupo especiacutefico e rejeitado pela maioria(distribuiccedilatildeo Disliked Figura 51) Eacute intuitivo esperar que os dois candidatos eleitos seratildeoa Ana e ou o Beto ou a Carla e isso eacute exatamente o que ocorre na figura 40 no sistemaFPTP sem voto de minoria

                                                                Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria

                                                                Eacute evidente a discrepacircncia da quantidade de votos da Ana para os outros candidatose apesar de Beto e Carla serem mais populares que Diego os trecircs natildeo se encontrammuito afastados Poreacutem se a pequena fraccedilatildeo de candidatos que possuem a Ana como

                                                                51

                                                                Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego

                                                                preferecircncia e Diego como segunda opccedilatildeo optarem pelo voto de minoria a situaccedilatildeo mudacompletamente (Figura 41) Assim apesar de extensamente rejeitado Diego conquistaa segunda vaga e a meacutedia das notas despenca de 2929 para 0505 No entanto aindaexiste um cenaacuterio pior Se os outros grupos de eleitores pensarem da mesma forma eevitarem votar na Ana achando que sua eleiccedilatildeo jaacute estaacute assegurada apenas 80 de votode minoria para esses grupos jaacute eacute o suficiente para eliminaacute-la das eleiccedilotildees (Figura 42)Com a Ana eliminada a meacutedia das notas cai ainda mais para 0058

                                                                Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego

                                                                O sistema Bloc Vote eacute uma das soluccedilotildees para o voto de minoria Permitindo queos eleitores votem no mesmo nuacutemero de candidatos que de vagas a serem preenchidasnatildeo existe o iacutempeto a esse tipo de voto estrateacutegico O resultado desse sistema portantoretorna a meacutedia das notas a casa dos 29 (Figura 43) Os sistemas AVS Borda Count eSVS tambeacutem impedem a presenccedila do voto de minoria e atingem resultados semelhantes

                                                                52

                                                                Figura 43 ndash BV - Cenaacuterio 6

                                                                Tabela 18 ndash Resultados do Cenaacuterio 6

                                                                Sistema Candidatoseleitos

                                                                Meacutedia dasnotas

                                                                FPTP sem voto de minoriaAna eBeto 2929

                                                                FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

                                                                FPTP com 80 de voto de minoriaBeto eCarla 0058

                                                                Bloc VoteAna eCarla 2913

                                                                Esses resultados podem ser replicados acessando os links

                                                                Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

                                                                100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

                                                                80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

                                                                53

                                                                5 COMO FUNCIONA O SIMULADOR

                                                                O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

                                                                51 CLASSE ELECTIONS

                                                                Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

                                                                bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

                                                                Figura 44 ndash estrutura candidates

                                                                bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

                                                                bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

                                                                Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

                                                                Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

                                                                54

                                                                Figura 45 ndash estrutura voters

                                                                Figura 46 ndash estrutura votes

                                                                daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

                                                                Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

                                                                55

                                                                Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

                                                                Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

                                                                na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

                                                                56

                                                                Figura 49 ndash PDF - Distribuiccedilatildeo Liked

                                                                Figura 50 ndash CDF - Distribuiccedilatildeo Liked

                                                                (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

                                                                Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

                                                                57

                                                                Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

                                                                Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

                                                                candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

                                                                Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

                                                                58

                                                                Figura 53 ndash PDF - Distribuiccedilatildeo Loved

                                                                Figura 54 ndash CDF - Distribuiccedilatildeo Loved

                                                                funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

                                                                59

                                                                Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                                                                Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                                                                Meacutedia das Notas sumei

                                                                sumvj nij

                                                                etimes v

                                                                Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                                                                Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                                                                60

                                                                Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                                                                Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                                                                52 CLASSE FIRSTPASTTHEPOST

                                                                Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                                                                Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                                                                61

                                                                Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                                                                Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                                                                mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                                                                62

                                                                53 CLASSE TWOROUNDSYSTEM

                                                                A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                                                                54 CLASSE INSTANTRUNOFFVOTING

                                                                A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                                                                Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                                                                63

                                                                cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                                                                55 CLASSE APPROVALVOTING

                                                                Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                                                                56 CLASSE BORDACOUNT

                                                                Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                                                                57 CLASSE SCOREVOTING

                                                                De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                                                                64

                                                                58 CLASSE BLOCVOTE

                                                                O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                                                                59 TECNOLOGIAS UTILIZADAS

                                                                A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                                                                Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                                                                O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                                                                Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                                                                65

                                                                6 CONCLUSAtildeO

                                                                Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                                                                Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                                                                Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                                                                Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                                                                Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                                                                66

                                                                REFEREcircNCIAS

                                                                AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                                                                Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                                                                Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                                                                Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                                                                HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                                                                LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                                                                ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                                                                Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                                                                POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                                                                The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                                                                67

                                                                APEcircNDICES

                                                                APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                                                Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                                                if(not len(selfvoter_profiles))

                                                                for voter in range(selfN_VOTERS)

                                                                candidates_rank = dict()

                                                                for candidate in reversed(range(selfN_CANDIDATES))

                                                                if(selfBIAS_VECTOR[candidate]==4)

                                                                candidates_rank[candidate] = self_sortear(selfloved)

                                                                elif(selfBIAS_VECTOR[candidate]==3)

                                                                candidates_rank[candidate] = self_sortear(selfliked)

                                                                elif(selfBIAS_VECTOR[candidate]==2)

                                                                candidates_rank[candidate] = self_sortear(selfdisliked)

                                                                elif(selfBIAS_VECTOR[candidate]==1)

                                                                candidates_rank[candidate] = self_sortear(selfhated)

                                                                elif(selfBIAS_VECTOR[candidate]==-1)

                                                                candidates_rank[candidate] = self_sortear(selfpolarizer

                                                                )

                                                                elif(selfBIAS_VECTOR[candidate]==-2)

                                                                candidates_rank[candidate] = self_sortear(self

                                                                more_polarizer)

                                                                else

                                                                candidates_rank[candidate] = self_sortear(selfneutral)

                                                                selfvotersappend(candidates_rank)

                                                                else

                                                                ranges = []

                                                                ranks = []

                                                                for prof in selfvoter_profiles

                                                                rangesappend(int(prof[pop_percentage]))

                                                                rank =

                                                                for index score in enumerate(prof[scores])

                                                                rank[index] = score

                                                                ranksappend(rank)

                                                                for index _range in enumerate(ranges)

                                                                for _ in range(int(selfN_VOTERS(_range100)))

                                                                selfvotersappend(ranks[index])

                                                                68

                                                                APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                                                Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                                                for i in range(selfN_CANDIDATES)

                                                                selfcandidates[i] = 0

                                                                selfvotes[i] = set()

                                                                APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                                                Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                                                for candidate in range(selfN_CANDIDATES)

                                                                rating_sum = 0

                                                                for voter in selfvoters

                                                                rating_sum += voter[candidate]

                                                                selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                                                APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                                                Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                                                if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                                                return selfcalculate_mean(winners)

                                                                else

                                                                chose_best = True if winners[0] == selfbest_candidate else

                                                                False

                                                                return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                                                69

                                                                APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                                                Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                                                rating_sum = 0

                                                                for voter in selfvoters

                                                                for candidate in winners

                                                                rating_sum += voter[candidate]

                                                                return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                                                APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                                                Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                                                for i in range(1 selfN_VACANCIES + 2)

                                                                selfleading_candidatesappend(selfsorted_candidates[-i][self

                                                                CANDIDATE_INDEX])

                                                                APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                                                Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                                                for leader in selfelecrounds[-1]

                                                                selfleading_candidatesappend(leader[0])

                                                                70

                                                                APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                                                Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                                                self_account_for_coalitions()

                                                                for voter in selfvoters

                                                                selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                                                (1)))

                                                                temp = []

                                                                for voter in selfsorted_voters

                                                                new_dict = defaultdict(list)

                                                                for k in voter

                                                                new_dict[k[1]]append(k[0])

                                                                tempappend(new_dict)

                                                                selfsorted_voters = []

                                                                for voter_index current_voter in enumerate(temp)

                                                                new_voter = []

                                                                for rating candidate_indexes in current_voteritems()

                                                                if len(current_voter[rating]) gt 1

                                                                shuffle(current_voter[rating])

                                                                for e in candidate_indexes

                                                                new_voterappend((e rating))

                                                                else

                                                                new_voterappend((candidate_indexes[0] rating))

                                                                selfsorted_votersappend(new_voter)

                                                                selfcandidates[new_voter[-1][0]] += 1

                                                                selfvotes[new_voter[-1][0]]add(voter_index)

                                                                71

                                                                APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                                                Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                                                for candidate in selfvotes_copy

                                                                if candidate not in selfelecleading_candidates

                                                                for voter_index in selfvotes_copy[candidate]

                                                                for index _candidate in enumerate(reversed(selfelec

                                                                sorted_voters[voter_index]))

                                                                if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                                                leading_candidates

                                                                if randomrandom() lt selfelec

                                                                tactical_vote_percentages[_candidate[selfelec

                                                                CANDIDATE_INDEX]]

                                                                selfrankings_changed[voter_index] = copy

                                                                deepcopy(selfelecsorted_voters[voter_index])

                                                                selfrankings_changed[voter_index][-(index + 1)]

                                                                selfrankings_changed[voter_index][-1] = self

                                                                rankings_changed[voter_index][-1] self

                                                                rankings_changed[voter_index][-(index + 1)]

                                                                selfcandidates[candidate] -= 1

                                                                selfcandidates[_candidate[selfelec

                                                                CANDIDATE_INDEX]] += 1

                                                                selfvotes[candidate]remove(voter_index)

                                                                selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                                                ]]add(voter_index)

                                                                break

                                                                break

                                                                72

                                                                APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                                                Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                                                half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                                                for candidate in selfelecleading_candidates

                                                                if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                                                continue

                                                                for voter_index in selfvotes_copy[candidate]

                                                                if voter_index in selfrankings_changed

                                                                ranking = selfrankings_changed[voter_index]

                                                                else

                                                                ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                                                ])

                                                                for index _candidate in enumerate(reversed(ranking))

                                                                if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                leading_candidates or (_candidate[selfelec

                                                                CANDIDATE_INDEX] in selfelecleading_candidates and

                                                                selfelecleading_candidatesindex(_candidate[selfelec

                                                                CANDIDATE_INDEX]) gt= half_vacancies)

                                                                if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                                                if randomrandom() lt selfelec

                                                                minority_vote_percentages[_candidate[selfelec

                                                                CANDIDATE_INDEX]]

                                                                selfcandidates[candidate] -= 1

                                                                selfcandidates[_candidate[selfelec

                                                                CANDIDATE_INDEX]] += 1

                                                                break

                                                                break

                                                                break

                                                                73

                                                                APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                                                Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                                                self_account_for_coalitions()

                                                                for candidate in selfvotes

                                                                if candidate = selfwinner and candidate = selfsecond_place

                                                                for voter_index in selfvotes[candidate]

                                                                if voter_index in selfrankings_changed

                                                                ranking = selfrankings_changed[voter_index]

                                                                else

                                                                ranking = copydeepcopy(selfelecsorted_voters[

                                                                voter_index])

                                                                for index2 candidate in enumerate(reversed(ranking))

                                                                if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                                                selfcandidates[selfwinner] += 1

                                                                selfvotes[selfwinner]add(voter_index)

                                                                break

                                                                elif candidate[selfelecCANDIDATE_INDEX] == self

                                                                second_place

                                                                selfcandidates[selfsecond_place] += 1

                                                                selfvotes[selfsecond_place]add(voter_index)

                                                                break

                                                                selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                winners = []

                                                                vacancies = selfelecN_VACANCIES

                                                                for candidate in reversed(selfsorted_candidates)

                                                                if vacancies == 0

                                                                break

                                                                winnersappend(candidate[0])

                                                                vacancies -= 1

                                                                mean chose_best = selfelecget_mean(winners = winners)

                                                                74

                                                                APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                                                Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                                                for voter_index voter in enumerate(selfelecsorted_voters)

                                                                voter_dict = dict()

                                                                og_voter_dict = dict()

                                                                for tup in voter

                                                                voter_dict[tup[0]] = tup[1]

                                                                og_voter_dict[tup[0]] = tup[1]

                                                                for coalition in selfeleccoalitions

                                                                for candidate in coalition

                                                                add_to_score = 0

                                                                for candidate2 in coalition

                                                                if candidate == candidate2

                                                                continue

                                                                half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                                                if half lt 0

                                                                add_to_score += mathceil(half)

                                                                else

                                                                add_to_score += mathfloor(half)

                                                                if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                                                voter_dict[candidate[rsquovaluersquo]] = 10

                                                                elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                                                voter_dict[candidate[rsquovaluersquo]] = -10

                                                                else

                                                                voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                                                selfrankings_changed[voter_index] = []

                                                                for candidate in voter_dict

                                                                selfrankings_changed[voter_index]append((candidate voter_dict[

                                                                candidate]))

                                                                selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                                                voter_index] key=lambda x x[1])

                                                                75

                                                                APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                                Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                                selfelecroundsappend(selfsorted_candidates[_round])

                                                                if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                                N_VACANCIES - 1)

                                                                return 2

                                                                elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                N_VOTERS gt 05)

                                                                return 1

                                                                else

                                                                selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                                CANDIDATE_INDEX])

                                                                for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                                elecCANDIDATE_INDEX]]

                                                                if voter_index in selfrankings_changed

                                                                for candidate in reversed(selfrankings_changed[voter_index

                                                                ])

                                                                if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                excluded

                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                ]] += 1

                                                                selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                add(voter_index)

                                                                break

                                                                else

                                                                continue

                                                                else

                                                                for candidate in reversed(selfelecsorted_voters[

                                                                voter_index])

                                                                if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                excluded

                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                ]] += 1

                                                                selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                add(voter_index)

                                                                break

                                                                else

                                                                continue

                                                                selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                return 0

                                                                76

                                                                APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                                Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                                for index in range(selfelecN_CANDIDATES)

                                                                selfcandidates[index] = 0

                                                                for voter in selfelecsorted_voters

                                                                for candidate in reversed(voter)

                                                                if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                else

                                                                break

                                                                APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                                Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                                for index in range(selfelecN_CANDIDATES)

                                                                selfcandidates[index] = 0

                                                                for voter in selfelecsorted_voters

                                                                if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                elecCANDIDATE_INDEX]]

                                                                selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                                else

                                                                for candidate in reversed(voter)

                                                                if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                else

                                                                break

                                                                77

                                                                APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                                Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                                pos = set()

                                                                for index perc in enumerate(selfelectactical_vote_percentages)

                                                                if perc gt 0

                                                                posadd(index)

                                                                for candidate in selfeleccandidates

                                                                if candidate not in selfleading_candidates

                                                                for voter_index in selfvotes[candidate]

                                                                raised = None

                                                                for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                                ])

                                                                if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                                leading_candidates

                                                                if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                                if randomrandom() lt selfelectactical_vote_percentages[

                                                                candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                                ranking = [None]selfelecN_CANDIDATES

                                                                ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                CANDIDATE_INDEX]])

                                                                raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                break

                                                                break

                                                                break

                                                                if raised = None

                                                                for _candidate in selfleading_candidates

                                                                if _candidate = ranking[-1][0]

                                                                ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                _candidate])

                                                                buried = _candidate

                                                                break

                                                                i = 1

                                                                for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                                buried]

                                                                continue

                                                                else

                                                                ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                CANDIDATE_INDEX]])

                                                                i += 1

                                                                selfrankings_changed[voter_index] = ranking

                                                                78

                                                                APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                                Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                                for voter_index in selfvotes[candidate]

                                                                if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                                ]

                                                                for _candidate in selfleading_candidates

                                                                if _candidate = candidate

                                                                ranking = [None]selfelecN_CANDIDATES

                                                                ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                _candidate])

                                                                buried = _candidate

                                                                break

                                                                i = 1

                                                                for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                                continue

                                                                else

                                                                ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                CANDIDATE_INDEX]])

                                                                i += 1

                                                                selfrankings_changed[voter_index] = ranking

                                                                79

                                                                APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                                Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                                for index in range(selfelecN_CANDIDATES)

                                                                selfcandidates[index] = 0

                                                                for voter_index voter in enumerate(selfelecsorted_voters)

                                                                score = 0

                                                                if voter_index in selfrankings_changed

                                                                for candidate in selfrankings_changed[voter_index]

                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                score += 1

                                                                else

                                                                for candidate in voter

                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                score += 1

                                                                APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                                Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                                for voter_index voter in enumerate(selfelecsorted_voters)

                                                                if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                elecCANDIDATE_INDEX]]

                                                                selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                                sorted_voters[voter_index])

                                                                for candidate_index candidate in enumerate(reversed(voter))

                                                                if candidate_index == 0

                                                                selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                                else

                                                                selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                                80

                                                                APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                                Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                                for index in range(selfelecN_CANDIDATES)

                                                                selfcandidates[index] = 0

                                                                for voter_index voter in enumerate(selfelecsorted_voters)

                                                                if voter_index in selfrankings_changed

                                                                for candidate in selfrankings_changed[voter_index]

                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                selfelecCANDIDATE_RANK]

                                                                else

                                                                for candidate in voter

                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                selfelecCANDIDATE_RANK]

                                                                APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                                Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                                for index in range(selfelecN_CANDIDATES)

                                                                selfcandidates[index] = 0

                                                                for voter in selfelecsorted_voters

                                                                votes = selfelecN_VACANCIES

                                                                for candidate in reversed(voter)

                                                                if votes == 0

                                                                break

                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                votes -= 1

                                                                • Folha de aprovaccedilatildeo
                                                                • Agradecimentos
                                                                • Epiacutegrafe
                                                                • Resumo
                                                                • Abstract
                                                                • Lista de ilustraccedilotildees
                                                                • Lista de Coacutedigos
                                                                • Lista de tabelas
                                                                • Lista de abreviaturas e siglas
                                                                • Sumaacuterio
                                                                • INTRODUCcedilAtildeO
                                                                  • MOTIVACcedilAtildeO E OBJETIVO
                                                                  • MEacuteTODO
                                                                  • ESTRUTURA
                                                                    • SISTEMAS ELEITORAIS
                                                                      • FISRT PAST THE POST
                                                                        • Exemplo
                                                                        • Vantagens e Desvantagens do FPTP
                                                                        • Voto Uacutetil no FPTP
                                                                          • TWO-ROUND SYSTEM
                                                                            • Exemplo
                                                                            • Vantagens e Desvantagens do TRS
                                                                            • Voto Uacutetil no TRS
                                                                              • INSTANT-RUNOFF VOTING
                                                                                • Exemplo
                                                                                • Vantagens e Desvantagens do IRV
                                                                                • Voto Uacutetil no IRV
                                                                                  • APPROVAL VOTING SYSTEM
                                                                                    • Exemplo
                                                                                    • Vantagens e Desvantagens do AVS
                                                                                    • Voto Uacutetil no AVS
                                                                                      • THE BORDA COUNT
                                                                                        • Exemplo
                                                                                        • Vantagens e Desvantagens do BC
                                                                                        • Voto Uacutetil no BC
                                                                                          • SCORE VOTING SYSTEM
                                                                                            • Exemplo
                                                                                            • Vantagens e Desvantagens do SVS
                                                                                            • Voto Uacutetil no SVS
                                                                                              • BLOC VOTE
                                                                                                • Exemplo
                                                                                                • Voto Uacutetil no BV
                                                                                                    • O SIMULADOR
                                                                                                    • CENAacuteRIOS PERTINENTES
                                                                                                      • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                      • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                      • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                      • CENAacuteRIO 4 COALIZOtildeES
                                                                                                      • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                      • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                        • COMO FUNCIONA O SIMULADOR
                                                                                                          • CLASSE Elections
                                                                                                          • CLASSE FirstPastThePost
                                                                                                          • CLASSE TwoRoundSystem
                                                                                                          • CLASSE InstantRunoffVoting
                                                                                                          • CLASSE ApprovalVoting
                                                                                                          • CLASSE BordaCount
                                                                                                          • CLASSE ScoreVoting
                                                                                                          • CLASSE BlocVote
                                                                                                          • TECNOLOGIAS UTILIZADAS
                                                                                                            • CONCLUSAtildeO
                                                                                                            • Referecircncias
                                                                                                            • Meacutetodo create_voters
                                                                                                            • Meacutetodo create_candidates
                                                                                                            • Meacutetodo calculate_means
                                                                                                            • Meacutetodo get_mean
                                                                                                            • Meacutetodo calculate_mean
                                                                                                            • Meacutetodo set_leading_candidates
                                                                                                            • Meacutetodo irv_set_leading_candidates
                                                                                                            • Meacutetodo sort_ranks
                                                                                                            • Meacutetodo fptp_count_tactical_votes
                                                                                                            • Meacutetodo fptp_count_minority_votes
                                                                                                            • Meacutetodo trs_second_round
                                                                                                            • Meacutetodo trs_account_for_coalitions
                                                                                                            • Meacutetodo irv_count_votes
                                                                                                            • Meacutetodo avs_count_votes
                                                                                                            • Meacutetodo avs_count_votes_with_tactical
                                                                                                            • Meacutetodo irv_apply_tactical_votes
                                                                                                            • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                            • Meacutetodo bc_sum_candidates_scores
                                                                                                            • Meacutetodo svs_apply_tactical_votes
                                                                                                            • Meacutetodo svs_sum_candidates_scores
                                                                                                            • Meacutetodo bv_count_votes

                                                                  33

                                                                  Figura 7 ndash Captura de tela 6

                                                                  Apoacutes a criaccedilatildeo dos candidatos o usuaacuterio pode criar perfis de eleitores que definiratildeo demaneira exata como partes da populaccedilatildeo iraacute votar (Figura 5) Em cada perfil se defineo valor em porcentos da populaccedilatildeo votante que o adotaraacute e a nota de cada candidatoTambeacutem eacute possiacutevel nomear cada perfil livremente

                                                                  No modo Generate (Figura 6) eacute onde o gerador de nuacutemeros pseudoaleatoacuterios eacute usadoNesse modo ao inveacutes do usuaacuterio criar perfis de eleitores ele define qual seraacute a distribuiccedilatildeoadotada para a geraccedilatildeo de notas de cada candidato Essas distribuiccedilotildees seratildeo mais bemdetalhadas no Capiacutetulo 5 Da mesma maneira que no modo Manipulate nesse modotambeacutem eacute possiacutevel definir os valores para os dois tipos de voto uacutetil os votos taacuteticos eos votos de minoria No primeiro estatildeo incluiacutedas as estrateacutegias de mudanccedila de votoespeciacuteficas de cada sistema como o bullet voting no AVS e SVS ou quando a preferecircnciade um eleitor claramente natildeo possui chances de vitoacuteria e ele muda seu voto para um doscandidatos que esteja na lideranccedila o que ocorre no FPTP e TRS O voto de minoriase apresenta apenas no FPTP em eleiccedilotildees onde mais de um candidato eacute eleito Se apreferecircncia de um eleitor claramente lidera a eleiccedilatildeo por ser tambeacutem a preferecircncia damaior parte da populaccedilatildeo esse eleitor pode mudar o seu voto para uma segunda opccedilatildeona esperanccedila de eleger dois de seus candidatos favoritos

                                                                  Por fim em ambos os modos o usuaacuterio tem a opccedilatildeo de definir coalizotildees entre oscandidatos se o sistema TRS estiver habilitado pois as coalizotildees apenas se manifestamnesse sistema Essas coalizotildees alteraratildeo as notas dos candidatos dependendo dos outroscandidatos pertencentes a elas (Figura 7)

                                                                  A aplicaccedilatildeo pode ser encontrada na paacutegina httpelectionsimpythonanywherecom

                                                                  34

                                                                  4 CENAacuteRIOS PERTINENTES

                                                                  Para todos os cenaacuterios deste capiacutetulo seraacute usada a seed do simulador igual a 100 e apopulaccedilatildeo de eleitores igual a 1000 para que exista consistecircncia na anaacutelise e tambeacutem paraque possa haver replicaccedilatildeo dos resultados se necessaacuterio

                                                                  41 CENAacuteRIO 1 VOTO TAacuteTICO

                                                                  Neste exemplo teremos quatro candidatos Ana Beto Carla e Diego Ana e Betoseratildeo gerados a partir da distribuiccedilatildeo Neutral (Figura 47) Carla da distribuiccedilatildeo Disliked(Figura 51) e Diego da Hated (Figura 55) Para a simulaccedilatildeo com a seed 100 o melhorcandidato a ser eleito ou seja aquele que maximiza a meacutedia das notas dos eleitores eacute oBeto com uma meacutedia de 0073 Para cada sistema seratildeo comparados os resultados semvoto taacutetico aos com 20 de voto taacutetico a favor da Ana Abaixo se encontram osresultados para o sistema FPTP

                                                                  Figura 8 ndash FPTP - Cenaacuterio 1 sem voto taacutetico

                                                                  Figura 9 ndash TRS segundo turno - Cenaacuterio 1 sem voto taacutetico

                                                                  35

                                                                  Figura 10 ndash IRV primeiro turno - Cenaacuterio 1

                                                                  Figura 11 ndash IRV segundo turno - Cenaacuterio 1

                                                                  Figura 12 ndash IRV terceiro turno - Cenaacuterio 1

                                                                  36

                                                                  Figura 13 ndash AVS - Cenaacuterio 1 sem voto taacutetico

                                                                  Figura 14 ndash BC - Cenaacuterio 1 sem voto taacutetico

                                                                  Figura 15 ndash SVS - Cenaacuterio 1 sem voto taacutetico

                                                                  37

                                                                  Nesse cenaacuterio sem voto taacutetico o uacutenico sistema que natildeo elege o Beto eacute o AVS Todosos outros elegem o melhor candidato Ou seja apesar de Beto ter uma melhor meacutediadas notas dos eleitores existem mais eleitores que ranqueiam Ana com uma nota acimade 0 No entanto apenas 20 dos eleitores de Diego e Carla que preferem a Ana aoinveacutes do Beto satildeo o suficiente para fazer Beto natildeo ser eleito se eles decidirem abandonarsua primeira opccedilatildeo e votar na Ana Considerando a vantagem que os votos taacuteticosproporcionam agrave Ana esta eacute eleita em todos os sistemas menos o TRS e o IRV

                                                                  Figura 16 ndash FPTP - Cenaacuterio 1 - 20 de voto taacutetico na Ana

                                                                  Figura 17 ndash TRS segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                                  38

                                                                  Figura 18 ndash IRV primeiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                                  Figura 19 ndash IRV segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                                  Figura 20 ndash IRV terceiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                                  39

                                                                  Figura 21 ndash AVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                                  Figura 22 ndash BC - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                                  Figura 23 ndash SVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                                  40

                                                                  Eacute claro que se os eleitores que preferem o Beto tambeacutem votassem de maneira estra-teacutegica a situaccedilatildeo se equilibraria e haveria o mesmo niacutevel de concorrecircncia entre os doiscandidatos que ocorre quando natildeo haacute voto taacutetico Poreacutem no Borda Count esse equiliacute-brio pode natildeo acontecer e as estrateacutegias de compromising e burying podem acabar saindopela culatra se uma porcentagem elevada dos eleitores as adotarem Abaixo encontram-seos resultados para esse sistema quando 100 dos eleitores de Carla e Diego se comportammaliciosamente

                                                                  Figura 24 ndash BC - Cenaacuterio 1 100 de voto taacutetico na Ana e Beto

                                                                  Por causa do uso demasiado da estrateacutegia burying Ana e Beto perdem muitos pontose isso abre espaccedilo para uma vitoacuteria da Carla No entanto para porcentagens menores que100 o Beto ainda eacute o vencedor

                                                                  Essas duas estrateacutegias tambeacutem foram implementadas nesse simulador para o sistemaIRV e eacute possiacutevel ver como ele eacute resistente a elas Para que seja possiacutevel mudar os resultadosde uma eleiccedilatildeo sob o IRV eacute necessaacuterio mudar a ordem de eliminaccedilatildeo dos candidatos paraque o seu candidato preferido acabe enfrentando um candidato mais fraco nas rodadasfinais Isso natildeo ocorre com compromising e burying No proacuteximo cenaacuterio seraacute analisadacomo eacute possiacutevel modificar os resultados de uma eleiccedilatildeo sob o IRV

                                                                  Esses resultados podem ser replicados acessando os linksSem votos taacuteticos lthttpelectionsimpythonanywherecomdirect_res1111110

                                                                  --[0021][22Ana2222Beto222022Carla2222Diego22]------100gt

                                                                  Com 20 de voto taacutetico lthttpelectionsimpythonanywherecomdirect_res1111110--[0021][22Ana222022Beto2222Carla2222Diego22]1-[02000]---100gt

                                                                  Com 100 de voto taacuteticona Ana e Beto lthttpelectionsimpythonanywherecomdirect_res0000100--[0021][22Ana222022Beto222022Carla2222Diego22]1-[101000]---100gt

                                                                  41

                                                                  42 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV

                                                                  Neste cenaacuterio teremos Ana Carla e Beto concorrendo e trecircs perfis distintos que apoiamcada candidato As distribuiccedilotildees de notas dos perfis se encontram na tabela abaixo

                                                                  Tabela 12 ndash Distribuiccedilatildeo de notas - Cenaacuterio 2

                                                                  Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                                  deeleitores

                                                                  1 10 5 0 422 0 10 5 303 5 0 10 28

                                                                  Com essas distribuiccedilotildees Carla eacute eliminada na primeira rodada e seus 28 de votossatildeo transferidos para a segunda opccedilatildeo de seus eleitores Ana que eacute eleita com 70 dosvotos e uma meacutedia de 56

                                                                  Figura 25 ndash IRV primeiro turno - Cenaacuterio 2

                                                                  Figura 26 ndash IRV segundo turno - Cenaacuterio 2

                                                                  42

                                                                  Cientes desse provaacutevel futuro cenaacuterio onde Ana eacute eleita uma pequena parte dos elei-tores de Beto estrategicamente o abandona e decide apoiar Carla na esperanccedila de leva-laao segundo turno contra Ana As novas distribuiccedilotildees de notas se encontram na tabelaabaixo com essa porccedilatildeo de eleitores representada pelo perfil 4

                                                                  Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2

                                                                  Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                                  deeleitores

                                                                  1 10 5 0 422 0 10 5 283 5 0 10 284 0 8 10 2

                                                                  Essa mudanccedila estrateacutegica de voto altera a ordem de eliminaccedilotildees do sistema com Betosendo o primeiro a ser eliminado Com isso seus votos satildeo naturalmente transferidos paraCarla que derrota Ana no segundo turno com 58 dos votos

                                                                  Figura 27 ndash IRV primeiro turno com voto taacutetico - Cenaacuterio 2

                                                                  Figura 28 ndash IRV segundo turno com voto taacutetico - Cenaacuterio 2

                                                                  43

                                                                  Percebendo que a eleiccedilatildeo de Beto natildeo era provaacutevel seus eleitores conseguiram aomenos impedir a eleiccedilatildeo do pior candidato para eles Mas para isso foi necessaacuterio queeles tivessem a informaccedilatildeo de como os outros eleitores votariam Uma aproximaccedilatildeo dessasinformaccedilotildees poderia ser obtida em um cenaacuterio real com poucos candidatos atraveacutes depesquisas eleitorais poreacutem se o nuacutemero de candidatos eacute significativo uma noccedilatildeo completadas distribuiccedilotildees dos rankings dos eleitores se torna muito menos viaacutevel e dificulta aformulaccedilatildeo de estrateacutegias para alterar a ordem em que os candidatos satildeo eliminados

                                                                  Esses resultados podem ser replicados acessando os linksSem voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana22

                                                                  22Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                                  Com voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana

                                                                  2222Beto2222Carla22]-----42Voter20Profile2001020520028Voter20Profile2010201020528Voter20Profile202520020102Voter20Profile20302082010100gt

                                                                  43 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE

                                                                  O interessante dos sistemas IRV e TRS eacute que os resultados do cenaacuterio anterior po-deriam ter sido obtidos ao inveacutes do voto taacutetico pela sua natildeo-monotonicidade Seriapossiacutevel que a Carla derrotasse a Ana no segundo turno atraveacutes do proacuteprio aumento depopularidade da Ana Assumindo que essa popularizaccedilatildeo ocorresse entre os candidatosdo perfil 2 onde 3 passasse a apoiar a Ana ao inveacutes do Beto as novas distribuiccedilotildeesseguiriam a tabela abaixo

                                                                  Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                                  Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                                  deeleitores

                                                                  1 10 5 0 452 0 10 5 273 5 0 10 28

                                                                  Dessa maneira Beto agora com uma porcentagem dos eleitores menor do que a deCarla seraacute eliminado na primeira rodada e como seus eleitores tecircm a Carla como segundaopccedilatildeo ela receberaacute todos os seus votos e seraacute eleita na segunda rodada As rodadas doIRV podem ser vistas nas figuras 29 e 30

                                                                  44

                                                                  Figura 29 ndash IRV primeiro turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                                  Figura 30 ndash IRV segundo turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                                  Tabela 15 ndash Resultados do Cenaacuterio 3Candidato

                                                                  eleitoMeacutedia das

                                                                  notasAntes da

                                                                  popularizaccedilatildeode Ana

                                                                  Ana 56

                                                                  Apoacutespopularizaccedilatildeo

                                                                  de AnaCarla 415

                                                                  Os efeitos dessa caracteriacutestica se refletem na satisfaccedilatildeo meacutedia da populaccedilatildeo A Ana eacuteclaramente a melhor candidata e mesmo com o seu ganho de popularidade (ou devido aele) a Carla eacute eleita

                                                                  Esses resultados podem ser replicados acessando os linksAntes da popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecom

                                                                  direct_res0010000---[22Ana2222Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                                  45

                                                                  Apoacutes popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana2222Beto2222Carla22]-----45Voter20Profile2001020520027Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                                  44 CENAacuteRIO 4 COALIZOtildeES

                                                                  O TRS por ser organizado em dois turnos separados normalmente a semanas dedistacircncia um do outro acaba abrindo brecha agrave mudanccedila de opiniatildeo por parte dos eleitorese o desenvolvimento de novas estrateacutegias por parte dos candidatos tais como a coalizatildeocom candidatos jaacute eliminados Com isso em mente nesse cenaacuterio teremos novamenteos quatro candidatos Ana Beto Carla e Diego Os trecircs primeiros seratildeo gerados dadistribuiccedilatildeo Neutral e Diego da distribuiccedilatildeo Disliked

                                                                  Figura 31 ndash TRS turno 1 - Cenaacuterio 4

                                                                  No TRS normal Ana Beto e Carla possuem com essas distribuiccedilotildees quantidades devotos muito proacuteximas com Beto e Carla indo para o segundo turno Carla estaacute 10 votosatraacutes de Beto e decide aproveitar o espaccedilo de tempo entre os dois turnos para tentaragregar mais votos Com isso Carla se aproxima de Diego e juntos formam uma coalizatildeoNo entanto com sua baixa popularidade Diego acaba ferindo a reputaccedilatildeo de Carla etorna o segundo turno muito mais faacutecil para Beto (Figura 33) Se Carla tivesse buscado osuporte de Ana por outro lado ela se veria vitoriosa no segundo turno e com uma amplavantagem sobre o Beto (Figura 34) Ou ateacute mesmo sem buscar uma coalizatildeo mesmosendo uma corrida apertada Carla teria naturalmente sido eleita (Figura 32)

                                                                  Esses resultados podem ser replicados acessando os linksSem coalizotildees lthttpelectionsimpythonanywherecomdirect_res0100000

                                                                  --[0002][22Ana222022Beto2222Carla2222Diego22]------100gt

                                                                  46

                                                                  Figura 32 ndash TRS turno 2 - Cenaacuterio 4

                                                                  Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4

                                                                  Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4

                                                                  47

                                                                  Coalizatildeo Carla e Diego lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2203Carla20Diego-100gt

                                                                  Coalizatildeo Carla e Ana lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2200Carla20Ana-100gt

                                                                  45 CENAacuteRIO 5 DILEMA DO PRISIONEIRO

                                                                  Neste cenaacuterio temos uma eleiccedilatildeo de uma vaga com trecircs candidatos concorrentes e trecircsperfis distintos de eleitores que seguiratildeo as seguintes distribuiccedilotildees

                                                                  Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5

                                                                  Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                                  deeleitores

                                                                  1 10 -10 5 362 -10 10 5 343 -10 -10 5 30

                                                                  Esse contexto nos remete ao notaacutevel dilema do prisioneiro Nele dois prisioneiroscuacutemplices satildeo interrogados individualmente sem poder se comunicar um com o outro ecada um enfrenta o dilema de delatar ou natildeo o seu parceiro Se os dois prisioneirosdecidem se manter calados sobre o crime ambos satildeo sentenciados a um ano de prisatildeo Seapenas um deles dedurar o outro o traidor sai livre enquanto seu parceiro eacute condenadoa trecircs anos Se ambos dedurarem um ao outro eles satildeo condenados juntos a dois anosde prisatildeo Esse dilema eacute uma ideia claacutessica presente no estudo da teoria dos jogos sendooriginalmente elaborada por Merrill Flood e Melvin Dresher em 1950 e mais tarde sendonomeada de dilema dos prisioneiros por Albert W Tucker (POUNDSTONE 1992)

                                                                  O que esse dilema nos mostra eacute a tentaccedilatildeo que o indiviacuteduo deteacutem se sua racionalizaccedilatildeoestiver voltada para seus proacuteprios interesses e somente eles em oposiccedilatildeo a pensar no bemdo grupo como um todo Neste cenaacuterio encontramos dois grupos de eleitores expressiva-mente opostos os perfis 1 e 2 Se qualquer uma das preferecircncias desses perfis fosse eleitaisso significaria uma alta rejeiccedilatildeo de maior parte da populaccedilatildeo No entanto eles possuema segunda opccedilatildeo em comum a Carla que por sua vez eacute a preferecircncia do terceiro perfilPortanto a eleiccedilatildeo da Carla seria logicamente o resultado oacutetimo

                                                                  Mesmo assim a Ana eacute eleita nos dois sistemas acima o que natildeo parece justo poispela tabela 16 eacute evidente que apenas 36 da populaccedilatildeo a aprova enquanto que os outros64 a reprovam ao maacuteximo O sistema IRV se comporta de maneira idecircntica ao TRS

                                                                  48

                                                                  Figura 35 ndash FPTP - Cenaacuterio 5

                                                                  Figura 36 ndash TRS segundo turno - Cenaacuterio 5

                                                                  nesta situaccedilatildeo Com esse resultado a meacutedia das notas eacute -28 No entanto os trecircs sistemasseguintes nos apresentam resultados diferentes

                                                                  Tabela 17 ndash Resultados do Cenaacuterio 5

                                                                  Sistema Candidatoeleito

                                                                  Meacutedia dasnotas

                                                                  FPTP Ana -28TRS Ana -28IRV Ana -28AVS Carla 50BC Carla 50SVS Carla 50

                                                                  49

                                                                  Figura 37 ndash AVS - Cenaacuterio 5

                                                                  Figura 38 ndash BC - Cenaacuterio 5

                                                                  Tanto o AVS quanto o Borda Count e o SVS satildeo sistemas que consideram todasas opiniotildees de cada eleitor ao mesmo tempo e por isso satildeo capazes de eleger o melhorcandidato nesta situaccedilatildeo diferentemente do TRS que natildeo absorve completamente todosentimento do eleitor por todos os candidatos e o IRV que apesar de ser bem expressivoquebra esse processo em inuacutemeras rodadas o que permite a perda de informaccedilatildeo ao longodelas

                                                                  Esses resultados podem ser replicados acessando o linklthttpelectionsimpythonanywherecomdirect_res1111110---[22Ana

                                                                  222022Beto222022Carla22]-----36Voter20Profile2001020-1020534Voter20Profile201-10201020530Voter20Profile202-1020-10205100gt

                                                                  50

                                                                  Figura 39 ndash SVS - Cenaacuterio 5

                                                                  46 CENAacuteRIO 6 VOTO DE MINORIA

                                                                  Neste cenaacuterio temos uma eleiccedilatildeo com quatro candidatos e duas vagas A Ana seraacutea preferecircncia de uma extensa parte da populaccedilatildeo (distribuiccedilatildeo Loved Figura 53) Betoe Carla seratildeo candidatos razoavelmente populares (distribuiccedilatildeo Neutral Figura 47) eDiego seraacute a preferecircncia de apenas um pequeno grupo especiacutefico e rejeitado pela maioria(distribuiccedilatildeo Disliked Figura 51) Eacute intuitivo esperar que os dois candidatos eleitos seratildeoa Ana e ou o Beto ou a Carla e isso eacute exatamente o que ocorre na figura 40 no sistemaFPTP sem voto de minoria

                                                                  Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria

                                                                  Eacute evidente a discrepacircncia da quantidade de votos da Ana para os outros candidatose apesar de Beto e Carla serem mais populares que Diego os trecircs natildeo se encontrammuito afastados Poreacutem se a pequena fraccedilatildeo de candidatos que possuem a Ana como

                                                                  51

                                                                  Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego

                                                                  preferecircncia e Diego como segunda opccedilatildeo optarem pelo voto de minoria a situaccedilatildeo mudacompletamente (Figura 41) Assim apesar de extensamente rejeitado Diego conquistaa segunda vaga e a meacutedia das notas despenca de 2929 para 0505 No entanto aindaexiste um cenaacuterio pior Se os outros grupos de eleitores pensarem da mesma forma eevitarem votar na Ana achando que sua eleiccedilatildeo jaacute estaacute assegurada apenas 80 de votode minoria para esses grupos jaacute eacute o suficiente para eliminaacute-la das eleiccedilotildees (Figura 42)Com a Ana eliminada a meacutedia das notas cai ainda mais para 0058

                                                                  Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego

                                                                  O sistema Bloc Vote eacute uma das soluccedilotildees para o voto de minoria Permitindo queos eleitores votem no mesmo nuacutemero de candidatos que de vagas a serem preenchidasnatildeo existe o iacutempeto a esse tipo de voto estrateacutegico O resultado desse sistema portantoretorna a meacutedia das notas a casa dos 29 (Figura 43) Os sistemas AVS Borda Count eSVS tambeacutem impedem a presenccedila do voto de minoria e atingem resultados semelhantes

                                                                  52

                                                                  Figura 43 ndash BV - Cenaacuterio 6

                                                                  Tabela 18 ndash Resultados do Cenaacuterio 6

                                                                  Sistema Candidatoseleitos

                                                                  Meacutedia dasnotas

                                                                  FPTP sem voto de minoriaAna eBeto 2929

                                                                  FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

                                                                  FPTP com 80 de voto de minoriaBeto eCarla 0058

                                                                  Bloc VoteAna eCarla 2913

                                                                  Esses resultados podem ser replicados acessando os links

                                                                  Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

                                                                  100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

                                                                  80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

                                                                  53

                                                                  5 COMO FUNCIONA O SIMULADOR

                                                                  O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

                                                                  51 CLASSE ELECTIONS

                                                                  Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

                                                                  bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

                                                                  Figura 44 ndash estrutura candidates

                                                                  bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

                                                                  bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

                                                                  Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

                                                                  Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

                                                                  54

                                                                  Figura 45 ndash estrutura voters

                                                                  Figura 46 ndash estrutura votes

                                                                  daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

                                                                  Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

                                                                  55

                                                                  Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

                                                                  Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

                                                                  na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

                                                                  56

                                                                  Figura 49 ndash PDF - Distribuiccedilatildeo Liked

                                                                  Figura 50 ndash CDF - Distribuiccedilatildeo Liked

                                                                  (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

                                                                  Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

                                                                  57

                                                                  Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

                                                                  Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

                                                                  candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

                                                                  Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

                                                                  58

                                                                  Figura 53 ndash PDF - Distribuiccedilatildeo Loved

                                                                  Figura 54 ndash CDF - Distribuiccedilatildeo Loved

                                                                  funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

                                                                  59

                                                                  Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                                                                  Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                                                                  Meacutedia das Notas sumei

                                                                  sumvj nij

                                                                  etimes v

                                                                  Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                                                                  Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                                                                  60

                                                                  Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                                                                  Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                                                                  52 CLASSE FIRSTPASTTHEPOST

                                                                  Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                                                                  Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                                                                  61

                                                                  Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                                                                  Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                                                                  mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                                                                  62

                                                                  53 CLASSE TWOROUNDSYSTEM

                                                                  A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                                                                  54 CLASSE INSTANTRUNOFFVOTING

                                                                  A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                                                                  Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                                                                  63

                                                                  cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                                                                  55 CLASSE APPROVALVOTING

                                                                  Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                                                                  56 CLASSE BORDACOUNT

                                                                  Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                                                                  57 CLASSE SCOREVOTING

                                                                  De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                                                                  64

                                                                  58 CLASSE BLOCVOTE

                                                                  O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                                                                  59 TECNOLOGIAS UTILIZADAS

                                                                  A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                                                                  Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                                                                  O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                                                                  Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                                                                  65

                                                                  6 CONCLUSAtildeO

                                                                  Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                                                                  Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                                                                  Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                                                                  Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                                                                  Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                                                                  66

                                                                  REFEREcircNCIAS

                                                                  AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                                                                  Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                                                                  Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                                                                  Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                                                                  HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                                                                  LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                                                                  ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                                                                  Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                                                                  POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                                                                  The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                                                                  67

                                                                  APEcircNDICES

                                                                  APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                                                  Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                                                  if(not len(selfvoter_profiles))

                                                                  for voter in range(selfN_VOTERS)

                                                                  candidates_rank = dict()

                                                                  for candidate in reversed(range(selfN_CANDIDATES))

                                                                  if(selfBIAS_VECTOR[candidate]==4)

                                                                  candidates_rank[candidate] = self_sortear(selfloved)

                                                                  elif(selfBIAS_VECTOR[candidate]==3)

                                                                  candidates_rank[candidate] = self_sortear(selfliked)

                                                                  elif(selfBIAS_VECTOR[candidate]==2)

                                                                  candidates_rank[candidate] = self_sortear(selfdisliked)

                                                                  elif(selfBIAS_VECTOR[candidate]==1)

                                                                  candidates_rank[candidate] = self_sortear(selfhated)

                                                                  elif(selfBIAS_VECTOR[candidate]==-1)

                                                                  candidates_rank[candidate] = self_sortear(selfpolarizer

                                                                  )

                                                                  elif(selfBIAS_VECTOR[candidate]==-2)

                                                                  candidates_rank[candidate] = self_sortear(self

                                                                  more_polarizer)

                                                                  else

                                                                  candidates_rank[candidate] = self_sortear(selfneutral)

                                                                  selfvotersappend(candidates_rank)

                                                                  else

                                                                  ranges = []

                                                                  ranks = []

                                                                  for prof in selfvoter_profiles

                                                                  rangesappend(int(prof[pop_percentage]))

                                                                  rank =

                                                                  for index score in enumerate(prof[scores])

                                                                  rank[index] = score

                                                                  ranksappend(rank)

                                                                  for index _range in enumerate(ranges)

                                                                  for _ in range(int(selfN_VOTERS(_range100)))

                                                                  selfvotersappend(ranks[index])

                                                                  68

                                                                  APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                                                  Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                                                  for i in range(selfN_CANDIDATES)

                                                                  selfcandidates[i] = 0

                                                                  selfvotes[i] = set()

                                                                  APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                                                  Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                                                  for candidate in range(selfN_CANDIDATES)

                                                                  rating_sum = 0

                                                                  for voter in selfvoters

                                                                  rating_sum += voter[candidate]

                                                                  selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                                                  APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                                                  Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                                                  if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                                                  return selfcalculate_mean(winners)

                                                                  else

                                                                  chose_best = True if winners[0] == selfbest_candidate else

                                                                  False

                                                                  return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                                                  69

                                                                  APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                                                  Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                                                  rating_sum = 0

                                                                  for voter in selfvoters

                                                                  for candidate in winners

                                                                  rating_sum += voter[candidate]

                                                                  return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                                                  APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                                                  Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                                                  for i in range(1 selfN_VACANCIES + 2)

                                                                  selfleading_candidatesappend(selfsorted_candidates[-i][self

                                                                  CANDIDATE_INDEX])

                                                                  APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                                                  Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                                                  for leader in selfelecrounds[-1]

                                                                  selfleading_candidatesappend(leader[0])

                                                                  70

                                                                  APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                                                  Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                                                  self_account_for_coalitions()

                                                                  for voter in selfvoters

                                                                  selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                                                  (1)))

                                                                  temp = []

                                                                  for voter in selfsorted_voters

                                                                  new_dict = defaultdict(list)

                                                                  for k in voter

                                                                  new_dict[k[1]]append(k[0])

                                                                  tempappend(new_dict)

                                                                  selfsorted_voters = []

                                                                  for voter_index current_voter in enumerate(temp)

                                                                  new_voter = []

                                                                  for rating candidate_indexes in current_voteritems()

                                                                  if len(current_voter[rating]) gt 1

                                                                  shuffle(current_voter[rating])

                                                                  for e in candidate_indexes

                                                                  new_voterappend((e rating))

                                                                  else

                                                                  new_voterappend((candidate_indexes[0] rating))

                                                                  selfsorted_votersappend(new_voter)

                                                                  selfcandidates[new_voter[-1][0]] += 1

                                                                  selfvotes[new_voter[-1][0]]add(voter_index)

                                                                  71

                                                                  APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                                                  Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                                                  for candidate in selfvotes_copy

                                                                  if candidate not in selfelecleading_candidates

                                                                  for voter_index in selfvotes_copy[candidate]

                                                                  for index _candidate in enumerate(reversed(selfelec

                                                                  sorted_voters[voter_index]))

                                                                  if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                                                  leading_candidates

                                                                  if randomrandom() lt selfelec

                                                                  tactical_vote_percentages[_candidate[selfelec

                                                                  CANDIDATE_INDEX]]

                                                                  selfrankings_changed[voter_index] = copy

                                                                  deepcopy(selfelecsorted_voters[voter_index])

                                                                  selfrankings_changed[voter_index][-(index + 1)]

                                                                  selfrankings_changed[voter_index][-1] = self

                                                                  rankings_changed[voter_index][-1] self

                                                                  rankings_changed[voter_index][-(index + 1)]

                                                                  selfcandidates[candidate] -= 1

                                                                  selfcandidates[_candidate[selfelec

                                                                  CANDIDATE_INDEX]] += 1

                                                                  selfvotes[candidate]remove(voter_index)

                                                                  selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                                                  ]]add(voter_index)

                                                                  break

                                                                  break

                                                                  72

                                                                  APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                                                  Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                                                  half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                                                  for candidate in selfelecleading_candidates

                                                                  if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                                                  continue

                                                                  for voter_index in selfvotes_copy[candidate]

                                                                  if voter_index in selfrankings_changed

                                                                  ranking = selfrankings_changed[voter_index]

                                                                  else

                                                                  ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                                                  ])

                                                                  for index _candidate in enumerate(reversed(ranking))

                                                                  if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                  leading_candidates or (_candidate[selfelec

                                                                  CANDIDATE_INDEX] in selfelecleading_candidates and

                                                                  selfelecleading_candidatesindex(_candidate[selfelec

                                                                  CANDIDATE_INDEX]) gt= half_vacancies)

                                                                  if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                                                  if randomrandom() lt selfelec

                                                                  minority_vote_percentages[_candidate[selfelec

                                                                  CANDIDATE_INDEX]]

                                                                  selfcandidates[candidate] -= 1

                                                                  selfcandidates[_candidate[selfelec

                                                                  CANDIDATE_INDEX]] += 1

                                                                  break

                                                                  break

                                                                  break

                                                                  73

                                                                  APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                                                  Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                                                  self_account_for_coalitions()

                                                                  for candidate in selfvotes

                                                                  if candidate = selfwinner and candidate = selfsecond_place

                                                                  for voter_index in selfvotes[candidate]

                                                                  if voter_index in selfrankings_changed

                                                                  ranking = selfrankings_changed[voter_index]

                                                                  else

                                                                  ranking = copydeepcopy(selfelecsorted_voters[

                                                                  voter_index])

                                                                  for index2 candidate in enumerate(reversed(ranking))

                                                                  if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                                                  selfcandidates[selfwinner] += 1

                                                                  selfvotes[selfwinner]add(voter_index)

                                                                  break

                                                                  elif candidate[selfelecCANDIDATE_INDEX] == self

                                                                  second_place

                                                                  selfcandidates[selfsecond_place] += 1

                                                                  selfvotes[selfsecond_place]add(voter_index)

                                                                  break

                                                                  selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                  winners = []

                                                                  vacancies = selfelecN_VACANCIES

                                                                  for candidate in reversed(selfsorted_candidates)

                                                                  if vacancies == 0

                                                                  break

                                                                  winnersappend(candidate[0])

                                                                  vacancies -= 1

                                                                  mean chose_best = selfelecget_mean(winners = winners)

                                                                  74

                                                                  APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                                                  Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                                                  for voter_index voter in enumerate(selfelecsorted_voters)

                                                                  voter_dict = dict()

                                                                  og_voter_dict = dict()

                                                                  for tup in voter

                                                                  voter_dict[tup[0]] = tup[1]

                                                                  og_voter_dict[tup[0]] = tup[1]

                                                                  for coalition in selfeleccoalitions

                                                                  for candidate in coalition

                                                                  add_to_score = 0

                                                                  for candidate2 in coalition

                                                                  if candidate == candidate2

                                                                  continue

                                                                  half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                                                  if half lt 0

                                                                  add_to_score += mathceil(half)

                                                                  else

                                                                  add_to_score += mathfloor(half)

                                                                  if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                                                  voter_dict[candidate[rsquovaluersquo]] = 10

                                                                  elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                                                  voter_dict[candidate[rsquovaluersquo]] = -10

                                                                  else

                                                                  voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                                                  selfrankings_changed[voter_index] = []

                                                                  for candidate in voter_dict

                                                                  selfrankings_changed[voter_index]append((candidate voter_dict[

                                                                  candidate]))

                                                                  selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                                                  voter_index] key=lambda x x[1])

                                                                  75

                                                                  APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                                  Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                                  selfelecroundsappend(selfsorted_candidates[_round])

                                                                  if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                  N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                                  N_VACANCIES - 1)

                                                                  return 2

                                                                  elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                  N_VOTERS gt 05)

                                                                  return 1

                                                                  else

                                                                  selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                                  CANDIDATE_INDEX])

                                                                  for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                                  elecCANDIDATE_INDEX]]

                                                                  if voter_index in selfrankings_changed

                                                                  for candidate in reversed(selfrankings_changed[voter_index

                                                                  ])

                                                                  if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                  excluded

                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                  ]] += 1

                                                                  selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                  add(voter_index)

                                                                  break

                                                                  else

                                                                  continue

                                                                  else

                                                                  for candidate in reversed(selfelecsorted_voters[

                                                                  voter_index])

                                                                  if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                  excluded

                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                  ]] += 1

                                                                  selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                  add(voter_index)

                                                                  break

                                                                  else

                                                                  continue

                                                                  selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                  return 0

                                                                  76

                                                                  APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                                  Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                                  for index in range(selfelecN_CANDIDATES)

                                                                  selfcandidates[index] = 0

                                                                  for voter in selfelecsorted_voters

                                                                  for candidate in reversed(voter)

                                                                  if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                  else

                                                                  break

                                                                  APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                                  Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                                  for index in range(selfelecN_CANDIDATES)

                                                                  selfcandidates[index] = 0

                                                                  for voter in selfelecsorted_voters

                                                                  if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                  elecCANDIDATE_INDEX]]

                                                                  selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                                  else

                                                                  for candidate in reversed(voter)

                                                                  if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                  else

                                                                  break

                                                                  77

                                                                  APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                                  Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                                  pos = set()

                                                                  for index perc in enumerate(selfelectactical_vote_percentages)

                                                                  if perc gt 0

                                                                  posadd(index)

                                                                  for candidate in selfeleccandidates

                                                                  if candidate not in selfleading_candidates

                                                                  for voter_index in selfvotes[candidate]

                                                                  raised = None

                                                                  for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                                  ])

                                                                  if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                                  leading_candidates

                                                                  if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                                  if randomrandom() lt selfelectactical_vote_percentages[

                                                                  candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                                  ranking = [None]selfelecN_CANDIDATES

                                                                  ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                  selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                  CANDIDATE_INDEX]])

                                                                  raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                  break

                                                                  break

                                                                  break

                                                                  if raised = None

                                                                  for _candidate in selfleading_candidates

                                                                  if _candidate = ranking[-1][0]

                                                                  ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                  _candidate])

                                                                  buried = _candidate

                                                                  break

                                                                  i = 1

                                                                  for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                  if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                                  buried]

                                                                  continue

                                                                  else

                                                                  ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                  selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                  CANDIDATE_INDEX]])

                                                                  i += 1

                                                                  selfrankings_changed[voter_index] = ranking

                                                                  78

                                                                  APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                                  Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                                  for voter_index in selfvotes[candidate]

                                                                  if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                                  ]

                                                                  for _candidate in selfleading_candidates

                                                                  if _candidate = candidate

                                                                  ranking = [None]selfelecN_CANDIDATES

                                                                  ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                  _candidate])

                                                                  buried = _candidate

                                                                  break

                                                                  i = 1

                                                                  for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                  if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                                  continue

                                                                  else

                                                                  ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                  selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                  CANDIDATE_INDEX]])

                                                                  i += 1

                                                                  selfrankings_changed[voter_index] = ranking

                                                                  79

                                                                  APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                                  Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                                  for index in range(selfelecN_CANDIDATES)

                                                                  selfcandidates[index] = 0

                                                                  for voter_index voter in enumerate(selfelecsorted_voters)

                                                                  score = 0

                                                                  if voter_index in selfrankings_changed

                                                                  for candidate in selfrankings_changed[voter_index]

                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                  score += 1

                                                                  else

                                                                  for candidate in voter

                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                  score += 1

                                                                  APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                                  Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                                  for voter_index voter in enumerate(selfelecsorted_voters)

                                                                  if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                  elecCANDIDATE_INDEX]]

                                                                  selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                                  sorted_voters[voter_index])

                                                                  for candidate_index candidate in enumerate(reversed(voter))

                                                                  if candidate_index == 0

                                                                  selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                  voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                                  else

                                                                  selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                  voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                                  80

                                                                  APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                                  Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                                  for index in range(selfelecN_CANDIDATES)

                                                                  selfcandidates[index] = 0

                                                                  for voter_index voter in enumerate(selfelecsorted_voters)

                                                                  if voter_index in selfrankings_changed

                                                                  for candidate in selfrankings_changed[voter_index]

                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                  selfelecCANDIDATE_RANK]

                                                                  else

                                                                  for candidate in voter

                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                  selfelecCANDIDATE_RANK]

                                                                  APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                                  Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                                  for index in range(selfelecN_CANDIDATES)

                                                                  selfcandidates[index] = 0

                                                                  for voter in selfelecsorted_voters

                                                                  votes = selfelecN_VACANCIES

                                                                  for candidate in reversed(voter)

                                                                  if votes == 0

                                                                  break

                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                  votes -= 1

                                                                  • Folha de aprovaccedilatildeo
                                                                  • Agradecimentos
                                                                  • Epiacutegrafe
                                                                  • Resumo
                                                                  • Abstract
                                                                  • Lista de ilustraccedilotildees
                                                                  • Lista de Coacutedigos
                                                                  • Lista de tabelas
                                                                  • Lista de abreviaturas e siglas
                                                                  • Sumaacuterio
                                                                  • INTRODUCcedilAtildeO
                                                                    • MOTIVACcedilAtildeO E OBJETIVO
                                                                    • MEacuteTODO
                                                                    • ESTRUTURA
                                                                      • SISTEMAS ELEITORAIS
                                                                        • FISRT PAST THE POST
                                                                          • Exemplo
                                                                          • Vantagens e Desvantagens do FPTP
                                                                          • Voto Uacutetil no FPTP
                                                                            • TWO-ROUND SYSTEM
                                                                              • Exemplo
                                                                              • Vantagens e Desvantagens do TRS
                                                                              • Voto Uacutetil no TRS
                                                                                • INSTANT-RUNOFF VOTING
                                                                                  • Exemplo
                                                                                  • Vantagens e Desvantagens do IRV
                                                                                  • Voto Uacutetil no IRV
                                                                                    • APPROVAL VOTING SYSTEM
                                                                                      • Exemplo
                                                                                      • Vantagens e Desvantagens do AVS
                                                                                      • Voto Uacutetil no AVS
                                                                                        • THE BORDA COUNT
                                                                                          • Exemplo
                                                                                          • Vantagens e Desvantagens do BC
                                                                                          • Voto Uacutetil no BC
                                                                                            • SCORE VOTING SYSTEM
                                                                                              • Exemplo
                                                                                              • Vantagens e Desvantagens do SVS
                                                                                              • Voto Uacutetil no SVS
                                                                                                • BLOC VOTE
                                                                                                  • Exemplo
                                                                                                  • Voto Uacutetil no BV
                                                                                                      • O SIMULADOR
                                                                                                      • CENAacuteRIOS PERTINENTES
                                                                                                        • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                        • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                        • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                        • CENAacuteRIO 4 COALIZOtildeES
                                                                                                        • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                        • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                          • COMO FUNCIONA O SIMULADOR
                                                                                                            • CLASSE Elections
                                                                                                            • CLASSE FirstPastThePost
                                                                                                            • CLASSE TwoRoundSystem
                                                                                                            • CLASSE InstantRunoffVoting
                                                                                                            • CLASSE ApprovalVoting
                                                                                                            • CLASSE BordaCount
                                                                                                            • CLASSE ScoreVoting
                                                                                                            • CLASSE BlocVote
                                                                                                            • TECNOLOGIAS UTILIZADAS
                                                                                                              • CONCLUSAtildeO
                                                                                                              • Referecircncias
                                                                                                              • Meacutetodo create_voters
                                                                                                              • Meacutetodo create_candidates
                                                                                                              • Meacutetodo calculate_means
                                                                                                              • Meacutetodo get_mean
                                                                                                              • Meacutetodo calculate_mean
                                                                                                              • Meacutetodo set_leading_candidates
                                                                                                              • Meacutetodo irv_set_leading_candidates
                                                                                                              • Meacutetodo sort_ranks
                                                                                                              • Meacutetodo fptp_count_tactical_votes
                                                                                                              • Meacutetodo fptp_count_minority_votes
                                                                                                              • Meacutetodo trs_second_round
                                                                                                              • Meacutetodo trs_account_for_coalitions
                                                                                                              • Meacutetodo irv_count_votes
                                                                                                              • Meacutetodo avs_count_votes
                                                                                                              • Meacutetodo avs_count_votes_with_tactical
                                                                                                              • Meacutetodo irv_apply_tactical_votes
                                                                                                              • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                              • Meacutetodo bc_sum_candidates_scores
                                                                                                              • Meacutetodo svs_apply_tactical_votes
                                                                                                              • Meacutetodo svs_sum_candidates_scores
                                                                                                              • Meacutetodo bv_count_votes

                                                                    34

                                                                    4 CENAacuteRIOS PERTINENTES

                                                                    Para todos os cenaacuterios deste capiacutetulo seraacute usada a seed do simulador igual a 100 e apopulaccedilatildeo de eleitores igual a 1000 para que exista consistecircncia na anaacutelise e tambeacutem paraque possa haver replicaccedilatildeo dos resultados se necessaacuterio

                                                                    41 CENAacuteRIO 1 VOTO TAacuteTICO

                                                                    Neste exemplo teremos quatro candidatos Ana Beto Carla e Diego Ana e Betoseratildeo gerados a partir da distribuiccedilatildeo Neutral (Figura 47) Carla da distribuiccedilatildeo Disliked(Figura 51) e Diego da Hated (Figura 55) Para a simulaccedilatildeo com a seed 100 o melhorcandidato a ser eleito ou seja aquele que maximiza a meacutedia das notas dos eleitores eacute oBeto com uma meacutedia de 0073 Para cada sistema seratildeo comparados os resultados semvoto taacutetico aos com 20 de voto taacutetico a favor da Ana Abaixo se encontram osresultados para o sistema FPTP

                                                                    Figura 8 ndash FPTP - Cenaacuterio 1 sem voto taacutetico

                                                                    Figura 9 ndash TRS segundo turno - Cenaacuterio 1 sem voto taacutetico

                                                                    35

                                                                    Figura 10 ndash IRV primeiro turno - Cenaacuterio 1

                                                                    Figura 11 ndash IRV segundo turno - Cenaacuterio 1

                                                                    Figura 12 ndash IRV terceiro turno - Cenaacuterio 1

                                                                    36

                                                                    Figura 13 ndash AVS - Cenaacuterio 1 sem voto taacutetico

                                                                    Figura 14 ndash BC - Cenaacuterio 1 sem voto taacutetico

                                                                    Figura 15 ndash SVS - Cenaacuterio 1 sem voto taacutetico

                                                                    37

                                                                    Nesse cenaacuterio sem voto taacutetico o uacutenico sistema que natildeo elege o Beto eacute o AVS Todosos outros elegem o melhor candidato Ou seja apesar de Beto ter uma melhor meacutediadas notas dos eleitores existem mais eleitores que ranqueiam Ana com uma nota acimade 0 No entanto apenas 20 dos eleitores de Diego e Carla que preferem a Ana aoinveacutes do Beto satildeo o suficiente para fazer Beto natildeo ser eleito se eles decidirem abandonarsua primeira opccedilatildeo e votar na Ana Considerando a vantagem que os votos taacuteticosproporcionam agrave Ana esta eacute eleita em todos os sistemas menos o TRS e o IRV

                                                                    Figura 16 ndash FPTP - Cenaacuterio 1 - 20 de voto taacutetico na Ana

                                                                    Figura 17 ndash TRS segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                                    38

                                                                    Figura 18 ndash IRV primeiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                                    Figura 19 ndash IRV segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                                    Figura 20 ndash IRV terceiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                                    39

                                                                    Figura 21 ndash AVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                                    Figura 22 ndash BC - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                                    Figura 23 ndash SVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                                    40

                                                                    Eacute claro que se os eleitores que preferem o Beto tambeacutem votassem de maneira estra-teacutegica a situaccedilatildeo se equilibraria e haveria o mesmo niacutevel de concorrecircncia entre os doiscandidatos que ocorre quando natildeo haacute voto taacutetico Poreacutem no Borda Count esse equiliacute-brio pode natildeo acontecer e as estrateacutegias de compromising e burying podem acabar saindopela culatra se uma porcentagem elevada dos eleitores as adotarem Abaixo encontram-seos resultados para esse sistema quando 100 dos eleitores de Carla e Diego se comportammaliciosamente

                                                                    Figura 24 ndash BC - Cenaacuterio 1 100 de voto taacutetico na Ana e Beto

                                                                    Por causa do uso demasiado da estrateacutegia burying Ana e Beto perdem muitos pontose isso abre espaccedilo para uma vitoacuteria da Carla No entanto para porcentagens menores que100 o Beto ainda eacute o vencedor

                                                                    Essas duas estrateacutegias tambeacutem foram implementadas nesse simulador para o sistemaIRV e eacute possiacutevel ver como ele eacute resistente a elas Para que seja possiacutevel mudar os resultadosde uma eleiccedilatildeo sob o IRV eacute necessaacuterio mudar a ordem de eliminaccedilatildeo dos candidatos paraque o seu candidato preferido acabe enfrentando um candidato mais fraco nas rodadasfinais Isso natildeo ocorre com compromising e burying No proacuteximo cenaacuterio seraacute analisadacomo eacute possiacutevel modificar os resultados de uma eleiccedilatildeo sob o IRV

                                                                    Esses resultados podem ser replicados acessando os linksSem votos taacuteticos lthttpelectionsimpythonanywherecomdirect_res1111110

                                                                    --[0021][22Ana2222Beto222022Carla2222Diego22]------100gt

                                                                    Com 20 de voto taacutetico lthttpelectionsimpythonanywherecomdirect_res1111110--[0021][22Ana222022Beto2222Carla2222Diego22]1-[02000]---100gt

                                                                    Com 100 de voto taacuteticona Ana e Beto lthttpelectionsimpythonanywherecomdirect_res0000100--[0021][22Ana222022Beto222022Carla2222Diego22]1-[101000]---100gt

                                                                    41

                                                                    42 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV

                                                                    Neste cenaacuterio teremos Ana Carla e Beto concorrendo e trecircs perfis distintos que apoiamcada candidato As distribuiccedilotildees de notas dos perfis se encontram na tabela abaixo

                                                                    Tabela 12 ndash Distribuiccedilatildeo de notas - Cenaacuterio 2

                                                                    Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                                    deeleitores

                                                                    1 10 5 0 422 0 10 5 303 5 0 10 28

                                                                    Com essas distribuiccedilotildees Carla eacute eliminada na primeira rodada e seus 28 de votossatildeo transferidos para a segunda opccedilatildeo de seus eleitores Ana que eacute eleita com 70 dosvotos e uma meacutedia de 56

                                                                    Figura 25 ndash IRV primeiro turno - Cenaacuterio 2

                                                                    Figura 26 ndash IRV segundo turno - Cenaacuterio 2

                                                                    42

                                                                    Cientes desse provaacutevel futuro cenaacuterio onde Ana eacute eleita uma pequena parte dos elei-tores de Beto estrategicamente o abandona e decide apoiar Carla na esperanccedila de leva-laao segundo turno contra Ana As novas distribuiccedilotildees de notas se encontram na tabelaabaixo com essa porccedilatildeo de eleitores representada pelo perfil 4

                                                                    Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2

                                                                    Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                                    deeleitores

                                                                    1 10 5 0 422 0 10 5 283 5 0 10 284 0 8 10 2

                                                                    Essa mudanccedila estrateacutegica de voto altera a ordem de eliminaccedilotildees do sistema com Betosendo o primeiro a ser eliminado Com isso seus votos satildeo naturalmente transferidos paraCarla que derrota Ana no segundo turno com 58 dos votos

                                                                    Figura 27 ndash IRV primeiro turno com voto taacutetico - Cenaacuterio 2

                                                                    Figura 28 ndash IRV segundo turno com voto taacutetico - Cenaacuterio 2

                                                                    43

                                                                    Percebendo que a eleiccedilatildeo de Beto natildeo era provaacutevel seus eleitores conseguiram aomenos impedir a eleiccedilatildeo do pior candidato para eles Mas para isso foi necessaacuterio queeles tivessem a informaccedilatildeo de como os outros eleitores votariam Uma aproximaccedilatildeo dessasinformaccedilotildees poderia ser obtida em um cenaacuterio real com poucos candidatos atraveacutes depesquisas eleitorais poreacutem se o nuacutemero de candidatos eacute significativo uma noccedilatildeo completadas distribuiccedilotildees dos rankings dos eleitores se torna muito menos viaacutevel e dificulta aformulaccedilatildeo de estrateacutegias para alterar a ordem em que os candidatos satildeo eliminados

                                                                    Esses resultados podem ser replicados acessando os linksSem voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana22

                                                                    22Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                                    Com voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana

                                                                    2222Beto2222Carla22]-----42Voter20Profile2001020520028Voter20Profile2010201020528Voter20Profile202520020102Voter20Profile20302082010100gt

                                                                    43 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE

                                                                    O interessante dos sistemas IRV e TRS eacute que os resultados do cenaacuterio anterior po-deriam ter sido obtidos ao inveacutes do voto taacutetico pela sua natildeo-monotonicidade Seriapossiacutevel que a Carla derrotasse a Ana no segundo turno atraveacutes do proacuteprio aumento depopularidade da Ana Assumindo que essa popularizaccedilatildeo ocorresse entre os candidatosdo perfil 2 onde 3 passasse a apoiar a Ana ao inveacutes do Beto as novas distribuiccedilotildeesseguiriam a tabela abaixo

                                                                    Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                                    Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                                    deeleitores

                                                                    1 10 5 0 452 0 10 5 273 5 0 10 28

                                                                    Dessa maneira Beto agora com uma porcentagem dos eleitores menor do que a deCarla seraacute eliminado na primeira rodada e como seus eleitores tecircm a Carla como segundaopccedilatildeo ela receberaacute todos os seus votos e seraacute eleita na segunda rodada As rodadas doIRV podem ser vistas nas figuras 29 e 30

                                                                    44

                                                                    Figura 29 ndash IRV primeiro turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                                    Figura 30 ndash IRV segundo turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                                    Tabela 15 ndash Resultados do Cenaacuterio 3Candidato

                                                                    eleitoMeacutedia das

                                                                    notasAntes da

                                                                    popularizaccedilatildeode Ana

                                                                    Ana 56

                                                                    Apoacutespopularizaccedilatildeo

                                                                    de AnaCarla 415

                                                                    Os efeitos dessa caracteriacutestica se refletem na satisfaccedilatildeo meacutedia da populaccedilatildeo A Ana eacuteclaramente a melhor candidata e mesmo com o seu ganho de popularidade (ou devido aele) a Carla eacute eleita

                                                                    Esses resultados podem ser replicados acessando os linksAntes da popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecom

                                                                    direct_res0010000---[22Ana2222Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                                    45

                                                                    Apoacutes popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana2222Beto2222Carla22]-----45Voter20Profile2001020520027Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                                    44 CENAacuteRIO 4 COALIZOtildeES

                                                                    O TRS por ser organizado em dois turnos separados normalmente a semanas dedistacircncia um do outro acaba abrindo brecha agrave mudanccedila de opiniatildeo por parte dos eleitorese o desenvolvimento de novas estrateacutegias por parte dos candidatos tais como a coalizatildeocom candidatos jaacute eliminados Com isso em mente nesse cenaacuterio teremos novamenteos quatro candidatos Ana Beto Carla e Diego Os trecircs primeiros seratildeo gerados dadistribuiccedilatildeo Neutral e Diego da distribuiccedilatildeo Disliked

                                                                    Figura 31 ndash TRS turno 1 - Cenaacuterio 4

                                                                    No TRS normal Ana Beto e Carla possuem com essas distribuiccedilotildees quantidades devotos muito proacuteximas com Beto e Carla indo para o segundo turno Carla estaacute 10 votosatraacutes de Beto e decide aproveitar o espaccedilo de tempo entre os dois turnos para tentaragregar mais votos Com isso Carla se aproxima de Diego e juntos formam uma coalizatildeoNo entanto com sua baixa popularidade Diego acaba ferindo a reputaccedilatildeo de Carla etorna o segundo turno muito mais faacutecil para Beto (Figura 33) Se Carla tivesse buscado osuporte de Ana por outro lado ela se veria vitoriosa no segundo turno e com uma amplavantagem sobre o Beto (Figura 34) Ou ateacute mesmo sem buscar uma coalizatildeo mesmosendo uma corrida apertada Carla teria naturalmente sido eleita (Figura 32)

                                                                    Esses resultados podem ser replicados acessando os linksSem coalizotildees lthttpelectionsimpythonanywherecomdirect_res0100000

                                                                    --[0002][22Ana222022Beto2222Carla2222Diego22]------100gt

                                                                    46

                                                                    Figura 32 ndash TRS turno 2 - Cenaacuterio 4

                                                                    Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4

                                                                    Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4

                                                                    47

                                                                    Coalizatildeo Carla e Diego lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2203Carla20Diego-100gt

                                                                    Coalizatildeo Carla e Ana lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2200Carla20Ana-100gt

                                                                    45 CENAacuteRIO 5 DILEMA DO PRISIONEIRO

                                                                    Neste cenaacuterio temos uma eleiccedilatildeo de uma vaga com trecircs candidatos concorrentes e trecircsperfis distintos de eleitores que seguiratildeo as seguintes distribuiccedilotildees

                                                                    Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5

                                                                    Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                                    deeleitores

                                                                    1 10 -10 5 362 -10 10 5 343 -10 -10 5 30

                                                                    Esse contexto nos remete ao notaacutevel dilema do prisioneiro Nele dois prisioneiroscuacutemplices satildeo interrogados individualmente sem poder se comunicar um com o outro ecada um enfrenta o dilema de delatar ou natildeo o seu parceiro Se os dois prisioneirosdecidem se manter calados sobre o crime ambos satildeo sentenciados a um ano de prisatildeo Seapenas um deles dedurar o outro o traidor sai livre enquanto seu parceiro eacute condenadoa trecircs anos Se ambos dedurarem um ao outro eles satildeo condenados juntos a dois anosde prisatildeo Esse dilema eacute uma ideia claacutessica presente no estudo da teoria dos jogos sendooriginalmente elaborada por Merrill Flood e Melvin Dresher em 1950 e mais tarde sendonomeada de dilema dos prisioneiros por Albert W Tucker (POUNDSTONE 1992)

                                                                    O que esse dilema nos mostra eacute a tentaccedilatildeo que o indiviacuteduo deteacutem se sua racionalizaccedilatildeoestiver voltada para seus proacuteprios interesses e somente eles em oposiccedilatildeo a pensar no bemdo grupo como um todo Neste cenaacuterio encontramos dois grupos de eleitores expressiva-mente opostos os perfis 1 e 2 Se qualquer uma das preferecircncias desses perfis fosse eleitaisso significaria uma alta rejeiccedilatildeo de maior parte da populaccedilatildeo No entanto eles possuema segunda opccedilatildeo em comum a Carla que por sua vez eacute a preferecircncia do terceiro perfilPortanto a eleiccedilatildeo da Carla seria logicamente o resultado oacutetimo

                                                                    Mesmo assim a Ana eacute eleita nos dois sistemas acima o que natildeo parece justo poispela tabela 16 eacute evidente que apenas 36 da populaccedilatildeo a aprova enquanto que os outros64 a reprovam ao maacuteximo O sistema IRV se comporta de maneira idecircntica ao TRS

                                                                    48

                                                                    Figura 35 ndash FPTP - Cenaacuterio 5

                                                                    Figura 36 ndash TRS segundo turno - Cenaacuterio 5

                                                                    nesta situaccedilatildeo Com esse resultado a meacutedia das notas eacute -28 No entanto os trecircs sistemasseguintes nos apresentam resultados diferentes

                                                                    Tabela 17 ndash Resultados do Cenaacuterio 5

                                                                    Sistema Candidatoeleito

                                                                    Meacutedia dasnotas

                                                                    FPTP Ana -28TRS Ana -28IRV Ana -28AVS Carla 50BC Carla 50SVS Carla 50

                                                                    49

                                                                    Figura 37 ndash AVS - Cenaacuterio 5

                                                                    Figura 38 ndash BC - Cenaacuterio 5

                                                                    Tanto o AVS quanto o Borda Count e o SVS satildeo sistemas que consideram todasas opiniotildees de cada eleitor ao mesmo tempo e por isso satildeo capazes de eleger o melhorcandidato nesta situaccedilatildeo diferentemente do TRS que natildeo absorve completamente todosentimento do eleitor por todos os candidatos e o IRV que apesar de ser bem expressivoquebra esse processo em inuacutemeras rodadas o que permite a perda de informaccedilatildeo ao longodelas

                                                                    Esses resultados podem ser replicados acessando o linklthttpelectionsimpythonanywherecomdirect_res1111110---[22Ana

                                                                    222022Beto222022Carla22]-----36Voter20Profile2001020-1020534Voter20Profile201-10201020530Voter20Profile202-1020-10205100gt

                                                                    50

                                                                    Figura 39 ndash SVS - Cenaacuterio 5

                                                                    46 CENAacuteRIO 6 VOTO DE MINORIA

                                                                    Neste cenaacuterio temos uma eleiccedilatildeo com quatro candidatos e duas vagas A Ana seraacutea preferecircncia de uma extensa parte da populaccedilatildeo (distribuiccedilatildeo Loved Figura 53) Betoe Carla seratildeo candidatos razoavelmente populares (distribuiccedilatildeo Neutral Figura 47) eDiego seraacute a preferecircncia de apenas um pequeno grupo especiacutefico e rejeitado pela maioria(distribuiccedilatildeo Disliked Figura 51) Eacute intuitivo esperar que os dois candidatos eleitos seratildeoa Ana e ou o Beto ou a Carla e isso eacute exatamente o que ocorre na figura 40 no sistemaFPTP sem voto de minoria

                                                                    Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria

                                                                    Eacute evidente a discrepacircncia da quantidade de votos da Ana para os outros candidatose apesar de Beto e Carla serem mais populares que Diego os trecircs natildeo se encontrammuito afastados Poreacutem se a pequena fraccedilatildeo de candidatos que possuem a Ana como

                                                                    51

                                                                    Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego

                                                                    preferecircncia e Diego como segunda opccedilatildeo optarem pelo voto de minoria a situaccedilatildeo mudacompletamente (Figura 41) Assim apesar de extensamente rejeitado Diego conquistaa segunda vaga e a meacutedia das notas despenca de 2929 para 0505 No entanto aindaexiste um cenaacuterio pior Se os outros grupos de eleitores pensarem da mesma forma eevitarem votar na Ana achando que sua eleiccedilatildeo jaacute estaacute assegurada apenas 80 de votode minoria para esses grupos jaacute eacute o suficiente para eliminaacute-la das eleiccedilotildees (Figura 42)Com a Ana eliminada a meacutedia das notas cai ainda mais para 0058

                                                                    Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego

                                                                    O sistema Bloc Vote eacute uma das soluccedilotildees para o voto de minoria Permitindo queos eleitores votem no mesmo nuacutemero de candidatos que de vagas a serem preenchidasnatildeo existe o iacutempeto a esse tipo de voto estrateacutegico O resultado desse sistema portantoretorna a meacutedia das notas a casa dos 29 (Figura 43) Os sistemas AVS Borda Count eSVS tambeacutem impedem a presenccedila do voto de minoria e atingem resultados semelhantes

                                                                    52

                                                                    Figura 43 ndash BV - Cenaacuterio 6

                                                                    Tabela 18 ndash Resultados do Cenaacuterio 6

                                                                    Sistema Candidatoseleitos

                                                                    Meacutedia dasnotas

                                                                    FPTP sem voto de minoriaAna eBeto 2929

                                                                    FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

                                                                    FPTP com 80 de voto de minoriaBeto eCarla 0058

                                                                    Bloc VoteAna eCarla 2913

                                                                    Esses resultados podem ser replicados acessando os links

                                                                    Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

                                                                    100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

                                                                    80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

                                                                    53

                                                                    5 COMO FUNCIONA O SIMULADOR

                                                                    O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

                                                                    51 CLASSE ELECTIONS

                                                                    Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

                                                                    bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

                                                                    Figura 44 ndash estrutura candidates

                                                                    bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

                                                                    bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

                                                                    Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

                                                                    Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

                                                                    54

                                                                    Figura 45 ndash estrutura voters

                                                                    Figura 46 ndash estrutura votes

                                                                    daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

                                                                    Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

                                                                    55

                                                                    Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

                                                                    Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

                                                                    na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

                                                                    56

                                                                    Figura 49 ndash PDF - Distribuiccedilatildeo Liked

                                                                    Figura 50 ndash CDF - Distribuiccedilatildeo Liked

                                                                    (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

                                                                    Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

                                                                    57

                                                                    Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

                                                                    Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

                                                                    candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

                                                                    Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

                                                                    58

                                                                    Figura 53 ndash PDF - Distribuiccedilatildeo Loved

                                                                    Figura 54 ndash CDF - Distribuiccedilatildeo Loved

                                                                    funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

                                                                    59

                                                                    Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                                                                    Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                                                                    Meacutedia das Notas sumei

                                                                    sumvj nij

                                                                    etimes v

                                                                    Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                                                                    Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                                                                    60

                                                                    Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                                                                    Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                                                                    52 CLASSE FIRSTPASTTHEPOST

                                                                    Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                                                                    Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                                                                    61

                                                                    Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                                                                    Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                                                                    mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                                                                    62

                                                                    53 CLASSE TWOROUNDSYSTEM

                                                                    A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                                                                    54 CLASSE INSTANTRUNOFFVOTING

                                                                    A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                                                                    Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                                                                    63

                                                                    cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                                                                    55 CLASSE APPROVALVOTING

                                                                    Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                                                                    56 CLASSE BORDACOUNT

                                                                    Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                                                                    57 CLASSE SCOREVOTING

                                                                    De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                                                                    64

                                                                    58 CLASSE BLOCVOTE

                                                                    O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                                                                    59 TECNOLOGIAS UTILIZADAS

                                                                    A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                                                                    Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                                                                    O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                                                                    Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                                                                    65

                                                                    6 CONCLUSAtildeO

                                                                    Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                                                                    Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                                                                    Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                                                                    Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                                                                    Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                                                                    66

                                                                    REFEREcircNCIAS

                                                                    AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                                                                    Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                                                                    Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                                                                    Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                                                                    HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                                                                    LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                                                                    ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                                                                    Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                                                                    POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                                                                    The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                                                                    67

                                                                    APEcircNDICES

                                                                    APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                                                    Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                                                    if(not len(selfvoter_profiles))

                                                                    for voter in range(selfN_VOTERS)

                                                                    candidates_rank = dict()

                                                                    for candidate in reversed(range(selfN_CANDIDATES))

                                                                    if(selfBIAS_VECTOR[candidate]==4)

                                                                    candidates_rank[candidate] = self_sortear(selfloved)

                                                                    elif(selfBIAS_VECTOR[candidate]==3)

                                                                    candidates_rank[candidate] = self_sortear(selfliked)

                                                                    elif(selfBIAS_VECTOR[candidate]==2)

                                                                    candidates_rank[candidate] = self_sortear(selfdisliked)

                                                                    elif(selfBIAS_VECTOR[candidate]==1)

                                                                    candidates_rank[candidate] = self_sortear(selfhated)

                                                                    elif(selfBIAS_VECTOR[candidate]==-1)

                                                                    candidates_rank[candidate] = self_sortear(selfpolarizer

                                                                    )

                                                                    elif(selfBIAS_VECTOR[candidate]==-2)

                                                                    candidates_rank[candidate] = self_sortear(self

                                                                    more_polarizer)

                                                                    else

                                                                    candidates_rank[candidate] = self_sortear(selfneutral)

                                                                    selfvotersappend(candidates_rank)

                                                                    else

                                                                    ranges = []

                                                                    ranks = []

                                                                    for prof in selfvoter_profiles

                                                                    rangesappend(int(prof[pop_percentage]))

                                                                    rank =

                                                                    for index score in enumerate(prof[scores])

                                                                    rank[index] = score

                                                                    ranksappend(rank)

                                                                    for index _range in enumerate(ranges)

                                                                    for _ in range(int(selfN_VOTERS(_range100)))

                                                                    selfvotersappend(ranks[index])

                                                                    68

                                                                    APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                                                    Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                                                    for i in range(selfN_CANDIDATES)

                                                                    selfcandidates[i] = 0

                                                                    selfvotes[i] = set()

                                                                    APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                                                    Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                                                    for candidate in range(selfN_CANDIDATES)

                                                                    rating_sum = 0

                                                                    for voter in selfvoters

                                                                    rating_sum += voter[candidate]

                                                                    selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                                                    APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                                                    Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                                                    if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                                                    return selfcalculate_mean(winners)

                                                                    else

                                                                    chose_best = True if winners[0] == selfbest_candidate else

                                                                    False

                                                                    return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                                                    69

                                                                    APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                                                    Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                                                    rating_sum = 0

                                                                    for voter in selfvoters

                                                                    for candidate in winners

                                                                    rating_sum += voter[candidate]

                                                                    return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                                                    APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                                                    Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                                                    for i in range(1 selfN_VACANCIES + 2)

                                                                    selfleading_candidatesappend(selfsorted_candidates[-i][self

                                                                    CANDIDATE_INDEX])

                                                                    APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                                                    Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                                                    for leader in selfelecrounds[-1]

                                                                    selfleading_candidatesappend(leader[0])

                                                                    70

                                                                    APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                                                    Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                                                    self_account_for_coalitions()

                                                                    for voter in selfvoters

                                                                    selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                                                    (1)))

                                                                    temp = []

                                                                    for voter in selfsorted_voters

                                                                    new_dict = defaultdict(list)

                                                                    for k in voter

                                                                    new_dict[k[1]]append(k[0])

                                                                    tempappend(new_dict)

                                                                    selfsorted_voters = []

                                                                    for voter_index current_voter in enumerate(temp)

                                                                    new_voter = []

                                                                    for rating candidate_indexes in current_voteritems()

                                                                    if len(current_voter[rating]) gt 1

                                                                    shuffle(current_voter[rating])

                                                                    for e in candidate_indexes

                                                                    new_voterappend((e rating))

                                                                    else

                                                                    new_voterappend((candidate_indexes[0] rating))

                                                                    selfsorted_votersappend(new_voter)

                                                                    selfcandidates[new_voter[-1][0]] += 1

                                                                    selfvotes[new_voter[-1][0]]add(voter_index)

                                                                    71

                                                                    APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                                                    Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                                                    for candidate in selfvotes_copy

                                                                    if candidate not in selfelecleading_candidates

                                                                    for voter_index in selfvotes_copy[candidate]

                                                                    for index _candidate in enumerate(reversed(selfelec

                                                                    sorted_voters[voter_index]))

                                                                    if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                                                    leading_candidates

                                                                    if randomrandom() lt selfelec

                                                                    tactical_vote_percentages[_candidate[selfelec

                                                                    CANDIDATE_INDEX]]

                                                                    selfrankings_changed[voter_index] = copy

                                                                    deepcopy(selfelecsorted_voters[voter_index])

                                                                    selfrankings_changed[voter_index][-(index + 1)]

                                                                    selfrankings_changed[voter_index][-1] = self

                                                                    rankings_changed[voter_index][-1] self

                                                                    rankings_changed[voter_index][-(index + 1)]

                                                                    selfcandidates[candidate] -= 1

                                                                    selfcandidates[_candidate[selfelec

                                                                    CANDIDATE_INDEX]] += 1

                                                                    selfvotes[candidate]remove(voter_index)

                                                                    selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                                                    ]]add(voter_index)

                                                                    break

                                                                    break

                                                                    72

                                                                    APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                                                    Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                                                    half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                                                    for candidate in selfelecleading_candidates

                                                                    if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                                                    continue

                                                                    for voter_index in selfvotes_copy[candidate]

                                                                    if voter_index in selfrankings_changed

                                                                    ranking = selfrankings_changed[voter_index]

                                                                    else

                                                                    ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                                                    ])

                                                                    for index _candidate in enumerate(reversed(ranking))

                                                                    if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                    leading_candidates or (_candidate[selfelec

                                                                    CANDIDATE_INDEX] in selfelecleading_candidates and

                                                                    selfelecleading_candidatesindex(_candidate[selfelec

                                                                    CANDIDATE_INDEX]) gt= half_vacancies)

                                                                    if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                                                    if randomrandom() lt selfelec

                                                                    minority_vote_percentages[_candidate[selfelec

                                                                    CANDIDATE_INDEX]]

                                                                    selfcandidates[candidate] -= 1

                                                                    selfcandidates[_candidate[selfelec

                                                                    CANDIDATE_INDEX]] += 1

                                                                    break

                                                                    break

                                                                    break

                                                                    73

                                                                    APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                                                    Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                                                    self_account_for_coalitions()

                                                                    for candidate in selfvotes

                                                                    if candidate = selfwinner and candidate = selfsecond_place

                                                                    for voter_index in selfvotes[candidate]

                                                                    if voter_index in selfrankings_changed

                                                                    ranking = selfrankings_changed[voter_index]

                                                                    else

                                                                    ranking = copydeepcopy(selfelecsorted_voters[

                                                                    voter_index])

                                                                    for index2 candidate in enumerate(reversed(ranking))

                                                                    if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                                                    selfcandidates[selfwinner] += 1

                                                                    selfvotes[selfwinner]add(voter_index)

                                                                    break

                                                                    elif candidate[selfelecCANDIDATE_INDEX] == self

                                                                    second_place

                                                                    selfcandidates[selfsecond_place] += 1

                                                                    selfvotes[selfsecond_place]add(voter_index)

                                                                    break

                                                                    selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                    winners = []

                                                                    vacancies = selfelecN_VACANCIES

                                                                    for candidate in reversed(selfsorted_candidates)

                                                                    if vacancies == 0

                                                                    break

                                                                    winnersappend(candidate[0])

                                                                    vacancies -= 1

                                                                    mean chose_best = selfelecget_mean(winners = winners)

                                                                    74

                                                                    APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                                                    Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                                                    for voter_index voter in enumerate(selfelecsorted_voters)

                                                                    voter_dict = dict()

                                                                    og_voter_dict = dict()

                                                                    for tup in voter

                                                                    voter_dict[tup[0]] = tup[1]

                                                                    og_voter_dict[tup[0]] = tup[1]

                                                                    for coalition in selfeleccoalitions

                                                                    for candidate in coalition

                                                                    add_to_score = 0

                                                                    for candidate2 in coalition

                                                                    if candidate == candidate2

                                                                    continue

                                                                    half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                                                    if half lt 0

                                                                    add_to_score += mathceil(half)

                                                                    else

                                                                    add_to_score += mathfloor(half)

                                                                    if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                                                    voter_dict[candidate[rsquovaluersquo]] = 10

                                                                    elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                                                    voter_dict[candidate[rsquovaluersquo]] = -10

                                                                    else

                                                                    voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                                                    selfrankings_changed[voter_index] = []

                                                                    for candidate in voter_dict

                                                                    selfrankings_changed[voter_index]append((candidate voter_dict[

                                                                    candidate]))

                                                                    selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                                                    voter_index] key=lambda x x[1])

                                                                    75

                                                                    APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                                    Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                                    selfelecroundsappend(selfsorted_candidates[_round])

                                                                    if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                    N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                                    N_VACANCIES - 1)

                                                                    return 2

                                                                    elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                    N_VOTERS gt 05)

                                                                    return 1

                                                                    else

                                                                    selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                                    CANDIDATE_INDEX])

                                                                    for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                                    elecCANDIDATE_INDEX]]

                                                                    if voter_index in selfrankings_changed

                                                                    for candidate in reversed(selfrankings_changed[voter_index

                                                                    ])

                                                                    if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                    excluded

                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                    ]] += 1

                                                                    selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                    add(voter_index)

                                                                    break

                                                                    else

                                                                    continue

                                                                    else

                                                                    for candidate in reversed(selfelecsorted_voters[

                                                                    voter_index])

                                                                    if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                    excluded

                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                    ]] += 1

                                                                    selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                    add(voter_index)

                                                                    break

                                                                    else

                                                                    continue

                                                                    selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                    return 0

                                                                    76

                                                                    APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                                    Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                                    for index in range(selfelecN_CANDIDATES)

                                                                    selfcandidates[index] = 0

                                                                    for voter in selfelecsorted_voters

                                                                    for candidate in reversed(voter)

                                                                    if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                    else

                                                                    break

                                                                    APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                                    Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                                    for index in range(selfelecN_CANDIDATES)

                                                                    selfcandidates[index] = 0

                                                                    for voter in selfelecsorted_voters

                                                                    if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                    elecCANDIDATE_INDEX]]

                                                                    selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                                    else

                                                                    for candidate in reversed(voter)

                                                                    if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                    else

                                                                    break

                                                                    77

                                                                    APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                                    Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                                    pos = set()

                                                                    for index perc in enumerate(selfelectactical_vote_percentages)

                                                                    if perc gt 0

                                                                    posadd(index)

                                                                    for candidate in selfeleccandidates

                                                                    if candidate not in selfleading_candidates

                                                                    for voter_index in selfvotes[candidate]

                                                                    raised = None

                                                                    for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                                    ])

                                                                    if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                                    leading_candidates

                                                                    if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                                    if randomrandom() lt selfelectactical_vote_percentages[

                                                                    candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                                    ranking = [None]selfelecN_CANDIDATES

                                                                    ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                    selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                    CANDIDATE_INDEX]])

                                                                    raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                    break

                                                                    break

                                                                    break

                                                                    if raised = None

                                                                    for _candidate in selfleading_candidates

                                                                    if _candidate = ranking[-1][0]

                                                                    ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                    _candidate])

                                                                    buried = _candidate

                                                                    break

                                                                    i = 1

                                                                    for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                    if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                                    buried]

                                                                    continue

                                                                    else

                                                                    ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                    selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                    CANDIDATE_INDEX]])

                                                                    i += 1

                                                                    selfrankings_changed[voter_index] = ranking

                                                                    78

                                                                    APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                                    Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                                    for voter_index in selfvotes[candidate]

                                                                    if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                                    ]

                                                                    for _candidate in selfleading_candidates

                                                                    if _candidate = candidate

                                                                    ranking = [None]selfelecN_CANDIDATES

                                                                    ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                    _candidate])

                                                                    buried = _candidate

                                                                    break

                                                                    i = 1

                                                                    for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                    if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                                    continue

                                                                    else

                                                                    ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                    selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                    CANDIDATE_INDEX]])

                                                                    i += 1

                                                                    selfrankings_changed[voter_index] = ranking

                                                                    79

                                                                    APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                                    Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                                    for index in range(selfelecN_CANDIDATES)

                                                                    selfcandidates[index] = 0

                                                                    for voter_index voter in enumerate(selfelecsorted_voters)

                                                                    score = 0

                                                                    if voter_index in selfrankings_changed

                                                                    for candidate in selfrankings_changed[voter_index]

                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                    score += 1

                                                                    else

                                                                    for candidate in voter

                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                    score += 1

                                                                    APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                                    Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                                    for voter_index voter in enumerate(selfelecsorted_voters)

                                                                    if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                    elecCANDIDATE_INDEX]]

                                                                    selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                                    sorted_voters[voter_index])

                                                                    for candidate_index candidate in enumerate(reversed(voter))

                                                                    if candidate_index == 0

                                                                    selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                    voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                                    else

                                                                    selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                    voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                                    80

                                                                    APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                                    Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                                    for index in range(selfelecN_CANDIDATES)

                                                                    selfcandidates[index] = 0

                                                                    for voter_index voter in enumerate(selfelecsorted_voters)

                                                                    if voter_index in selfrankings_changed

                                                                    for candidate in selfrankings_changed[voter_index]

                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                    selfelecCANDIDATE_RANK]

                                                                    else

                                                                    for candidate in voter

                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                    selfelecCANDIDATE_RANK]

                                                                    APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                                    Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                                    for index in range(selfelecN_CANDIDATES)

                                                                    selfcandidates[index] = 0

                                                                    for voter in selfelecsorted_voters

                                                                    votes = selfelecN_VACANCIES

                                                                    for candidate in reversed(voter)

                                                                    if votes == 0

                                                                    break

                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                    votes -= 1

                                                                    • Folha de aprovaccedilatildeo
                                                                    • Agradecimentos
                                                                    • Epiacutegrafe
                                                                    • Resumo
                                                                    • Abstract
                                                                    • Lista de ilustraccedilotildees
                                                                    • Lista de Coacutedigos
                                                                    • Lista de tabelas
                                                                    • Lista de abreviaturas e siglas
                                                                    • Sumaacuterio
                                                                    • INTRODUCcedilAtildeO
                                                                      • MOTIVACcedilAtildeO E OBJETIVO
                                                                      • MEacuteTODO
                                                                      • ESTRUTURA
                                                                        • SISTEMAS ELEITORAIS
                                                                          • FISRT PAST THE POST
                                                                            • Exemplo
                                                                            • Vantagens e Desvantagens do FPTP
                                                                            • Voto Uacutetil no FPTP
                                                                              • TWO-ROUND SYSTEM
                                                                                • Exemplo
                                                                                • Vantagens e Desvantagens do TRS
                                                                                • Voto Uacutetil no TRS
                                                                                  • INSTANT-RUNOFF VOTING
                                                                                    • Exemplo
                                                                                    • Vantagens e Desvantagens do IRV
                                                                                    • Voto Uacutetil no IRV
                                                                                      • APPROVAL VOTING SYSTEM
                                                                                        • Exemplo
                                                                                        • Vantagens e Desvantagens do AVS
                                                                                        • Voto Uacutetil no AVS
                                                                                          • THE BORDA COUNT
                                                                                            • Exemplo
                                                                                            • Vantagens e Desvantagens do BC
                                                                                            • Voto Uacutetil no BC
                                                                                              • SCORE VOTING SYSTEM
                                                                                                • Exemplo
                                                                                                • Vantagens e Desvantagens do SVS
                                                                                                • Voto Uacutetil no SVS
                                                                                                  • BLOC VOTE
                                                                                                    • Exemplo
                                                                                                    • Voto Uacutetil no BV
                                                                                                        • O SIMULADOR
                                                                                                        • CENAacuteRIOS PERTINENTES
                                                                                                          • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                          • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                          • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                          • CENAacuteRIO 4 COALIZOtildeES
                                                                                                          • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                          • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                            • COMO FUNCIONA O SIMULADOR
                                                                                                              • CLASSE Elections
                                                                                                              • CLASSE FirstPastThePost
                                                                                                              • CLASSE TwoRoundSystem
                                                                                                              • CLASSE InstantRunoffVoting
                                                                                                              • CLASSE ApprovalVoting
                                                                                                              • CLASSE BordaCount
                                                                                                              • CLASSE ScoreVoting
                                                                                                              • CLASSE BlocVote
                                                                                                              • TECNOLOGIAS UTILIZADAS
                                                                                                                • CONCLUSAtildeO
                                                                                                                • Referecircncias
                                                                                                                • Meacutetodo create_voters
                                                                                                                • Meacutetodo create_candidates
                                                                                                                • Meacutetodo calculate_means
                                                                                                                • Meacutetodo get_mean
                                                                                                                • Meacutetodo calculate_mean
                                                                                                                • Meacutetodo set_leading_candidates
                                                                                                                • Meacutetodo irv_set_leading_candidates
                                                                                                                • Meacutetodo sort_ranks
                                                                                                                • Meacutetodo fptp_count_tactical_votes
                                                                                                                • Meacutetodo fptp_count_minority_votes
                                                                                                                • Meacutetodo trs_second_round
                                                                                                                • Meacutetodo trs_account_for_coalitions
                                                                                                                • Meacutetodo irv_count_votes
                                                                                                                • Meacutetodo avs_count_votes
                                                                                                                • Meacutetodo avs_count_votes_with_tactical
                                                                                                                • Meacutetodo irv_apply_tactical_votes
                                                                                                                • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                                • Meacutetodo bc_sum_candidates_scores
                                                                                                                • Meacutetodo svs_apply_tactical_votes
                                                                                                                • Meacutetodo svs_sum_candidates_scores
                                                                                                                • Meacutetodo bv_count_votes

                                                                      35

                                                                      Figura 10 ndash IRV primeiro turno - Cenaacuterio 1

                                                                      Figura 11 ndash IRV segundo turno - Cenaacuterio 1

                                                                      Figura 12 ndash IRV terceiro turno - Cenaacuterio 1

                                                                      36

                                                                      Figura 13 ndash AVS - Cenaacuterio 1 sem voto taacutetico

                                                                      Figura 14 ndash BC - Cenaacuterio 1 sem voto taacutetico

                                                                      Figura 15 ndash SVS - Cenaacuterio 1 sem voto taacutetico

                                                                      37

                                                                      Nesse cenaacuterio sem voto taacutetico o uacutenico sistema que natildeo elege o Beto eacute o AVS Todosos outros elegem o melhor candidato Ou seja apesar de Beto ter uma melhor meacutediadas notas dos eleitores existem mais eleitores que ranqueiam Ana com uma nota acimade 0 No entanto apenas 20 dos eleitores de Diego e Carla que preferem a Ana aoinveacutes do Beto satildeo o suficiente para fazer Beto natildeo ser eleito se eles decidirem abandonarsua primeira opccedilatildeo e votar na Ana Considerando a vantagem que os votos taacuteticosproporcionam agrave Ana esta eacute eleita em todos os sistemas menos o TRS e o IRV

                                                                      Figura 16 ndash FPTP - Cenaacuterio 1 - 20 de voto taacutetico na Ana

                                                                      Figura 17 ndash TRS segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                                      38

                                                                      Figura 18 ndash IRV primeiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                                      Figura 19 ndash IRV segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                                      Figura 20 ndash IRV terceiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                                      39

                                                                      Figura 21 ndash AVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                                      Figura 22 ndash BC - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                                      Figura 23 ndash SVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                                      40

                                                                      Eacute claro que se os eleitores que preferem o Beto tambeacutem votassem de maneira estra-teacutegica a situaccedilatildeo se equilibraria e haveria o mesmo niacutevel de concorrecircncia entre os doiscandidatos que ocorre quando natildeo haacute voto taacutetico Poreacutem no Borda Count esse equiliacute-brio pode natildeo acontecer e as estrateacutegias de compromising e burying podem acabar saindopela culatra se uma porcentagem elevada dos eleitores as adotarem Abaixo encontram-seos resultados para esse sistema quando 100 dos eleitores de Carla e Diego se comportammaliciosamente

                                                                      Figura 24 ndash BC - Cenaacuterio 1 100 de voto taacutetico na Ana e Beto

                                                                      Por causa do uso demasiado da estrateacutegia burying Ana e Beto perdem muitos pontose isso abre espaccedilo para uma vitoacuteria da Carla No entanto para porcentagens menores que100 o Beto ainda eacute o vencedor

                                                                      Essas duas estrateacutegias tambeacutem foram implementadas nesse simulador para o sistemaIRV e eacute possiacutevel ver como ele eacute resistente a elas Para que seja possiacutevel mudar os resultadosde uma eleiccedilatildeo sob o IRV eacute necessaacuterio mudar a ordem de eliminaccedilatildeo dos candidatos paraque o seu candidato preferido acabe enfrentando um candidato mais fraco nas rodadasfinais Isso natildeo ocorre com compromising e burying No proacuteximo cenaacuterio seraacute analisadacomo eacute possiacutevel modificar os resultados de uma eleiccedilatildeo sob o IRV

                                                                      Esses resultados podem ser replicados acessando os linksSem votos taacuteticos lthttpelectionsimpythonanywherecomdirect_res1111110

                                                                      --[0021][22Ana2222Beto222022Carla2222Diego22]------100gt

                                                                      Com 20 de voto taacutetico lthttpelectionsimpythonanywherecomdirect_res1111110--[0021][22Ana222022Beto2222Carla2222Diego22]1-[02000]---100gt

                                                                      Com 100 de voto taacuteticona Ana e Beto lthttpelectionsimpythonanywherecomdirect_res0000100--[0021][22Ana222022Beto222022Carla2222Diego22]1-[101000]---100gt

                                                                      41

                                                                      42 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV

                                                                      Neste cenaacuterio teremos Ana Carla e Beto concorrendo e trecircs perfis distintos que apoiamcada candidato As distribuiccedilotildees de notas dos perfis se encontram na tabela abaixo

                                                                      Tabela 12 ndash Distribuiccedilatildeo de notas - Cenaacuterio 2

                                                                      Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                                      deeleitores

                                                                      1 10 5 0 422 0 10 5 303 5 0 10 28

                                                                      Com essas distribuiccedilotildees Carla eacute eliminada na primeira rodada e seus 28 de votossatildeo transferidos para a segunda opccedilatildeo de seus eleitores Ana que eacute eleita com 70 dosvotos e uma meacutedia de 56

                                                                      Figura 25 ndash IRV primeiro turno - Cenaacuterio 2

                                                                      Figura 26 ndash IRV segundo turno - Cenaacuterio 2

                                                                      42

                                                                      Cientes desse provaacutevel futuro cenaacuterio onde Ana eacute eleita uma pequena parte dos elei-tores de Beto estrategicamente o abandona e decide apoiar Carla na esperanccedila de leva-laao segundo turno contra Ana As novas distribuiccedilotildees de notas se encontram na tabelaabaixo com essa porccedilatildeo de eleitores representada pelo perfil 4

                                                                      Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2

                                                                      Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                                      deeleitores

                                                                      1 10 5 0 422 0 10 5 283 5 0 10 284 0 8 10 2

                                                                      Essa mudanccedila estrateacutegica de voto altera a ordem de eliminaccedilotildees do sistema com Betosendo o primeiro a ser eliminado Com isso seus votos satildeo naturalmente transferidos paraCarla que derrota Ana no segundo turno com 58 dos votos

                                                                      Figura 27 ndash IRV primeiro turno com voto taacutetico - Cenaacuterio 2

                                                                      Figura 28 ndash IRV segundo turno com voto taacutetico - Cenaacuterio 2

                                                                      43

                                                                      Percebendo que a eleiccedilatildeo de Beto natildeo era provaacutevel seus eleitores conseguiram aomenos impedir a eleiccedilatildeo do pior candidato para eles Mas para isso foi necessaacuterio queeles tivessem a informaccedilatildeo de como os outros eleitores votariam Uma aproximaccedilatildeo dessasinformaccedilotildees poderia ser obtida em um cenaacuterio real com poucos candidatos atraveacutes depesquisas eleitorais poreacutem se o nuacutemero de candidatos eacute significativo uma noccedilatildeo completadas distribuiccedilotildees dos rankings dos eleitores se torna muito menos viaacutevel e dificulta aformulaccedilatildeo de estrateacutegias para alterar a ordem em que os candidatos satildeo eliminados

                                                                      Esses resultados podem ser replicados acessando os linksSem voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana22

                                                                      22Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                                      Com voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana

                                                                      2222Beto2222Carla22]-----42Voter20Profile2001020520028Voter20Profile2010201020528Voter20Profile202520020102Voter20Profile20302082010100gt

                                                                      43 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE

                                                                      O interessante dos sistemas IRV e TRS eacute que os resultados do cenaacuterio anterior po-deriam ter sido obtidos ao inveacutes do voto taacutetico pela sua natildeo-monotonicidade Seriapossiacutevel que a Carla derrotasse a Ana no segundo turno atraveacutes do proacuteprio aumento depopularidade da Ana Assumindo que essa popularizaccedilatildeo ocorresse entre os candidatosdo perfil 2 onde 3 passasse a apoiar a Ana ao inveacutes do Beto as novas distribuiccedilotildeesseguiriam a tabela abaixo

                                                                      Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                                      Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                                      deeleitores

                                                                      1 10 5 0 452 0 10 5 273 5 0 10 28

                                                                      Dessa maneira Beto agora com uma porcentagem dos eleitores menor do que a deCarla seraacute eliminado na primeira rodada e como seus eleitores tecircm a Carla como segundaopccedilatildeo ela receberaacute todos os seus votos e seraacute eleita na segunda rodada As rodadas doIRV podem ser vistas nas figuras 29 e 30

                                                                      44

                                                                      Figura 29 ndash IRV primeiro turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                                      Figura 30 ndash IRV segundo turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                                      Tabela 15 ndash Resultados do Cenaacuterio 3Candidato

                                                                      eleitoMeacutedia das

                                                                      notasAntes da

                                                                      popularizaccedilatildeode Ana

                                                                      Ana 56

                                                                      Apoacutespopularizaccedilatildeo

                                                                      de AnaCarla 415

                                                                      Os efeitos dessa caracteriacutestica se refletem na satisfaccedilatildeo meacutedia da populaccedilatildeo A Ana eacuteclaramente a melhor candidata e mesmo com o seu ganho de popularidade (ou devido aele) a Carla eacute eleita

                                                                      Esses resultados podem ser replicados acessando os linksAntes da popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecom

                                                                      direct_res0010000---[22Ana2222Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                                      45

                                                                      Apoacutes popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana2222Beto2222Carla22]-----45Voter20Profile2001020520027Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                                      44 CENAacuteRIO 4 COALIZOtildeES

                                                                      O TRS por ser organizado em dois turnos separados normalmente a semanas dedistacircncia um do outro acaba abrindo brecha agrave mudanccedila de opiniatildeo por parte dos eleitorese o desenvolvimento de novas estrateacutegias por parte dos candidatos tais como a coalizatildeocom candidatos jaacute eliminados Com isso em mente nesse cenaacuterio teremos novamenteos quatro candidatos Ana Beto Carla e Diego Os trecircs primeiros seratildeo gerados dadistribuiccedilatildeo Neutral e Diego da distribuiccedilatildeo Disliked

                                                                      Figura 31 ndash TRS turno 1 - Cenaacuterio 4

                                                                      No TRS normal Ana Beto e Carla possuem com essas distribuiccedilotildees quantidades devotos muito proacuteximas com Beto e Carla indo para o segundo turno Carla estaacute 10 votosatraacutes de Beto e decide aproveitar o espaccedilo de tempo entre os dois turnos para tentaragregar mais votos Com isso Carla se aproxima de Diego e juntos formam uma coalizatildeoNo entanto com sua baixa popularidade Diego acaba ferindo a reputaccedilatildeo de Carla etorna o segundo turno muito mais faacutecil para Beto (Figura 33) Se Carla tivesse buscado osuporte de Ana por outro lado ela se veria vitoriosa no segundo turno e com uma amplavantagem sobre o Beto (Figura 34) Ou ateacute mesmo sem buscar uma coalizatildeo mesmosendo uma corrida apertada Carla teria naturalmente sido eleita (Figura 32)

                                                                      Esses resultados podem ser replicados acessando os linksSem coalizotildees lthttpelectionsimpythonanywherecomdirect_res0100000

                                                                      --[0002][22Ana222022Beto2222Carla2222Diego22]------100gt

                                                                      46

                                                                      Figura 32 ndash TRS turno 2 - Cenaacuterio 4

                                                                      Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4

                                                                      Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4

                                                                      47

                                                                      Coalizatildeo Carla e Diego lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2203Carla20Diego-100gt

                                                                      Coalizatildeo Carla e Ana lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2200Carla20Ana-100gt

                                                                      45 CENAacuteRIO 5 DILEMA DO PRISIONEIRO

                                                                      Neste cenaacuterio temos uma eleiccedilatildeo de uma vaga com trecircs candidatos concorrentes e trecircsperfis distintos de eleitores que seguiratildeo as seguintes distribuiccedilotildees

                                                                      Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5

                                                                      Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                                      deeleitores

                                                                      1 10 -10 5 362 -10 10 5 343 -10 -10 5 30

                                                                      Esse contexto nos remete ao notaacutevel dilema do prisioneiro Nele dois prisioneiroscuacutemplices satildeo interrogados individualmente sem poder se comunicar um com o outro ecada um enfrenta o dilema de delatar ou natildeo o seu parceiro Se os dois prisioneirosdecidem se manter calados sobre o crime ambos satildeo sentenciados a um ano de prisatildeo Seapenas um deles dedurar o outro o traidor sai livre enquanto seu parceiro eacute condenadoa trecircs anos Se ambos dedurarem um ao outro eles satildeo condenados juntos a dois anosde prisatildeo Esse dilema eacute uma ideia claacutessica presente no estudo da teoria dos jogos sendooriginalmente elaborada por Merrill Flood e Melvin Dresher em 1950 e mais tarde sendonomeada de dilema dos prisioneiros por Albert W Tucker (POUNDSTONE 1992)

                                                                      O que esse dilema nos mostra eacute a tentaccedilatildeo que o indiviacuteduo deteacutem se sua racionalizaccedilatildeoestiver voltada para seus proacuteprios interesses e somente eles em oposiccedilatildeo a pensar no bemdo grupo como um todo Neste cenaacuterio encontramos dois grupos de eleitores expressiva-mente opostos os perfis 1 e 2 Se qualquer uma das preferecircncias desses perfis fosse eleitaisso significaria uma alta rejeiccedilatildeo de maior parte da populaccedilatildeo No entanto eles possuema segunda opccedilatildeo em comum a Carla que por sua vez eacute a preferecircncia do terceiro perfilPortanto a eleiccedilatildeo da Carla seria logicamente o resultado oacutetimo

                                                                      Mesmo assim a Ana eacute eleita nos dois sistemas acima o que natildeo parece justo poispela tabela 16 eacute evidente que apenas 36 da populaccedilatildeo a aprova enquanto que os outros64 a reprovam ao maacuteximo O sistema IRV se comporta de maneira idecircntica ao TRS

                                                                      48

                                                                      Figura 35 ndash FPTP - Cenaacuterio 5

                                                                      Figura 36 ndash TRS segundo turno - Cenaacuterio 5

                                                                      nesta situaccedilatildeo Com esse resultado a meacutedia das notas eacute -28 No entanto os trecircs sistemasseguintes nos apresentam resultados diferentes

                                                                      Tabela 17 ndash Resultados do Cenaacuterio 5

                                                                      Sistema Candidatoeleito

                                                                      Meacutedia dasnotas

                                                                      FPTP Ana -28TRS Ana -28IRV Ana -28AVS Carla 50BC Carla 50SVS Carla 50

                                                                      49

                                                                      Figura 37 ndash AVS - Cenaacuterio 5

                                                                      Figura 38 ndash BC - Cenaacuterio 5

                                                                      Tanto o AVS quanto o Borda Count e o SVS satildeo sistemas que consideram todasas opiniotildees de cada eleitor ao mesmo tempo e por isso satildeo capazes de eleger o melhorcandidato nesta situaccedilatildeo diferentemente do TRS que natildeo absorve completamente todosentimento do eleitor por todos os candidatos e o IRV que apesar de ser bem expressivoquebra esse processo em inuacutemeras rodadas o que permite a perda de informaccedilatildeo ao longodelas

                                                                      Esses resultados podem ser replicados acessando o linklthttpelectionsimpythonanywherecomdirect_res1111110---[22Ana

                                                                      222022Beto222022Carla22]-----36Voter20Profile2001020-1020534Voter20Profile201-10201020530Voter20Profile202-1020-10205100gt

                                                                      50

                                                                      Figura 39 ndash SVS - Cenaacuterio 5

                                                                      46 CENAacuteRIO 6 VOTO DE MINORIA

                                                                      Neste cenaacuterio temos uma eleiccedilatildeo com quatro candidatos e duas vagas A Ana seraacutea preferecircncia de uma extensa parte da populaccedilatildeo (distribuiccedilatildeo Loved Figura 53) Betoe Carla seratildeo candidatos razoavelmente populares (distribuiccedilatildeo Neutral Figura 47) eDiego seraacute a preferecircncia de apenas um pequeno grupo especiacutefico e rejeitado pela maioria(distribuiccedilatildeo Disliked Figura 51) Eacute intuitivo esperar que os dois candidatos eleitos seratildeoa Ana e ou o Beto ou a Carla e isso eacute exatamente o que ocorre na figura 40 no sistemaFPTP sem voto de minoria

                                                                      Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria

                                                                      Eacute evidente a discrepacircncia da quantidade de votos da Ana para os outros candidatose apesar de Beto e Carla serem mais populares que Diego os trecircs natildeo se encontrammuito afastados Poreacutem se a pequena fraccedilatildeo de candidatos que possuem a Ana como

                                                                      51

                                                                      Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego

                                                                      preferecircncia e Diego como segunda opccedilatildeo optarem pelo voto de minoria a situaccedilatildeo mudacompletamente (Figura 41) Assim apesar de extensamente rejeitado Diego conquistaa segunda vaga e a meacutedia das notas despenca de 2929 para 0505 No entanto aindaexiste um cenaacuterio pior Se os outros grupos de eleitores pensarem da mesma forma eevitarem votar na Ana achando que sua eleiccedilatildeo jaacute estaacute assegurada apenas 80 de votode minoria para esses grupos jaacute eacute o suficiente para eliminaacute-la das eleiccedilotildees (Figura 42)Com a Ana eliminada a meacutedia das notas cai ainda mais para 0058

                                                                      Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego

                                                                      O sistema Bloc Vote eacute uma das soluccedilotildees para o voto de minoria Permitindo queos eleitores votem no mesmo nuacutemero de candidatos que de vagas a serem preenchidasnatildeo existe o iacutempeto a esse tipo de voto estrateacutegico O resultado desse sistema portantoretorna a meacutedia das notas a casa dos 29 (Figura 43) Os sistemas AVS Borda Count eSVS tambeacutem impedem a presenccedila do voto de minoria e atingem resultados semelhantes

                                                                      52

                                                                      Figura 43 ndash BV - Cenaacuterio 6

                                                                      Tabela 18 ndash Resultados do Cenaacuterio 6

                                                                      Sistema Candidatoseleitos

                                                                      Meacutedia dasnotas

                                                                      FPTP sem voto de minoriaAna eBeto 2929

                                                                      FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

                                                                      FPTP com 80 de voto de minoriaBeto eCarla 0058

                                                                      Bloc VoteAna eCarla 2913

                                                                      Esses resultados podem ser replicados acessando os links

                                                                      Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

                                                                      100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

                                                                      80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

                                                                      53

                                                                      5 COMO FUNCIONA O SIMULADOR

                                                                      O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

                                                                      51 CLASSE ELECTIONS

                                                                      Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

                                                                      bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

                                                                      Figura 44 ndash estrutura candidates

                                                                      bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

                                                                      bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

                                                                      Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

                                                                      Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

                                                                      54

                                                                      Figura 45 ndash estrutura voters

                                                                      Figura 46 ndash estrutura votes

                                                                      daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

                                                                      Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

                                                                      55

                                                                      Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

                                                                      Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

                                                                      na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

                                                                      56

                                                                      Figura 49 ndash PDF - Distribuiccedilatildeo Liked

                                                                      Figura 50 ndash CDF - Distribuiccedilatildeo Liked

                                                                      (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

                                                                      Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

                                                                      57

                                                                      Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

                                                                      Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

                                                                      candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

                                                                      Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

                                                                      58

                                                                      Figura 53 ndash PDF - Distribuiccedilatildeo Loved

                                                                      Figura 54 ndash CDF - Distribuiccedilatildeo Loved

                                                                      funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

                                                                      59

                                                                      Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                                                                      Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                                                                      Meacutedia das Notas sumei

                                                                      sumvj nij

                                                                      etimes v

                                                                      Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                                                                      Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                                                                      60

                                                                      Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                                                                      Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                                                                      52 CLASSE FIRSTPASTTHEPOST

                                                                      Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                                                                      Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                                                                      61

                                                                      Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                                                                      Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                                                                      mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                                                                      62

                                                                      53 CLASSE TWOROUNDSYSTEM

                                                                      A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                                                                      54 CLASSE INSTANTRUNOFFVOTING

                                                                      A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                                                                      Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                                                                      63

                                                                      cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                                                                      55 CLASSE APPROVALVOTING

                                                                      Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                                                                      56 CLASSE BORDACOUNT

                                                                      Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                                                                      57 CLASSE SCOREVOTING

                                                                      De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                                                                      64

                                                                      58 CLASSE BLOCVOTE

                                                                      O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                                                                      59 TECNOLOGIAS UTILIZADAS

                                                                      A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                                                                      Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                                                                      O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                                                                      Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                                                                      65

                                                                      6 CONCLUSAtildeO

                                                                      Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                                                                      Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                                                                      Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                                                                      Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                                                                      Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                                                                      66

                                                                      REFEREcircNCIAS

                                                                      AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                                                                      Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                                                                      Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                                                                      Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                                                                      HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                                                                      LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                                                                      ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                                                                      Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                                                                      POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                                                                      The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                                                                      67

                                                                      APEcircNDICES

                                                                      APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                                                      Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                                                      if(not len(selfvoter_profiles))

                                                                      for voter in range(selfN_VOTERS)

                                                                      candidates_rank = dict()

                                                                      for candidate in reversed(range(selfN_CANDIDATES))

                                                                      if(selfBIAS_VECTOR[candidate]==4)

                                                                      candidates_rank[candidate] = self_sortear(selfloved)

                                                                      elif(selfBIAS_VECTOR[candidate]==3)

                                                                      candidates_rank[candidate] = self_sortear(selfliked)

                                                                      elif(selfBIAS_VECTOR[candidate]==2)

                                                                      candidates_rank[candidate] = self_sortear(selfdisliked)

                                                                      elif(selfBIAS_VECTOR[candidate]==1)

                                                                      candidates_rank[candidate] = self_sortear(selfhated)

                                                                      elif(selfBIAS_VECTOR[candidate]==-1)

                                                                      candidates_rank[candidate] = self_sortear(selfpolarizer

                                                                      )

                                                                      elif(selfBIAS_VECTOR[candidate]==-2)

                                                                      candidates_rank[candidate] = self_sortear(self

                                                                      more_polarizer)

                                                                      else

                                                                      candidates_rank[candidate] = self_sortear(selfneutral)

                                                                      selfvotersappend(candidates_rank)

                                                                      else

                                                                      ranges = []

                                                                      ranks = []

                                                                      for prof in selfvoter_profiles

                                                                      rangesappend(int(prof[pop_percentage]))

                                                                      rank =

                                                                      for index score in enumerate(prof[scores])

                                                                      rank[index] = score

                                                                      ranksappend(rank)

                                                                      for index _range in enumerate(ranges)

                                                                      for _ in range(int(selfN_VOTERS(_range100)))

                                                                      selfvotersappend(ranks[index])

                                                                      68

                                                                      APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                                                      Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                                                      for i in range(selfN_CANDIDATES)

                                                                      selfcandidates[i] = 0

                                                                      selfvotes[i] = set()

                                                                      APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                                                      Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                                                      for candidate in range(selfN_CANDIDATES)

                                                                      rating_sum = 0

                                                                      for voter in selfvoters

                                                                      rating_sum += voter[candidate]

                                                                      selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                                                      APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                                                      Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                                                      if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                                                      return selfcalculate_mean(winners)

                                                                      else

                                                                      chose_best = True if winners[0] == selfbest_candidate else

                                                                      False

                                                                      return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                                                      69

                                                                      APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                                                      Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                                                      rating_sum = 0

                                                                      for voter in selfvoters

                                                                      for candidate in winners

                                                                      rating_sum += voter[candidate]

                                                                      return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                                                      APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                                                      Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                                                      for i in range(1 selfN_VACANCIES + 2)

                                                                      selfleading_candidatesappend(selfsorted_candidates[-i][self

                                                                      CANDIDATE_INDEX])

                                                                      APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                                                      Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                                                      for leader in selfelecrounds[-1]

                                                                      selfleading_candidatesappend(leader[0])

                                                                      70

                                                                      APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                                                      Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                                                      self_account_for_coalitions()

                                                                      for voter in selfvoters

                                                                      selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                                                      (1)))

                                                                      temp = []

                                                                      for voter in selfsorted_voters

                                                                      new_dict = defaultdict(list)

                                                                      for k in voter

                                                                      new_dict[k[1]]append(k[0])

                                                                      tempappend(new_dict)

                                                                      selfsorted_voters = []

                                                                      for voter_index current_voter in enumerate(temp)

                                                                      new_voter = []

                                                                      for rating candidate_indexes in current_voteritems()

                                                                      if len(current_voter[rating]) gt 1

                                                                      shuffle(current_voter[rating])

                                                                      for e in candidate_indexes

                                                                      new_voterappend((e rating))

                                                                      else

                                                                      new_voterappend((candidate_indexes[0] rating))

                                                                      selfsorted_votersappend(new_voter)

                                                                      selfcandidates[new_voter[-1][0]] += 1

                                                                      selfvotes[new_voter[-1][0]]add(voter_index)

                                                                      71

                                                                      APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                                                      Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                                                      for candidate in selfvotes_copy

                                                                      if candidate not in selfelecleading_candidates

                                                                      for voter_index in selfvotes_copy[candidate]

                                                                      for index _candidate in enumerate(reversed(selfelec

                                                                      sorted_voters[voter_index]))

                                                                      if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                                                      leading_candidates

                                                                      if randomrandom() lt selfelec

                                                                      tactical_vote_percentages[_candidate[selfelec

                                                                      CANDIDATE_INDEX]]

                                                                      selfrankings_changed[voter_index] = copy

                                                                      deepcopy(selfelecsorted_voters[voter_index])

                                                                      selfrankings_changed[voter_index][-(index + 1)]

                                                                      selfrankings_changed[voter_index][-1] = self

                                                                      rankings_changed[voter_index][-1] self

                                                                      rankings_changed[voter_index][-(index + 1)]

                                                                      selfcandidates[candidate] -= 1

                                                                      selfcandidates[_candidate[selfelec

                                                                      CANDIDATE_INDEX]] += 1

                                                                      selfvotes[candidate]remove(voter_index)

                                                                      selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                                                      ]]add(voter_index)

                                                                      break

                                                                      break

                                                                      72

                                                                      APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                                                      Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                                                      half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                                                      for candidate in selfelecleading_candidates

                                                                      if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                                                      continue

                                                                      for voter_index in selfvotes_copy[candidate]

                                                                      if voter_index in selfrankings_changed

                                                                      ranking = selfrankings_changed[voter_index]

                                                                      else

                                                                      ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                                                      ])

                                                                      for index _candidate in enumerate(reversed(ranking))

                                                                      if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                      leading_candidates or (_candidate[selfelec

                                                                      CANDIDATE_INDEX] in selfelecleading_candidates and

                                                                      selfelecleading_candidatesindex(_candidate[selfelec

                                                                      CANDIDATE_INDEX]) gt= half_vacancies)

                                                                      if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                                                      if randomrandom() lt selfelec

                                                                      minority_vote_percentages[_candidate[selfelec

                                                                      CANDIDATE_INDEX]]

                                                                      selfcandidates[candidate] -= 1

                                                                      selfcandidates[_candidate[selfelec

                                                                      CANDIDATE_INDEX]] += 1

                                                                      break

                                                                      break

                                                                      break

                                                                      73

                                                                      APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                                                      Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                                                      self_account_for_coalitions()

                                                                      for candidate in selfvotes

                                                                      if candidate = selfwinner and candidate = selfsecond_place

                                                                      for voter_index in selfvotes[candidate]

                                                                      if voter_index in selfrankings_changed

                                                                      ranking = selfrankings_changed[voter_index]

                                                                      else

                                                                      ranking = copydeepcopy(selfelecsorted_voters[

                                                                      voter_index])

                                                                      for index2 candidate in enumerate(reversed(ranking))

                                                                      if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                                                      selfcandidates[selfwinner] += 1

                                                                      selfvotes[selfwinner]add(voter_index)

                                                                      break

                                                                      elif candidate[selfelecCANDIDATE_INDEX] == self

                                                                      second_place

                                                                      selfcandidates[selfsecond_place] += 1

                                                                      selfvotes[selfsecond_place]add(voter_index)

                                                                      break

                                                                      selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                      winners = []

                                                                      vacancies = selfelecN_VACANCIES

                                                                      for candidate in reversed(selfsorted_candidates)

                                                                      if vacancies == 0

                                                                      break

                                                                      winnersappend(candidate[0])

                                                                      vacancies -= 1

                                                                      mean chose_best = selfelecget_mean(winners = winners)

                                                                      74

                                                                      APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                                                      Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                                                      for voter_index voter in enumerate(selfelecsorted_voters)

                                                                      voter_dict = dict()

                                                                      og_voter_dict = dict()

                                                                      for tup in voter

                                                                      voter_dict[tup[0]] = tup[1]

                                                                      og_voter_dict[tup[0]] = tup[1]

                                                                      for coalition in selfeleccoalitions

                                                                      for candidate in coalition

                                                                      add_to_score = 0

                                                                      for candidate2 in coalition

                                                                      if candidate == candidate2

                                                                      continue

                                                                      half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                                                      if half lt 0

                                                                      add_to_score += mathceil(half)

                                                                      else

                                                                      add_to_score += mathfloor(half)

                                                                      if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                                                      voter_dict[candidate[rsquovaluersquo]] = 10

                                                                      elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                                                      voter_dict[candidate[rsquovaluersquo]] = -10

                                                                      else

                                                                      voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                                                      selfrankings_changed[voter_index] = []

                                                                      for candidate in voter_dict

                                                                      selfrankings_changed[voter_index]append((candidate voter_dict[

                                                                      candidate]))

                                                                      selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                                                      voter_index] key=lambda x x[1])

                                                                      75

                                                                      APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                                      Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                                      selfelecroundsappend(selfsorted_candidates[_round])

                                                                      if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                      N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                                      N_VACANCIES - 1)

                                                                      return 2

                                                                      elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                      N_VOTERS gt 05)

                                                                      return 1

                                                                      else

                                                                      selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                                      CANDIDATE_INDEX])

                                                                      for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                                      elecCANDIDATE_INDEX]]

                                                                      if voter_index in selfrankings_changed

                                                                      for candidate in reversed(selfrankings_changed[voter_index

                                                                      ])

                                                                      if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                      excluded

                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                      ]] += 1

                                                                      selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                      add(voter_index)

                                                                      break

                                                                      else

                                                                      continue

                                                                      else

                                                                      for candidate in reversed(selfelecsorted_voters[

                                                                      voter_index])

                                                                      if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                      excluded

                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                      ]] += 1

                                                                      selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                      add(voter_index)

                                                                      break

                                                                      else

                                                                      continue

                                                                      selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                      return 0

                                                                      76

                                                                      APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                                      Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                                      for index in range(selfelecN_CANDIDATES)

                                                                      selfcandidates[index] = 0

                                                                      for voter in selfelecsorted_voters

                                                                      for candidate in reversed(voter)

                                                                      if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                      else

                                                                      break

                                                                      APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                                      Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                                      for index in range(selfelecN_CANDIDATES)

                                                                      selfcandidates[index] = 0

                                                                      for voter in selfelecsorted_voters

                                                                      if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                      elecCANDIDATE_INDEX]]

                                                                      selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                                      else

                                                                      for candidate in reversed(voter)

                                                                      if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                      else

                                                                      break

                                                                      77

                                                                      APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                                      Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                                      pos = set()

                                                                      for index perc in enumerate(selfelectactical_vote_percentages)

                                                                      if perc gt 0

                                                                      posadd(index)

                                                                      for candidate in selfeleccandidates

                                                                      if candidate not in selfleading_candidates

                                                                      for voter_index in selfvotes[candidate]

                                                                      raised = None

                                                                      for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                                      ])

                                                                      if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                                      leading_candidates

                                                                      if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                                      if randomrandom() lt selfelectactical_vote_percentages[

                                                                      candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                                      ranking = [None]selfelecN_CANDIDATES

                                                                      ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                      selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                      CANDIDATE_INDEX]])

                                                                      raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                      break

                                                                      break

                                                                      break

                                                                      if raised = None

                                                                      for _candidate in selfleading_candidates

                                                                      if _candidate = ranking[-1][0]

                                                                      ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                      _candidate])

                                                                      buried = _candidate

                                                                      break

                                                                      i = 1

                                                                      for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                      if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                                      buried]

                                                                      continue

                                                                      else

                                                                      ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                      selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                      CANDIDATE_INDEX]])

                                                                      i += 1

                                                                      selfrankings_changed[voter_index] = ranking

                                                                      78

                                                                      APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                                      Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                                      for voter_index in selfvotes[candidate]

                                                                      if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                                      ]

                                                                      for _candidate in selfleading_candidates

                                                                      if _candidate = candidate

                                                                      ranking = [None]selfelecN_CANDIDATES

                                                                      ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                      _candidate])

                                                                      buried = _candidate

                                                                      break

                                                                      i = 1

                                                                      for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                      if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                                      continue

                                                                      else

                                                                      ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                      selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                      CANDIDATE_INDEX]])

                                                                      i += 1

                                                                      selfrankings_changed[voter_index] = ranking

                                                                      79

                                                                      APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                                      Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                                      for index in range(selfelecN_CANDIDATES)

                                                                      selfcandidates[index] = 0

                                                                      for voter_index voter in enumerate(selfelecsorted_voters)

                                                                      score = 0

                                                                      if voter_index in selfrankings_changed

                                                                      for candidate in selfrankings_changed[voter_index]

                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                      score += 1

                                                                      else

                                                                      for candidate in voter

                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                      score += 1

                                                                      APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                                      Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                                      for voter_index voter in enumerate(selfelecsorted_voters)

                                                                      if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                      elecCANDIDATE_INDEX]]

                                                                      selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                                      sorted_voters[voter_index])

                                                                      for candidate_index candidate in enumerate(reversed(voter))

                                                                      if candidate_index == 0

                                                                      selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                      voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                                      else

                                                                      selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                      voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                                      80

                                                                      APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                                      Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                                      for index in range(selfelecN_CANDIDATES)

                                                                      selfcandidates[index] = 0

                                                                      for voter_index voter in enumerate(selfelecsorted_voters)

                                                                      if voter_index in selfrankings_changed

                                                                      for candidate in selfrankings_changed[voter_index]

                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                      selfelecCANDIDATE_RANK]

                                                                      else

                                                                      for candidate in voter

                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                      selfelecCANDIDATE_RANK]

                                                                      APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                                      Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                                      for index in range(selfelecN_CANDIDATES)

                                                                      selfcandidates[index] = 0

                                                                      for voter in selfelecsorted_voters

                                                                      votes = selfelecN_VACANCIES

                                                                      for candidate in reversed(voter)

                                                                      if votes == 0

                                                                      break

                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                      votes -= 1

                                                                      • Folha de aprovaccedilatildeo
                                                                      • Agradecimentos
                                                                      • Epiacutegrafe
                                                                      • Resumo
                                                                      • Abstract
                                                                      • Lista de ilustraccedilotildees
                                                                      • Lista de Coacutedigos
                                                                      • Lista de tabelas
                                                                      • Lista de abreviaturas e siglas
                                                                      • Sumaacuterio
                                                                      • INTRODUCcedilAtildeO
                                                                        • MOTIVACcedilAtildeO E OBJETIVO
                                                                        • MEacuteTODO
                                                                        • ESTRUTURA
                                                                          • SISTEMAS ELEITORAIS
                                                                            • FISRT PAST THE POST
                                                                              • Exemplo
                                                                              • Vantagens e Desvantagens do FPTP
                                                                              • Voto Uacutetil no FPTP
                                                                                • TWO-ROUND SYSTEM
                                                                                  • Exemplo
                                                                                  • Vantagens e Desvantagens do TRS
                                                                                  • Voto Uacutetil no TRS
                                                                                    • INSTANT-RUNOFF VOTING
                                                                                      • Exemplo
                                                                                      • Vantagens e Desvantagens do IRV
                                                                                      • Voto Uacutetil no IRV
                                                                                        • APPROVAL VOTING SYSTEM
                                                                                          • Exemplo
                                                                                          • Vantagens e Desvantagens do AVS
                                                                                          • Voto Uacutetil no AVS
                                                                                            • THE BORDA COUNT
                                                                                              • Exemplo
                                                                                              • Vantagens e Desvantagens do BC
                                                                                              • Voto Uacutetil no BC
                                                                                                • SCORE VOTING SYSTEM
                                                                                                  • Exemplo
                                                                                                  • Vantagens e Desvantagens do SVS
                                                                                                  • Voto Uacutetil no SVS
                                                                                                    • BLOC VOTE
                                                                                                      • Exemplo
                                                                                                      • Voto Uacutetil no BV
                                                                                                          • O SIMULADOR
                                                                                                          • CENAacuteRIOS PERTINENTES
                                                                                                            • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                            • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                            • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                            • CENAacuteRIO 4 COALIZOtildeES
                                                                                                            • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                            • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                              • COMO FUNCIONA O SIMULADOR
                                                                                                                • CLASSE Elections
                                                                                                                • CLASSE FirstPastThePost
                                                                                                                • CLASSE TwoRoundSystem
                                                                                                                • CLASSE InstantRunoffVoting
                                                                                                                • CLASSE ApprovalVoting
                                                                                                                • CLASSE BordaCount
                                                                                                                • CLASSE ScoreVoting
                                                                                                                • CLASSE BlocVote
                                                                                                                • TECNOLOGIAS UTILIZADAS
                                                                                                                  • CONCLUSAtildeO
                                                                                                                  • Referecircncias
                                                                                                                  • Meacutetodo create_voters
                                                                                                                  • Meacutetodo create_candidates
                                                                                                                  • Meacutetodo calculate_means
                                                                                                                  • Meacutetodo get_mean
                                                                                                                  • Meacutetodo calculate_mean
                                                                                                                  • Meacutetodo set_leading_candidates
                                                                                                                  • Meacutetodo irv_set_leading_candidates
                                                                                                                  • Meacutetodo sort_ranks
                                                                                                                  • Meacutetodo fptp_count_tactical_votes
                                                                                                                  • Meacutetodo fptp_count_minority_votes
                                                                                                                  • Meacutetodo trs_second_round
                                                                                                                  • Meacutetodo trs_account_for_coalitions
                                                                                                                  • Meacutetodo irv_count_votes
                                                                                                                  • Meacutetodo avs_count_votes
                                                                                                                  • Meacutetodo avs_count_votes_with_tactical
                                                                                                                  • Meacutetodo irv_apply_tactical_votes
                                                                                                                  • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                                  • Meacutetodo bc_sum_candidates_scores
                                                                                                                  • Meacutetodo svs_apply_tactical_votes
                                                                                                                  • Meacutetodo svs_sum_candidates_scores
                                                                                                                  • Meacutetodo bv_count_votes

                                                                        36

                                                                        Figura 13 ndash AVS - Cenaacuterio 1 sem voto taacutetico

                                                                        Figura 14 ndash BC - Cenaacuterio 1 sem voto taacutetico

                                                                        Figura 15 ndash SVS - Cenaacuterio 1 sem voto taacutetico

                                                                        37

                                                                        Nesse cenaacuterio sem voto taacutetico o uacutenico sistema que natildeo elege o Beto eacute o AVS Todosos outros elegem o melhor candidato Ou seja apesar de Beto ter uma melhor meacutediadas notas dos eleitores existem mais eleitores que ranqueiam Ana com uma nota acimade 0 No entanto apenas 20 dos eleitores de Diego e Carla que preferem a Ana aoinveacutes do Beto satildeo o suficiente para fazer Beto natildeo ser eleito se eles decidirem abandonarsua primeira opccedilatildeo e votar na Ana Considerando a vantagem que os votos taacuteticosproporcionam agrave Ana esta eacute eleita em todos os sistemas menos o TRS e o IRV

                                                                        Figura 16 ndash FPTP - Cenaacuterio 1 - 20 de voto taacutetico na Ana

                                                                        Figura 17 ndash TRS segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                                        38

                                                                        Figura 18 ndash IRV primeiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                                        Figura 19 ndash IRV segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                                        Figura 20 ndash IRV terceiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                                        39

                                                                        Figura 21 ndash AVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                                        Figura 22 ndash BC - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                                        Figura 23 ndash SVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                                        40

                                                                        Eacute claro que se os eleitores que preferem o Beto tambeacutem votassem de maneira estra-teacutegica a situaccedilatildeo se equilibraria e haveria o mesmo niacutevel de concorrecircncia entre os doiscandidatos que ocorre quando natildeo haacute voto taacutetico Poreacutem no Borda Count esse equiliacute-brio pode natildeo acontecer e as estrateacutegias de compromising e burying podem acabar saindopela culatra se uma porcentagem elevada dos eleitores as adotarem Abaixo encontram-seos resultados para esse sistema quando 100 dos eleitores de Carla e Diego se comportammaliciosamente

                                                                        Figura 24 ndash BC - Cenaacuterio 1 100 de voto taacutetico na Ana e Beto

                                                                        Por causa do uso demasiado da estrateacutegia burying Ana e Beto perdem muitos pontose isso abre espaccedilo para uma vitoacuteria da Carla No entanto para porcentagens menores que100 o Beto ainda eacute o vencedor

                                                                        Essas duas estrateacutegias tambeacutem foram implementadas nesse simulador para o sistemaIRV e eacute possiacutevel ver como ele eacute resistente a elas Para que seja possiacutevel mudar os resultadosde uma eleiccedilatildeo sob o IRV eacute necessaacuterio mudar a ordem de eliminaccedilatildeo dos candidatos paraque o seu candidato preferido acabe enfrentando um candidato mais fraco nas rodadasfinais Isso natildeo ocorre com compromising e burying No proacuteximo cenaacuterio seraacute analisadacomo eacute possiacutevel modificar os resultados de uma eleiccedilatildeo sob o IRV

                                                                        Esses resultados podem ser replicados acessando os linksSem votos taacuteticos lthttpelectionsimpythonanywherecomdirect_res1111110

                                                                        --[0021][22Ana2222Beto222022Carla2222Diego22]------100gt

                                                                        Com 20 de voto taacutetico lthttpelectionsimpythonanywherecomdirect_res1111110--[0021][22Ana222022Beto2222Carla2222Diego22]1-[02000]---100gt

                                                                        Com 100 de voto taacuteticona Ana e Beto lthttpelectionsimpythonanywherecomdirect_res0000100--[0021][22Ana222022Beto222022Carla2222Diego22]1-[101000]---100gt

                                                                        41

                                                                        42 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV

                                                                        Neste cenaacuterio teremos Ana Carla e Beto concorrendo e trecircs perfis distintos que apoiamcada candidato As distribuiccedilotildees de notas dos perfis se encontram na tabela abaixo

                                                                        Tabela 12 ndash Distribuiccedilatildeo de notas - Cenaacuterio 2

                                                                        Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                                        deeleitores

                                                                        1 10 5 0 422 0 10 5 303 5 0 10 28

                                                                        Com essas distribuiccedilotildees Carla eacute eliminada na primeira rodada e seus 28 de votossatildeo transferidos para a segunda opccedilatildeo de seus eleitores Ana que eacute eleita com 70 dosvotos e uma meacutedia de 56

                                                                        Figura 25 ndash IRV primeiro turno - Cenaacuterio 2

                                                                        Figura 26 ndash IRV segundo turno - Cenaacuterio 2

                                                                        42

                                                                        Cientes desse provaacutevel futuro cenaacuterio onde Ana eacute eleita uma pequena parte dos elei-tores de Beto estrategicamente o abandona e decide apoiar Carla na esperanccedila de leva-laao segundo turno contra Ana As novas distribuiccedilotildees de notas se encontram na tabelaabaixo com essa porccedilatildeo de eleitores representada pelo perfil 4

                                                                        Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2

                                                                        Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                                        deeleitores

                                                                        1 10 5 0 422 0 10 5 283 5 0 10 284 0 8 10 2

                                                                        Essa mudanccedila estrateacutegica de voto altera a ordem de eliminaccedilotildees do sistema com Betosendo o primeiro a ser eliminado Com isso seus votos satildeo naturalmente transferidos paraCarla que derrota Ana no segundo turno com 58 dos votos

                                                                        Figura 27 ndash IRV primeiro turno com voto taacutetico - Cenaacuterio 2

                                                                        Figura 28 ndash IRV segundo turno com voto taacutetico - Cenaacuterio 2

                                                                        43

                                                                        Percebendo que a eleiccedilatildeo de Beto natildeo era provaacutevel seus eleitores conseguiram aomenos impedir a eleiccedilatildeo do pior candidato para eles Mas para isso foi necessaacuterio queeles tivessem a informaccedilatildeo de como os outros eleitores votariam Uma aproximaccedilatildeo dessasinformaccedilotildees poderia ser obtida em um cenaacuterio real com poucos candidatos atraveacutes depesquisas eleitorais poreacutem se o nuacutemero de candidatos eacute significativo uma noccedilatildeo completadas distribuiccedilotildees dos rankings dos eleitores se torna muito menos viaacutevel e dificulta aformulaccedilatildeo de estrateacutegias para alterar a ordem em que os candidatos satildeo eliminados

                                                                        Esses resultados podem ser replicados acessando os linksSem voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana22

                                                                        22Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                                        Com voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana

                                                                        2222Beto2222Carla22]-----42Voter20Profile2001020520028Voter20Profile2010201020528Voter20Profile202520020102Voter20Profile20302082010100gt

                                                                        43 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE

                                                                        O interessante dos sistemas IRV e TRS eacute que os resultados do cenaacuterio anterior po-deriam ter sido obtidos ao inveacutes do voto taacutetico pela sua natildeo-monotonicidade Seriapossiacutevel que a Carla derrotasse a Ana no segundo turno atraveacutes do proacuteprio aumento depopularidade da Ana Assumindo que essa popularizaccedilatildeo ocorresse entre os candidatosdo perfil 2 onde 3 passasse a apoiar a Ana ao inveacutes do Beto as novas distribuiccedilotildeesseguiriam a tabela abaixo

                                                                        Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                                        Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                                        deeleitores

                                                                        1 10 5 0 452 0 10 5 273 5 0 10 28

                                                                        Dessa maneira Beto agora com uma porcentagem dos eleitores menor do que a deCarla seraacute eliminado na primeira rodada e como seus eleitores tecircm a Carla como segundaopccedilatildeo ela receberaacute todos os seus votos e seraacute eleita na segunda rodada As rodadas doIRV podem ser vistas nas figuras 29 e 30

                                                                        44

                                                                        Figura 29 ndash IRV primeiro turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                                        Figura 30 ndash IRV segundo turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                                        Tabela 15 ndash Resultados do Cenaacuterio 3Candidato

                                                                        eleitoMeacutedia das

                                                                        notasAntes da

                                                                        popularizaccedilatildeode Ana

                                                                        Ana 56

                                                                        Apoacutespopularizaccedilatildeo

                                                                        de AnaCarla 415

                                                                        Os efeitos dessa caracteriacutestica se refletem na satisfaccedilatildeo meacutedia da populaccedilatildeo A Ana eacuteclaramente a melhor candidata e mesmo com o seu ganho de popularidade (ou devido aele) a Carla eacute eleita

                                                                        Esses resultados podem ser replicados acessando os linksAntes da popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecom

                                                                        direct_res0010000---[22Ana2222Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                                        45

                                                                        Apoacutes popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana2222Beto2222Carla22]-----45Voter20Profile2001020520027Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                                        44 CENAacuteRIO 4 COALIZOtildeES

                                                                        O TRS por ser organizado em dois turnos separados normalmente a semanas dedistacircncia um do outro acaba abrindo brecha agrave mudanccedila de opiniatildeo por parte dos eleitorese o desenvolvimento de novas estrateacutegias por parte dos candidatos tais como a coalizatildeocom candidatos jaacute eliminados Com isso em mente nesse cenaacuterio teremos novamenteos quatro candidatos Ana Beto Carla e Diego Os trecircs primeiros seratildeo gerados dadistribuiccedilatildeo Neutral e Diego da distribuiccedilatildeo Disliked

                                                                        Figura 31 ndash TRS turno 1 - Cenaacuterio 4

                                                                        No TRS normal Ana Beto e Carla possuem com essas distribuiccedilotildees quantidades devotos muito proacuteximas com Beto e Carla indo para o segundo turno Carla estaacute 10 votosatraacutes de Beto e decide aproveitar o espaccedilo de tempo entre os dois turnos para tentaragregar mais votos Com isso Carla se aproxima de Diego e juntos formam uma coalizatildeoNo entanto com sua baixa popularidade Diego acaba ferindo a reputaccedilatildeo de Carla etorna o segundo turno muito mais faacutecil para Beto (Figura 33) Se Carla tivesse buscado osuporte de Ana por outro lado ela se veria vitoriosa no segundo turno e com uma amplavantagem sobre o Beto (Figura 34) Ou ateacute mesmo sem buscar uma coalizatildeo mesmosendo uma corrida apertada Carla teria naturalmente sido eleita (Figura 32)

                                                                        Esses resultados podem ser replicados acessando os linksSem coalizotildees lthttpelectionsimpythonanywherecomdirect_res0100000

                                                                        --[0002][22Ana222022Beto2222Carla2222Diego22]------100gt

                                                                        46

                                                                        Figura 32 ndash TRS turno 2 - Cenaacuterio 4

                                                                        Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4

                                                                        Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4

                                                                        47

                                                                        Coalizatildeo Carla e Diego lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2203Carla20Diego-100gt

                                                                        Coalizatildeo Carla e Ana lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2200Carla20Ana-100gt

                                                                        45 CENAacuteRIO 5 DILEMA DO PRISIONEIRO

                                                                        Neste cenaacuterio temos uma eleiccedilatildeo de uma vaga com trecircs candidatos concorrentes e trecircsperfis distintos de eleitores que seguiratildeo as seguintes distribuiccedilotildees

                                                                        Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5

                                                                        Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                                        deeleitores

                                                                        1 10 -10 5 362 -10 10 5 343 -10 -10 5 30

                                                                        Esse contexto nos remete ao notaacutevel dilema do prisioneiro Nele dois prisioneiroscuacutemplices satildeo interrogados individualmente sem poder se comunicar um com o outro ecada um enfrenta o dilema de delatar ou natildeo o seu parceiro Se os dois prisioneirosdecidem se manter calados sobre o crime ambos satildeo sentenciados a um ano de prisatildeo Seapenas um deles dedurar o outro o traidor sai livre enquanto seu parceiro eacute condenadoa trecircs anos Se ambos dedurarem um ao outro eles satildeo condenados juntos a dois anosde prisatildeo Esse dilema eacute uma ideia claacutessica presente no estudo da teoria dos jogos sendooriginalmente elaborada por Merrill Flood e Melvin Dresher em 1950 e mais tarde sendonomeada de dilema dos prisioneiros por Albert W Tucker (POUNDSTONE 1992)

                                                                        O que esse dilema nos mostra eacute a tentaccedilatildeo que o indiviacuteduo deteacutem se sua racionalizaccedilatildeoestiver voltada para seus proacuteprios interesses e somente eles em oposiccedilatildeo a pensar no bemdo grupo como um todo Neste cenaacuterio encontramos dois grupos de eleitores expressiva-mente opostos os perfis 1 e 2 Se qualquer uma das preferecircncias desses perfis fosse eleitaisso significaria uma alta rejeiccedilatildeo de maior parte da populaccedilatildeo No entanto eles possuema segunda opccedilatildeo em comum a Carla que por sua vez eacute a preferecircncia do terceiro perfilPortanto a eleiccedilatildeo da Carla seria logicamente o resultado oacutetimo

                                                                        Mesmo assim a Ana eacute eleita nos dois sistemas acima o que natildeo parece justo poispela tabela 16 eacute evidente que apenas 36 da populaccedilatildeo a aprova enquanto que os outros64 a reprovam ao maacuteximo O sistema IRV se comporta de maneira idecircntica ao TRS

                                                                        48

                                                                        Figura 35 ndash FPTP - Cenaacuterio 5

                                                                        Figura 36 ndash TRS segundo turno - Cenaacuterio 5

                                                                        nesta situaccedilatildeo Com esse resultado a meacutedia das notas eacute -28 No entanto os trecircs sistemasseguintes nos apresentam resultados diferentes

                                                                        Tabela 17 ndash Resultados do Cenaacuterio 5

                                                                        Sistema Candidatoeleito

                                                                        Meacutedia dasnotas

                                                                        FPTP Ana -28TRS Ana -28IRV Ana -28AVS Carla 50BC Carla 50SVS Carla 50

                                                                        49

                                                                        Figura 37 ndash AVS - Cenaacuterio 5

                                                                        Figura 38 ndash BC - Cenaacuterio 5

                                                                        Tanto o AVS quanto o Borda Count e o SVS satildeo sistemas que consideram todasas opiniotildees de cada eleitor ao mesmo tempo e por isso satildeo capazes de eleger o melhorcandidato nesta situaccedilatildeo diferentemente do TRS que natildeo absorve completamente todosentimento do eleitor por todos os candidatos e o IRV que apesar de ser bem expressivoquebra esse processo em inuacutemeras rodadas o que permite a perda de informaccedilatildeo ao longodelas

                                                                        Esses resultados podem ser replicados acessando o linklthttpelectionsimpythonanywherecomdirect_res1111110---[22Ana

                                                                        222022Beto222022Carla22]-----36Voter20Profile2001020-1020534Voter20Profile201-10201020530Voter20Profile202-1020-10205100gt

                                                                        50

                                                                        Figura 39 ndash SVS - Cenaacuterio 5

                                                                        46 CENAacuteRIO 6 VOTO DE MINORIA

                                                                        Neste cenaacuterio temos uma eleiccedilatildeo com quatro candidatos e duas vagas A Ana seraacutea preferecircncia de uma extensa parte da populaccedilatildeo (distribuiccedilatildeo Loved Figura 53) Betoe Carla seratildeo candidatos razoavelmente populares (distribuiccedilatildeo Neutral Figura 47) eDiego seraacute a preferecircncia de apenas um pequeno grupo especiacutefico e rejeitado pela maioria(distribuiccedilatildeo Disliked Figura 51) Eacute intuitivo esperar que os dois candidatos eleitos seratildeoa Ana e ou o Beto ou a Carla e isso eacute exatamente o que ocorre na figura 40 no sistemaFPTP sem voto de minoria

                                                                        Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria

                                                                        Eacute evidente a discrepacircncia da quantidade de votos da Ana para os outros candidatose apesar de Beto e Carla serem mais populares que Diego os trecircs natildeo se encontrammuito afastados Poreacutem se a pequena fraccedilatildeo de candidatos que possuem a Ana como

                                                                        51

                                                                        Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego

                                                                        preferecircncia e Diego como segunda opccedilatildeo optarem pelo voto de minoria a situaccedilatildeo mudacompletamente (Figura 41) Assim apesar de extensamente rejeitado Diego conquistaa segunda vaga e a meacutedia das notas despenca de 2929 para 0505 No entanto aindaexiste um cenaacuterio pior Se os outros grupos de eleitores pensarem da mesma forma eevitarem votar na Ana achando que sua eleiccedilatildeo jaacute estaacute assegurada apenas 80 de votode minoria para esses grupos jaacute eacute o suficiente para eliminaacute-la das eleiccedilotildees (Figura 42)Com a Ana eliminada a meacutedia das notas cai ainda mais para 0058

                                                                        Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego

                                                                        O sistema Bloc Vote eacute uma das soluccedilotildees para o voto de minoria Permitindo queos eleitores votem no mesmo nuacutemero de candidatos que de vagas a serem preenchidasnatildeo existe o iacutempeto a esse tipo de voto estrateacutegico O resultado desse sistema portantoretorna a meacutedia das notas a casa dos 29 (Figura 43) Os sistemas AVS Borda Count eSVS tambeacutem impedem a presenccedila do voto de minoria e atingem resultados semelhantes

                                                                        52

                                                                        Figura 43 ndash BV - Cenaacuterio 6

                                                                        Tabela 18 ndash Resultados do Cenaacuterio 6

                                                                        Sistema Candidatoseleitos

                                                                        Meacutedia dasnotas

                                                                        FPTP sem voto de minoriaAna eBeto 2929

                                                                        FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

                                                                        FPTP com 80 de voto de minoriaBeto eCarla 0058

                                                                        Bloc VoteAna eCarla 2913

                                                                        Esses resultados podem ser replicados acessando os links

                                                                        Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

                                                                        100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

                                                                        80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

                                                                        53

                                                                        5 COMO FUNCIONA O SIMULADOR

                                                                        O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

                                                                        51 CLASSE ELECTIONS

                                                                        Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

                                                                        bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

                                                                        Figura 44 ndash estrutura candidates

                                                                        bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

                                                                        bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

                                                                        Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

                                                                        Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

                                                                        54

                                                                        Figura 45 ndash estrutura voters

                                                                        Figura 46 ndash estrutura votes

                                                                        daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

                                                                        Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

                                                                        55

                                                                        Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

                                                                        Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

                                                                        na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

                                                                        56

                                                                        Figura 49 ndash PDF - Distribuiccedilatildeo Liked

                                                                        Figura 50 ndash CDF - Distribuiccedilatildeo Liked

                                                                        (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

                                                                        Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

                                                                        57

                                                                        Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

                                                                        Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

                                                                        candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

                                                                        Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

                                                                        58

                                                                        Figura 53 ndash PDF - Distribuiccedilatildeo Loved

                                                                        Figura 54 ndash CDF - Distribuiccedilatildeo Loved

                                                                        funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

                                                                        59

                                                                        Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                                                                        Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                                                                        Meacutedia das Notas sumei

                                                                        sumvj nij

                                                                        etimes v

                                                                        Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                                                                        Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                                                                        60

                                                                        Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                                                                        Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                                                                        52 CLASSE FIRSTPASTTHEPOST

                                                                        Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                                                                        Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                                                                        61

                                                                        Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                                                                        Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                                                                        mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                                                                        62

                                                                        53 CLASSE TWOROUNDSYSTEM

                                                                        A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                                                                        54 CLASSE INSTANTRUNOFFVOTING

                                                                        A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                                                                        Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                                                                        63

                                                                        cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                                                                        55 CLASSE APPROVALVOTING

                                                                        Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                                                                        56 CLASSE BORDACOUNT

                                                                        Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                                                                        57 CLASSE SCOREVOTING

                                                                        De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                                                                        64

                                                                        58 CLASSE BLOCVOTE

                                                                        O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                                                                        59 TECNOLOGIAS UTILIZADAS

                                                                        A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                                                                        Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                                                                        O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                                                                        Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                                                                        65

                                                                        6 CONCLUSAtildeO

                                                                        Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                                                                        Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                                                                        Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                                                                        Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                                                                        Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                                                                        66

                                                                        REFEREcircNCIAS

                                                                        AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                                                                        Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                                                                        Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                                                                        Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                                                                        HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                                                                        LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                                                                        ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                                                                        Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                                                                        POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                                                                        The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                                                                        67

                                                                        APEcircNDICES

                                                                        APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                                                        Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                                                        if(not len(selfvoter_profiles))

                                                                        for voter in range(selfN_VOTERS)

                                                                        candidates_rank = dict()

                                                                        for candidate in reversed(range(selfN_CANDIDATES))

                                                                        if(selfBIAS_VECTOR[candidate]==4)

                                                                        candidates_rank[candidate] = self_sortear(selfloved)

                                                                        elif(selfBIAS_VECTOR[candidate]==3)

                                                                        candidates_rank[candidate] = self_sortear(selfliked)

                                                                        elif(selfBIAS_VECTOR[candidate]==2)

                                                                        candidates_rank[candidate] = self_sortear(selfdisliked)

                                                                        elif(selfBIAS_VECTOR[candidate]==1)

                                                                        candidates_rank[candidate] = self_sortear(selfhated)

                                                                        elif(selfBIAS_VECTOR[candidate]==-1)

                                                                        candidates_rank[candidate] = self_sortear(selfpolarizer

                                                                        )

                                                                        elif(selfBIAS_VECTOR[candidate]==-2)

                                                                        candidates_rank[candidate] = self_sortear(self

                                                                        more_polarizer)

                                                                        else

                                                                        candidates_rank[candidate] = self_sortear(selfneutral)

                                                                        selfvotersappend(candidates_rank)

                                                                        else

                                                                        ranges = []

                                                                        ranks = []

                                                                        for prof in selfvoter_profiles

                                                                        rangesappend(int(prof[pop_percentage]))

                                                                        rank =

                                                                        for index score in enumerate(prof[scores])

                                                                        rank[index] = score

                                                                        ranksappend(rank)

                                                                        for index _range in enumerate(ranges)

                                                                        for _ in range(int(selfN_VOTERS(_range100)))

                                                                        selfvotersappend(ranks[index])

                                                                        68

                                                                        APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                                                        Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                                                        for i in range(selfN_CANDIDATES)

                                                                        selfcandidates[i] = 0

                                                                        selfvotes[i] = set()

                                                                        APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                                                        Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                                                        for candidate in range(selfN_CANDIDATES)

                                                                        rating_sum = 0

                                                                        for voter in selfvoters

                                                                        rating_sum += voter[candidate]

                                                                        selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                                                        APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                                                        Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                                                        if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                                                        return selfcalculate_mean(winners)

                                                                        else

                                                                        chose_best = True if winners[0] == selfbest_candidate else

                                                                        False

                                                                        return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                                                        69

                                                                        APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                                                        Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                                                        rating_sum = 0

                                                                        for voter in selfvoters

                                                                        for candidate in winners

                                                                        rating_sum += voter[candidate]

                                                                        return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                                                        APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                                                        Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                                                        for i in range(1 selfN_VACANCIES + 2)

                                                                        selfleading_candidatesappend(selfsorted_candidates[-i][self

                                                                        CANDIDATE_INDEX])

                                                                        APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                                                        Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                                                        for leader in selfelecrounds[-1]

                                                                        selfleading_candidatesappend(leader[0])

                                                                        70

                                                                        APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                                                        Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                                                        self_account_for_coalitions()

                                                                        for voter in selfvoters

                                                                        selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                                                        (1)))

                                                                        temp = []

                                                                        for voter in selfsorted_voters

                                                                        new_dict = defaultdict(list)

                                                                        for k in voter

                                                                        new_dict[k[1]]append(k[0])

                                                                        tempappend(new_dict)

                                                                        selfsorted_voters = []

                                                                        for voter_index current_voter in enumerate(temp)

                                                                        new_voter = []

                                                                        for rating candidate_indexes in current_voteritems()

                                                                        if len(current_voter[rating]) gt 1

                                                                        shuffle(current_voter[rating])

                                                                        for e in candidate_indexes

                                                                        new_voterappend((e rating))

                                                                        else

                                                                        new_voterappend((candidate_indexes[0] rating))

                                                                        selfsorted_votersappend(new_voter)

                                                                        selfcandidates[new_voter[-1][0]] += 1

                                                                        selfvotes[new_voter[-1][0]]add(voter_index)

                                                                        71

                                                                        APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                                                        Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                                                        for candidate in selfvotes_copy

                                                                        if candidate not in selfelecleading_candidates

                                                                        for voter_index in selfvotes_copy[candidate]

                                                                        for index _candidate in enumerate(reversed(selfelec

                                                                        sorted_voters[voter_index]))

                                                                        if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                                                        leading_candidates

                                                                        if randomrandom() lt selfelec

                                                                        tactical_vote_percentages[_candidate[selfelec

                                                                        CANDIDATE_INDEX]]

                                                                        selfrankings_changed[voter_index] = copy

                                                                        deepcopy(selfelecsorted_voters[voter_index])

                                                                        selfrankings_changed[voter_index][-(index + 1)]

                                                                        selfrankings_changed[voter_index][-1] = self

                                                                        rankings_changed[voter_index][-1] self

                                                                        rankings_changed[voter_index][-(index + 1)]

                                                                        selfcandidates[candidate] -= 1

                                                                        selfcandidates[_candidate[selfelec

                                                                        CANDIDATE_INDEX]] += 1

                                                                        selfvotes[candidate]remove(voter_index)

                                                                        selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                                                        ]]add(voter_index)

                                                                        break

                                                                        break

                                                                        72

                                                                        APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                                                        Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                                                        half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                                                        for candidate in selfelecleading_candidates

                                                                        if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                                                        continue

                                                                        for voter_index in selfvotes_copy[candidate]

                                                                        if voter_index in selfrankings_changed

                                                                        ranking = selfrankings_changed[voter_index]

                                                                        else

                                                                        ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                                                        ])

                                                                        for index _candidate in enumerate(reversed(ranking))

                                                                        if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                        leading_candidates or (_candidate[selfelec

                                                                        CANDIDATE_INDEX] in selfelecleading_candidates and

                                                                        selfelecleading_candidatesindex(_candidate[selfelec

                                                                        CANDIDATE_INDEX]) gt= half_vacancies)

                                                                        if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                                                        if randomrandom() lt selfelec

                                                                        minority_vote_percentages[_candidate[selfelec

                                                                        CANDIDATE_INDEX]]

                                                                        selfcandidates[candidate] -= 1

                                                                        selfcandidates[_candidate[selfelec

                                                                        CANDIDATE_INDEX]] += 1

                                                                        break

                                                                        break

                                                                        break

                                                                        73

                                                                        APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                                                        Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                                                        self_account_for_coalitions()

                                                                        for candidate in selfvotes

                                                                        if candidate = selfwinner and candidate = selfsecond_place

                                                                        for voter_index in selfvotes[candidate]

                                                                        if voter_index in selfrankings_changed

                                                                        ranking = selfrankings_changed[voter_index]

                                                                        else

                                                                        ranking = copydeepcopy(selfelecsorted_voters[

                                                                        voter_index])

                                                                        for index2 candidate in enumerate(reversed(ranking))

                                                                        if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                                                        selfcandidates[selfwinner] += 1

                                                                        selfvotes[selfwinner]add(voter_index)

                                                                        break

                                                                        elif candidate[selfelecCANDIDATE_INDEX] == self

                                                                        second_place

                                                                        selfcandidates[selfsecond_place] += 1

                                                                        selfvotes[selfsecond_place]add(voter_index)

                                                                        break

                                                                        selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                        winners = []

                                                                        vacancies = selfelecN_VACANCIES

                                                                        for candidate in reversed(selfsorted_candidates)

                                                                        if vacancies == 0

                                                                        break

                                                                        winnersappend(candidate[0])

                                                                        vacancies -= 1

                                                                        mean chose_best = selfelecget_mean(winners = winners)

                                                                        74

                                                                        APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                                                        Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                                                        for voter_index voter in enumerate(selfelecsorted_voters)

                                                                        voter_dict = dict()

                                                                        og_voter_dict = dict()

                                                                        for tup in voter

                                                                        voter_dict[tup[0]] = tup[1]

                                                                        og_voter_dict[tup[0]] = tup[1]

                                                                        for coalition in selfeleccoalitions

                                                                        for candidate in coalition

                                                                        add_to_score = 0

                                                                        for candidate2 in coalition

                                                                        if candidate == candidate2

                                                                        continue

                                                                        half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                                                        if half lt 0

                                                                        add_to_score += mathceil(half)

                                                                        else

                                                                        add_to_score += mathfloor(half)

                                                                        if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                                                        voter_dict[candidate[rsquovaluersquo]] = 10

                                                                        elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                                                        voter_dict[candidate[rsquovaluersquo]] = -10

                                                                        else

                                                                        voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                                                        selfrankings_changed[voter_index] = []

                                                                        for candidate in voter_dict

                                                                        selfrankings_changed[voter_index]append((candidate voter_dict[

                                                                        candidate]))

                                                                        selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                                                        voter_index] key=lambda x x[1])

                                                                        75

                                                                        APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                                        Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                                        selfelecroundsappend(selfsorted_candidates[_round])

                                                                        if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                        N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                                        N_VACANCIES - 1)

                                                                        return 2

                                                                        elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                        N_VOTERS gt 05)

                                                                        return 1

                                                                        else

                                                                        selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                                        CANDIDATE_INDEX])

                                                                        for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                                        elecCANDIDATE_INDEX]]

                                                                        if voter_index in selfrankings_changed

                                                                        for candidate in reversed(selfrankings_changed[voter_index

                                                                        ])

                                                                        if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                        excluded

                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                        ]] += 1

                                                                        selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                        add(voter_index)

                                                                        break

                                                                        else

                                                                        continue

                                                                        else

                                                                        for candidate in reversed(selfelecsorted_voters[

                                                                        voter_index])

                                                                        if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                        excluded

                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                        ]] += 1

                                                                        selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                        add(voter_index)

                                                                        break

                                                                        else

                                                                        continue

                                                                        selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                        return 0

                                                                        76

                                                                        APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                                        Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                                        for index in range(selfelecN_CANDIDATES)

                                                                        selfcandidates[index] = 0

                                                                        for voter in selfelecsorted_voters

                                                                        for candidate in reversed(voter)

                                                                        if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                        else

                                                                        break

                                                                        APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                                        Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                                        for index in range(selfelecN_CANDIDATES)

                                                                        selfcandidates[index] = 0

                                                                        for voter in selfelecsorted_voters

                                                                        if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                        elecCANDIDATE_INDEX]]

                                                                        selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                                        else

                                                                        for candidate in reversed(voter)

                                                                        if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                        else

                                                                        break

                                                                        77

                                                                        APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                                        Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                                        pos = set()

                                                                        for index perc in enumerate(selfelectactical_vote_percentages)

                                                                        if perc gt 0

                                                                        posadd(index)

                                                                        for candidate in selfeleccandidates

                                                                        if candidate not in selfleading_candidates

                                                                        for voter_index in selfvotes[candidate]

                                                                        raised = None

                                                                        for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                                        ])

                                                                        if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                                        leading_candidates

                                                                        if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                                        if randomrandom() lt selfelectactical_vote_percentages[

                                                                        candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                                        ranking = [None]selfelecN_CANDIDATES

                                                                        ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                        selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                        CANDIDATE_INDEX]])

                                                                        raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                        break

                                                                        break

                                                                        break

                                                                        if raised = None

                                                                        for _candidate in selfleading_candidates

                                                                        if _candidate = ranking[-1][0]

                                                                        ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                        _candidate])

                                                                        buried = _candidate

                                                                        break

                                                                        i = 1

                                                                        for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                        if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                                        buried]

                                                                        continue

                                                                        else

                                                                        ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                        selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                        CANDIDATE_INDEX]])

                                                                        i += 1

                                                                        selfrankings_changed[voter_index] = ranking

                                                                        78

                                                                        APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                                        Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                                        for voter_index in selfvotes[candidate]

                                                                        if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                                        ]

                                                                        for _candidate in selfleading_candidates

                                                                        if _candidate = candidate

                                                                        ranking = [None]selfelecN_CANDIDATES

                                                                        ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                        _candidate])

                                                                        buried = _candidate

                                                                        break

                                                                        i = 1

                                                                        for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                        if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                                        continue

                                                                        else

                                                                        ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                        selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                        CANDIDATE_INDEX]])

                                                                        i += 1

                                                                        selfrankings_changed[voter_index] = ranking

                                                                        79

                                                                        APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                                        Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                                        for index in range(selfelecN_CANDIDATES)

                                                                        selfcandidates[index] = 0

                                                                        for voter_index voter in enumerate(selfelecsorted_voters)

                                                                        score = 0

                                                                        if voter_index in selfrankings_changed

                                                                        for candidate in selfrankings_changed[voter_index]

                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                        score += 1

                                                                        else

                                                                        for candidate in voter

                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                        score += 1

                                                                        APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                                        Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                                        for voter_index voter in enumerate(selfelecsorted_voters)

                                                                        if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                        elecCANDIDATE_INDEX]]

                                                                        selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                                        sorted_voters[voter_index])

                                                                        for candidate_index candidate in enumerate(reversed(voter))

                                                                        if candidate_index == 0

                                                                        selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                        voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                                        else

                                                                        selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                        voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                                        80

                                                                        APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                                        Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                                        for index in range(selfelecN_CANDIDATES)

                                                                        selfcandidates[index] = 0

                                                                        for voter_index voter in enumerate(selfelecsorted_voters)

                                                                        if voter_index in selfrankings_changed

                                                                        for candidate in selfrankings_changed[voter_index]

                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                        selfelecCANDIDATE_RANK]

                                                                        else

                                                                        for candidate in voter

                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                        selfelecCANDIDATE_RANK]

                                                                        APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                                        Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                                        for index in range(selfelecN_CANDIDATES)

                                                                        selfcandidates[index] = 0

                                                                        for voter in selfelecsorted_voters

                                                                        votes = selfelecN_VACANCIES

                                                                        for candidate in reversed(voter)

                                                                        if votes == 0

                                                                        break

                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                        votes -= 1

                                                                        • Folha de aprovaccedilatildeo
                                                                        • Agradecimentos
                                                                        • Epiacutegrafe
                                                                        • Resumo
                                                                        • Abstract
                                                                        • Lista de ilustraccedilotildees
                                                                        • Lista de Coacutedigos
                                                                        • Lista de tabelas
                                                                        • Lista de abreviaturas e siglas
                                                                        • Sumaacuterio
                                                                        • INTRODUCcedilAtildeO
                                                                          • MOTIVACcedilAtildeO E OBJETIVO
                                                                          • MEacuteTODO
                                                                          • ESTRUTURA
                                                                            • SISTEMAS ELEITORAIS
                                                                              • FISRT PAST THE POST
                                                                                • Exemplo
                                                                                • Vantagens e Desvantagens do FPTP
                                                                                • Voto Uacutetil no FPTP
                                                                                  • TWO-ROUND SYSTEM
                                                                                    • Exemplo
                                                                                    • Vantagens e Desvantagens do TRS
                                                                                    • Voto Uacutetil no TRS
                                                                                      • INSTANT-RUNOFF VOTING
                                                                                        • Exemplo
                                                                                        • Vantagens e Desvantagens do IRV
                                                                                        • Voto Uacutetil no IRV
                                                                                          • APPROVAL VOTING SYSTEM
                                                                                            • Exemplo
                                                                                            • Vantagens e Desvantagens do AVS
                                                                                            • Voto Uacutetil no AVS
                                                                                              • THE BORDA COUNT
                                                                                                • Exemplo
                                                                                                • Vantagens e Desvantagens do BC
                                                                                                • Voto Uacutetil no BC
                                                                                                  • SCORE VOTING SYSTEM
                                                                                                    • Exemplo
                                                                                                    • Vantagens e Desvantagens do SVS
                                                                                                    • Voto Uacutetil no SVS
                                                                                                      • BLOC VOTE
                                                                                                        • Exemplo
                                                                                                        • Voto Uacutetil no BV
                                                                                                            • O SIMULADOR
                                                                                                            • CENAacuteRIOS PERTINENTES
                                                                                                              • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                              • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                              • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                              • CENAacuteRIO 4 COALIZOtildeES
                                                                                                              • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                              • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                                • COMO FUNCIONA O SIMULADOR
                                                                                                                  • CLASSE Elections
                                                                                                                  • CLASSE FirstPastThePost
                                                                                                                  • CLASSE TwoRoundSystem
                                                                                                                  • CLASSE InstantRunoffVoting
                                                                                                                  • CLASSE ApprovalVoting
                                                                                                                  • CLASSE BordaCount
                                                                                                                  • CLASSE ScoreVoting
                                                                                                                  • CLASSE BlocVote
                                                                                                                  • TECNOLOGIAS UTILIZADAS
                                                                                                                    • CONCLUSAtildeO
                                                                                                                    • Referecircncias
                                                                                                                    • Meacutetodo create_voters
                                                                                                                    • Meacutetodo create_candidates
                                                                                                                    • Meacutetodo calculate_means
                                                                                                                    • Meacutetodo get_mean
                                                                                                                    • Meacutetodo calculate_mean
                                                                                                                    • Meacutetodo set_leading_candidates
                                                                                                                    • Meacutetodo irv_set_leading_candidates
                                                                                                                    • Meacutetodo sort_ranks
                                                                                                                    • Meacutetodo fptp_count_tactical_votes
                                                                                                                    • Meacutetodo fptp_count_minority_votes
                                                                                                                    • Meacutetodo trs_second_round
                                                                                                                    • Meacutetodo trs_account_for_coalitions
                                                                                                                    • Meacutetodo irv_count_votes
                                                                                                                    • Meacutetodo avs_count_votes
                                                                                                                    • Meacutetodo avs_count_votes_with_tactical
                                                                                                                    • Meacutetodo irv_apply_tactical_votes
                                                                                                                    • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                                    • Meacutetodo bc_sum_candidates_scores
                                                                                                                    • Meacutetodo svs_apply_tactical_votes
                                                                                                                    • Meacutetodo svs_sum_candidates_scores
                                                                                                                    • Meacutetodo bv_count_votes

                                                                          37

                                                                          Nesse cenaacuterio sem voto taacutetico o uacutenico sistema que natildeo elege o Beto eacute o AVS Todosos outros elegem o melhor candidato Ou seja apesar de Beto ter uma melhor meacutediadas notas dos eleitores existem mais eleitores que ranqueiam Ana com uma nota acimade 0 No entanto apenas 20 dos eleitores de Diego e Carla que preferem a Ana aoinveacutes do Beto satildeo o suficiente para fazer Beto natildeo ser eleito se eles decidirem abandonarsua primeira opccedilatildeo e votar na Ana Considerando a vantagem que os votos taacuteticosproporcionam agrave Ana esta eacute eleita em todos os sistemas menos o TRS e o IRV

                                                                          Figura 16 ndash FPTP - Cenaacuterio 1 - 20 de voto taacutetico na Ana

                                                                          Figura 17 ndash TRS segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                                          38

                                                                          Figura 18 ndash IRV primeiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                                          Figura 19 ndash IRV segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                                          Figura 20 ndash IRV terceiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                                          39

                                                                          Figura 21 ndash AVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                                          Figura 22 ndash BC - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                                          Figura 23 ndash SVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                                          40

                                                                          Eacute claro que se os eleitores que preferem o Beto tambeacutem votassem de maneira estra-teacutegica a situaccedilatildeo se equilibraria e haveria o mesmo niacutevel de concorrecircncia entre os doiscandidatos que ocorre quando natildeo haacute voto taacutetico Poreacutem no Borda Count esse equiliacute-brio pode natildeo acontecer e as estrateacutegias de compromising e burying podem acabar saindopela culatra se uma porcentagem elevada dos eleitores as adotarem Abaixo encontram-seos resultados para esse sistema quando 100 dos eleitores de Carla e Diego se comportammaliciosamente

                                                                          Figura 24 ndash BC - Cenaacuterio 1 100 de voto taacutetico na Ana e Beto

                                                                          Por causa do uso demasiado da estrateacutegia burying Ana e Beto perdem muitos pontose isso abre espaccedilo para uma vitoacuteria da Carla No entanto para porcentagens menores que100 o Beto ainda eacute o vencedor

                                                                          Essas duas estrateacutegias tambeacutem foram implementadas nesse simulador para o sistemaIRV e eacute possiacutevel ver como ele eacute resistente a elas Para que seja possiacutevel mudar os resultadosde uma eleiccedilatildeo sob o IRV eacute necessaacuterio mudar a ordem de eliminaccedilatildeo dos candidatos paraque o seu candidato preferido acabe enfrentando um candidato mais fraco nas rodadasfinais Isso natildeo ocorre com compromising e burying No proacuteximo cenaacuterio seraacute analisadacomo eacute possiacutevel modificar os resultados de uma eleiccedilatildeo sob o IRV

                                                                          Esses resultados podem ser replicados acessando os linksSem votos taacuteticos lthttpelectionsimpythonanywherecomdirect_res1111110

                                                                          --[0021][22Ana2222Beto222022Carla2222Diego22]------100gt

                                                                          Com 20 de voto taacutetico lthttpelectionsimpythonanywherecomdirect_res1111110--[0021][22Ana222022Beto2222Carla2222Diego22]1-[02000]---100gt

                                                                          Com 100 de voto taacuteticona Ana e Beto lthttpelectionsimpythonanywherecomdirect_res0000100--[0021][22Ana222022Beto222022Carla2222Diego22]1-[101000]---100gt

                                                                          41

                                                                          42 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV

                                                                          Neste cenaacuterio teremos Ana Carla e Beto concorrendo e trecircs perfis distintos que apoiamcada candidato As distribuiccedilotildees de notas dos perfis se encontram na tabela abaixo

                                                                          Tabela 12 ndash Distribuiccedilatildeo de notas - Cenaacuterio 2

                                                                          Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                                          deeleitores

                                                                          1 10 5 0 422 0 10 5 303 5 0 10 28

                                                                          Com essas distribuiccedilotildees Carla eacute eliminada na primeira rodada e seus 28 de votossatildeo transferidos para a segunda opccedilatildeo de seus eleitores Ana que eacute eleita com 70 dosvotos e uma meacutedia de 56

                                                                          Figura 25 ndash IRV primeiro turno - Cenaacuterio 2

                                                                          Figura 26 ndash IRV segundo turno - Cenaacuterio 2

                                                                          42

                                                                          Cientes desse provaacutevel futuro cenaacuterio onde Ana eacute eleita uma pequena parte dos elei-tores de Beto estrategicamente o abandona e decide apoiar Carla na esperanccedila de leva-laao segundo turno contra Ana As novas distribuiccedilotildees de notas se encontram na tabelaabaixo com essa porccedilatildeo de eleitores representada pelo perfil 4

                                                                          Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2

                                                                          Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                                          deeleitores

                                                                          1 10 5 0 422 0 10 5 283 5 0 10 284 0 8 10 2

                                                                          Essa mudanccedila estrateacutegica de voto altera a ordem de eliminaccedilotildees do sistema com Betosendo o primeiro a ser eliminado Com isso seus votos satildeo naturalmente transferidos paraCarla que derrota Ana no segundo turno com 58 dos votos

                                                                          Figura 27 ndash IRV primeiro turno com voto taacutetico - Cenaacuterio 2

                                                                          Figura 28 ndash IRV segundo turno com voto taacutetico - Cenaacuterio 2

                                                                          43

                                                                          Percebendo que a eleiccedilatildeo de Beto natildeo era provaacutevel seus eleitores conseguiram aomenos impedir a eleiccedilatildeo do pior candidato para eles Mas para isso foi necessaacuterio queeles tivessem a informaccedilatildeo de como os outros eleitores votariam Uma aproximaccedilatildeo dessasinformaccedilotildees poderia ser obtida em um cenaacuterio real com poucos candidatos atraveacutes depesquisas eleitorais poreacutem se o nuacutemero de candidatos eacute significativo uma noccedilatildeo completadas distribuiccedilotildees dos rankings dos eleitores se torna muito menos viaacutevel e dificulta aformulaccedilatildeo de estrateacutegias para alterar a ordem em que os candidatos satildeo eliminados

                                                                          Esses resultados podem ser replicados acessando os linksSem voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana22

                                                                          22Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                                          Com voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana

                                                                          2222Beto2222Carla22]-----42Voter20Profile2001020520028Voter20Profile2010201020528Voter20Profile202520020102Voter20Profile20302082010100gt

                                                                          43 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE

                                                                          O interessante dos sistemas IRV e TRS eacute que os resultados do cenaacuterio anterior po-deriam ter sido obtidos ao inveacutes do voto taacutetico pela sua natildeo-monotonicidade Seriapossiacutevel que a Carla derrotasse a Ana no segundo turno atraveacutes do proacuteprio aumento depopularidade da Ana Assumindo que essa popularizaccedilatildeo ocorresse entre os candidatosdo perfil 2 onde 3 passasse a apoiar a Ana ao inveacutes do Beto as novas distribuiccedilotildeesseguiriam a tabela abaixo

                                                                          Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                                          Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                                          deeleitores

                                                                          1 10 5 0 452 0 10 5 273 5 0 10 28

                                                                          Dessa maneira Beto agora com uma porcentagem dos eleitores menor do que a deCarla seraacute eliminado na primeira rodada e como seus eleitores tecircm a Carla como segundaopccedilatildeo ela receberaacute todos os seus votos e seraacute eleita na segunda rodada As rodadas doIRV podem ser vistas nas figuras 29 e 30

                                                                          44

                                                                          Figura 29 ndash IRV primeiro turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                                          Figura 30 ndash IRV segundo turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                                          Tabela 15 ndash Resultados do Cenaacuterio 3Candidato

                                                                          eleitoMeacutedia das

                                                                          notasAntes da

                                                                          popularizaccedilatildeode Ana

                                                                          Ana 56

                                                                          Apoacutespopularizaccedilatildeo

                                                                          de AnaCarla 415

                                                                          Os efeitos dessa caracteriacutestica se refletem na satisfaccedilatildeo meacutedia da populaccedilatildeo A Ana eacuteclaramente a melhor candidata e mesmo com o seu ganho de popularidade (ou devido aele) a Carla eacute eleita

                                                                          Esses resultados podem ser replicados acessando os linksAntes da popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecom

                                                                          direct_res0010000---[22Ana2222Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                                          45

                                                                          Apoacutes popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana2222Beto2222Carla22]-----45Voter20Profile2001020520027Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                                          44 CENAacuteRIO 4 COALIZOtildeES

                                                                          O TRS por ser organizado em dois turnos separados normalmente a semanas dedistacircncia um do outro acaba abrindo brecha agrave mudanccedila de opiniatildeo por parte dos eleitorese o desenvolvimento de novas estrateacutegias por parte dos candidatos tais como a coalizatildeocom candidatos jaacute eliminados Com isso em mente nesse cenaacuterio teremos novamenteos quatro candidatos Ana Beto Carla e Diego Os trecircs primeiros seratildeo gerados dadistribuiccedilatildeo Neutral e Diego da distribuiccedilatildeo Disliked

                                                                          Figura 31 ndash TRS turno 1 - Cenaacuterio 4

                                                                          No TRS normal Ana Beto e Carla possuem com essas distribuiccedilotildees quantidades devotos muito proacuteximas com Beto e Carla indo para o segundo turno Carla estaacute 10 votosatraacutes de Beto e decide aproveitar o espaccedilo de tempo entre os dois turnos para tentaragregar mais votos Com isso Carla se aproxima de Diego e juntos formam uma coalizatildeoNo entanto com sua baixa popularidade Diego acaba ferindo a reputaccedilatildeo de Carla etorna o segundo turno muito mais faacutecil para Beto (Figura 33) Se Carla tivesse buscado osuporte de Ana por outro lado ela se veria vitoriosa no segundo turno e com uma amplavantagem sobre o Beto (Figura 34) Ou ateacute mesmo sem buscar uma coalizatildeo mesmosendo uma corrida apertada Carla teria naturalmente sido eleita (Figura 32)

                                                                          Esses resultados podem ser replicados acessando os linksSem coalizotildees lthttpelectionsimpythonanywherecomdirect_res0100000

                                                                          --[0002][22Ana222022Beto2222Carla2222Diego22]------100gt

                                                                          46

                                                                          Figura 32 ndash TRS turno 2 - Cenaacuterio 4

                                                                          Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4

                                                                          Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4

                                                                          47

                                                                          Coalizatildeo Carla e Diego lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2203Carla20Diego-100gt

                                                                          Coalizatildeo Carla e Ana lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2200Carla20Ana-100gt

                                                                          45 CENAacuteRIO 5 DILEMA DO PRISIONEIRO

                                                                          Neste cenaacuterio temos uma eleiccedilatildeo de uma vaga com trecircs candidatos concorrentes e trecircsperfis distintos de eleitores que seguiratildeo as seguintes distribuiccedilotildees

                                                                          Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5

                                                                          Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                                          deeleitores

                                                                          1 10 -10 5 362 -10 10 5 343 -10 -10 5 30

                                                                          Esse contexto nos remete ao notaacutevel dilema do prisioneiro Nele dois prisioneiroscuacutemplices satildeo interrogados individualmente sem poder se comunicar um com o outro ecada um enfrenta o dilema de delatar ou natildeo o seu parceiro Se os dois prisioneirosdecidem se manter calados sobre o crime ambos satildeo sentenciados a um ano de prisatildeo Seapenas um deles dedurar o outro o traidor sai livre enquanto seu parceiro eacute condenadoa trecircs anos Se ambos dedurarem um ao outro eles satildeo condenados juntos a dois anosde prisatildeo Esse dilema eacute uma ideia claacutessica presente no estudo da teoria dos jogos sendooriginalmente elaborada por Merrill Flood e Melvin Dresher em 1950 e mais tarde sendonomeada de dilema dos prisioneiros por Albert W Tucker (POUNDSTONE 1992)

                                                                          O que esse dilema nos mostra eacute a tentaccedilatildeo que o indiviacuteduo deteacutem se sua racionalizaccedilatildeoestiver voltada para seus proacuteprios interesses e somente eles em oposiccedilatildeo a pensar no bemdo grupo como um todo Neste cenaacuterio encontramos dois grupos de eleitores expressiva-mente opostos os perfis 1 e 2 Se qualquer uma das preferecircncias desses perfis fosse eleitaisso significaria uma alta rejeiccedilatildeo de maior parte da populaccedilatildeo No entanto eles possuema segunda opccedilatildeo em comum a Carla que por sua vez eacute a preferecircncia do terceiro perfilPortanto a eleiccedilatildeo da Carla seria logicamente o resultado oacutetimo

                                                                          Mesmo assim a Ana eacute eleita nos dois sistemas acima o que natildeo parece justo poispela tabela 16 eacute evidente que apenas 36 da populaccedilatildeo a aprova enquanto que os outros64 a reprovam ao maacuteximo O sistema IRV se comporta de maneira idecircntica ao TRS

                                                                          48

                                                                          Figura 35 ndash FPTP - Cenaacuterio 5

                                                                          Figura 36 ndash TRS segundo turno - Cenaacuterio 5

                                                                          nesta situaccedilatildeo Com esse resultado a meacutedia das notas eacute -28 No entanto os trecircs sistemasseguintes nos apresentam resultados diferentes

                                                                          Tabela 17 ndash Resultados do Cenaacuterio 5

                                                                          Sistema Candidatoeleito

                                                                          Meacutedia dasnotas

                                                                          FPTP Ana -28TRS Ana -28IRV Ana -28AVS Carla 50BC Carla 50SVS Carla 50

                                                                          49

                                                                          Figura 37 ndash AVS - Cenaacuterio 5

                                                                          Figura 38 ndash BC - Cenaacuterio 5

                                                                          Tanto o AVS quanto o Borda Count e o SVS satildeo sistemas que consideram todasas opiniotildees de cada eleitor ao mesmo tempo e por isso satildeo capazes de eleger o melhorcandidato nesta situaccedilatildeo diferentemente do TRS que natildeo absorve completamente todosentimento do eleitor por todos os candidatos e o IRV que apesar de ser bem expressivoquebra esse processo em inuacutemeras rodadas o que permite a perda de informaccedilatildeo ao longodelas

                                                                          Esses resultados podem ser replicados acessando o linklthttpelectionsimpythonanywherecomdirect_res1111110---[22Ana

                                                                          222022Beto222022Carla22]-----36Voter20Profile2001020-1020534Voter20Profile201-10201020530Voter20Profile202-1020-10205100gt

                                                                          50

                                                                          Figura 39 ndash SVS - Cenaacuterio 5

                                                                          46 CENAacuteRIO 6 VOTO DE MINORIA

                                                                          Neste cenaacuterio temos uma eleiccedilatildeo com quatro candidatos e duas vagas A Ana seraacutea preferecircncia de uma extensa parte da populaccedilatildeo (distribuiccedilatildeo Loved Figura 53) Betoe Carla seratildeo candidatos razoavelmente populares (distribuiccedilatildeo Neutral Figura 47) eDiego seraacute a preferecircncia de apenas um pequeno grupo especiacutefico e rejeitado pela maioria(distribuiccedilatildeo Disliked Figura 51) Eacute intuitivo esperar que os dois candidatos eleitos seratildeoa Ana e ou o Beto ou a Carla e isso eacute exatamente o que ocorre na figura 40 no sistemaFPTP sem voto de minoria

                                                                          Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria

                                                                          Eacute evidente a discrepacircncia da quantidade de votos da Ana para os outros candidatose apesar de Beto e Carla serem mais populares que Diego os trecircs natildeo se encontrammuito afastados Poreacutem se a pequena fraccedilatildeo de candidatos que possuem a Ana como

                                                                          51

                                                                          Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego

                                                                          preferecircncia e Diego como segunda opccedilatildeo optarem pelo voto de minoria a situaccedilatildeo mudacompletamente (Figura 41) Assim apesar de extensamente rejeitado Diego conquistaa segunda vaga e a meacutedia das notas despenca de 2929 para 0505 No entanto aindaexiste um cenaacuterio pior Se os outros grupos de eleitores pensarem da mesma forma eevitarem votar na Ana achando que sua eleiccedilatildeo jaacute estaacute assegurada apenas 80 de votode minoria para esses grupos jaacute eacute o suficiente para eliminaacute-la das eleiccedilotildees (Figura 42)Com a Ana eliminada a meacutedia das notas cai ainda mais para 0058

                                                                          Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego

                                                                          O sistema Bloc Vote eacute uma das soluccedilotildees para o voto de minoria Permitindo queos eleitores votem no mesmo nuacutemero de candidatos que de vagas a serem preenchidasnatildeo existe o iacutempeto a esse tipo de voto estrateacutegico O resultado desse sistema portantoretorna a meacutedia das notas a casa dos 29 (Figura 43) Os sistemas AVS Borda Count eSVS tambeacutem impedem a presenccedila do voto de minoria e atingem resultados semelhantes

                                                                          52

                                                                          Figura 43 ndash BV - Cenaacuterio 6

                                                                          Tabela 18 ndash Resultados do Cenaacuterio 6

                                                                          Sistema Candidatoseleitos

                                                                          Meacutedia dasnotas

                                                                          FPTP sem voto de minoriaAna eBeto 2929

                                                                          FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

                                                                          FPTP com 80 de voto de minoriaBeto eCarla 0058

                                                                          Bloc VoteAna eCarla 2913

                                                                          Esses resultados podem ser replicados acessando os links

                                                                          Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

                                                                          100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

                                                                          80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

                                                                          53

                                                                          5 COMO FUNCIONA O SIMULADOR

                                                                          O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

                                                                          51 CLASSE ELECTIONS

                                                                          Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

                                                                          bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

                                                                          Figura 44 ndash estrutura candidates

                                                                          bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

                                                                          bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

                                                                          Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

                                                                          Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

                                                                          54

                                                                          Figura 45 ndash estrutura voters

                                                                          Figura 46 ndash estrutura votes

                                                                          daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

                                                                          Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

                                                                          55

                                                                          Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

                                                                          Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

                                                                          na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

                                                                          56

                                                                          Figura 49 ndash PDF - Distribuiccedilatildeo Liked

                                                                          Figura 50 ndash CDF - Distribuiccedilatildeo Liked

                                                                          (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

                                                                          Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

                                                                          57

                                                                          Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

                                                                          Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

                                                                          candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

                                                                          Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

                                                                          58

                                                                          Figura 53 ndash PDF - Distribuiccedilatildeo Loved

                                                                          Figura 54 ndash CDF - Distribuiccedilatildeo Loved

                                                                          funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

                                                                          59

                                                                          Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                                                                          Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                                                                          Meacutedia das Notas sumei

                                                                          sumvj nij

                                                                          etimes v

                                                                          Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                                                                          Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                                                                          60

                                                                          Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                                                                          Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                                                                          52 CLASSE FIRSTPASTTHEPOST

                                                                          Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                                                                          Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                                                                          61

                                                                          Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                                                                          Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                                                                          mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                                                                          62

                                                                          53 CLASSE TWOROUNDSYSTEM

                                                                          A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                                                                          54 CLASSE INSTANTRUNOFFVOTING

                                                                          A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                                                                          Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                                                                          63

                                                                          cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                                                                          55 CLASSE APPROVALVOTING

                                                                          Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                                                                          56 CLASSE BORDACOUNT

                                                                          Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                                                                          57 CLASSE SCOREVOTING

                                                                          De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                                                                          64

                                                                          58 CLASSE BLOCVOTE

                                                                          O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                                                                          59 TECNOLOGIAS UTILIZADAS

                                                                          A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                                                                          Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                                                                          O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                                                                          Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                                                                          65

                                                                          6 CONCLUSAtildeO

                                                                          Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                                                                          Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                                                                          Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                                                                          Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                                                                          Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                                                                          66

                                                                          REFEREcircNCIAS

                                                                          AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                                                                          Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                                                                          Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                                                                          Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                                                                          HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                                                                          LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                                                                          ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                                                                          Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                                                                          POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                                                                          The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                                                                          67

                                                                          APEcircNDICES

                                                                          APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                                                          Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                                                          if(not len(selfvoter_profiles))

                                                                          for voter in range(selfN_VOTERS)

                                                                          candidates_rank = dict()

                                                                          for candidate in reversed(range(selfN_CANDIDATES))

                                                                          if(selfBIAS_VECTOR[candidate]==4)

                                                                          candidates_rank[candidate] = self_sortear(selfloved)

                                                                          elif(selfBIAS_VECTOR[candidate]==3)

                                                                          candidates_rank[candidate] = self_sortear(selfliked)

                                                                          elif(selfBIAS_VECTOR[candidate]==2)

                                                                          candidates_rank[candidate] = self_sortear(selfdisliked)

                                                                          elif(selfBIAS_VECTOR[candidate]==1)

                                                                          candidates_rank[candidate] = self_sortear(selfhated)

                                                                          elif(selfBIAS_VECTOR[candidate]==-1)

                                                                          candidates_rank[candidate] = self_sortear(selfpolarizer

                                                                          )

                                                                          elif(selfBIAS_VECTOR[candidate]==-2)

                                                                          candidates_rank[candidate] = self_sortear(self

                                                                          more_polarizer)

                                                                          else

                                                                          candidates_rank[candidate] = self_sortear(selfneutral)

                                                                          selfvotersappend(candidates_rank)

                                                                          else

                                                                          ranges = []

                                                                          ranks = []

                                                                          for prof in selfvoter_profiles

                                                                          rangesappend(int(prof[pop_percentage]))

                                                                          rank =

                                                                          for index score in enumerate(prof[scores])

                                                                          rank[index] = score

                                                                          ranksappend(rank)

                                                                          for index _range in enumerate(ranges)

                                                                          for _ in range(int(selfN_VOTERS(_range100)))

                                                                          selfvotersappend(ranks[index])

                                                                          68

                                                                          APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                                                          Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                                                          for i in range(selfN_CANDIDATES)

                                                                          selfcandidates[i] = 0

                                                                          selfvotes[i] = set()

                                                                          APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                                                          Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                                                          for candidate in range(selfN_CANDIDATES)

                                                                          rating_sum = 0

                                                                          for voter in selfvoters

                                                                          rating_sum += voter[candidate]

                                                                          selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                                                          APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                                                          Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                                                          if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                                                          return selfcalculate_mean(winners)

                                                                          else

                                                                          chose_best = True if winners[0] == selfbest_candidate else

                                                                          False

                                                                          return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                                                          69

                                                                          APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                                                          Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                                                          rating_sum = 0

                                                                          for voter in selfvoters

                                                                          for candidate in winners

                                                                          rating_sum += voter[candidate]

                                                                          return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                                                          APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                                                          Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                                                          for i in range(1 selfN_VACANCIES + 2)

                                                                          selfleading_candidatesappend(selfsorted_candidates[-i][self

                                                                          CANDIDATE_INDEX])

                                                                          APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                                                          Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                                                          for leader in selfelecrounds[-1]

                                                                          selfleading_candidatesappend(leader[0])

                                                                          70

                                                                          APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                                                          Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                                                          self_account_for_coalitions()

                                                                          for voter in selfvoters

                                                                          selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                                                          (1)))

                                                                          temp = []

                                                                          for voter in selfsorted_voters

                                                                          new_dict = defaultdict(list)

                                                                          for k in voter

                                                                          new_dict[k[1]]append(k[0])

                                                                          tempappend(new_dict)

                                                                          selfsorted_voters = []

                                                                          for voter_index current_voter in enumerate(temp)

                                                                          new_voter = []

                                                                          for rating candidate_indexes in current_voteritems()

                                                                          if len(current_voter[rating]) gt 1

                                                                          shuffle(current_voter[rating])

                                                                          for e in candidate_indexes

                                                                          new_voterappend((e rating))

                                                                          else

                                                                          new_voterappend((candidate_indexes[0] rating))

                                                                          selfsorted_votersappend(new_voter)

                                                                          selfcandidates[new_voter[-1][0]] += 1

                                                                          selfvotes[new_voter[-1][0]]add(voter_index)

                                                                          71

                                                                          APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                                                          Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                                                          for candidate in selfvotes_copy

                                                                          if candidate not in selfelecleading_candidates

                                                                          for voter_index in selfvotes_copy[candidate]

                                                                          for index _candidate in enumerate(reversed(selfelec

                                                                          sorted_voters[voter_index]))

                                                                          if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                                                          leading_candidates

                                                                          if randomrandom() lt selfelec

                                                                          tactical_vote_percentages[_candidate[selfelec

                                                                          CANDIDATE_INDEX]]

                                                                          selfrankings_changed[voter_index] = copy

                                                                          deepcopy(selfelecsorted_voters[voter_index])

                                                                          selfrankings_changed[voter_index][-(index + 1)]

                                                                          selfrankings_changed[voter_index][-1] = self

                                                                          rankings_changed[voter_index][-1] self

                                                                          rankings_changed[voter_index][-(index + 1)]

                                                                          selfcandidates[candidate] -= 1

                                                                          selfcandidates[_candidate[selfelec

                                                                          CANDIDATE_INDEX]] += 1

                                                                          selfvotes[candidate]remove(voter_index)

                                                                          selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                                                          ]]add(voter_index)

                                                                          break

                                                                          break

                                                                          72

                                                                          APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                                                          Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                                                          half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                                                          for candidate in selfelecleading_candidates

                                                                          if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                                                          continue

                                                                          for voter_index in selfvotes_copy[candidate]

                                                                          if voter_index in selfrankings_changed

                                                                          ranking = selfrankings_changed[voter_index]

                                                                          else

                                                                          ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                                                          ])

                                                                          for index _candidate in enumerate(reversed(ranking))

                                                                          if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                          leading_candidates or (_candidate[selfelec

                                                                          CANDIDATE_INDEX] in selfelecleading_candidates and

                                                                          selfelecleading_candidatesindex(_candidate[selfelec

                                                                          CANDIDATE_INDEX]) gt= half_vacancies)

                                                                          if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                                                          if randomrandom() lt selfelec

                                                                          minority_vote_percentages[_candidate[selfelec

                                                                          CANDIDATE_INDEX]]

                                                                          selfcandidates[candidate] -= 1

                                                                          selfcandidates[_candidate[selfelec

                                                                          CANDIDATE_INDEX]] += 1

                                                                          break

                                                                          break

                                                                          break

                                                                          73

                                                                          APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                                                          Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                                                          self_account_for_coalitions()

                                                                          for candidate in selfvotes

                                                                          if candidate = selfwinner and candidate = selfsecond_place

                                                                          for voter_index in selfvotes[candidate]

                                                                          if voter_index in selfrankings_changed

                                                                          ranking = selfrankings_changed[voter_index]

                                                                          else

                                                                          ranking = copydeepcopy(selfelecsorted_voters[

                                                                          voter_index])

                                                                          for index2 candidate in enumerate(reversed(ranking))

                                                                          if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                                                          selfcandidates[selfwinner] += 1

                                                                          selfvotes[selfwinner]add(voter_index)

                                                                          break

                                                                          elif candidate[selfelecCANDIDATE_INDEX] == self

                                                                          second_place

                                                                          selfcandidates[selfsecond_place] += 1

                                                                          selfvotes[selfsecond_place]add(voter_index)

                                                                          break

                                                                          selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                          winners = []

                                                                          vacancies = selfelecN_VACANCIES

                                                                          for candidate in reversed(selfsorted_candidates)

                                                                          if vacancies == 0

                                                                          break

                                                                          winnersappend(candidate[0])

                                                                          vacancies -= 1

                                                                          mean chose_best = selfelecget_mean(winners = winners)

                                                                          74

                                                                          APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                                                          Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                                                          for voter_index voter in enumerate(selfelecsorted_voters)

                                                                          voter_dict = dict()

                                                                          og_voter_dict = dict()

                                                                          for tup in voter

                                                                          voter_dict[tup[0]] = tup[1]

                                                                          og_voter_dict[tup[0]] = tup[1]

                                                                          for coalition in selfeleccoalitions

                                                                          for candidate in coalition

                                                                          add_to_score = 0

                                                                          for candidate2 in coalition

                                                                          if candidate == candidate2

                                                                          continue

                                                                          half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                                                          if half lt 0

                                                                          add_to_score += mathceil(half)

                                                                          else

                                                                          add_to_score += mathfloor(half)

                                                                          if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                                                          voter_dict[candidate[rsquovaluersquo]] = 10

                                                                          elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                                                          voter_dict[candidate[rsquovaluersquo]] = -10

                                                                          else

                                                                          voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                                                          selfrankings_changed[voter_index] = []

                                                                          for candidate in voter_dict

                                                                          selfrankings_changed[voter_index]append((candidate voter_dict[

                                                                          candidate]))

                                                                          selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                                                          voter_index] key=lambda x x[1])

                                                                          75

                                                                          APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                                          Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                                          selfelecroundsappend(selfsorted_candidates[_round])

                                                                          if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                          N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                                          N_VACANCIES - 1)

                                                                          return 2

                                                                          elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                          N_VOTERS gt 05)

                                                                          return 1

                                                                          else

                                                                          selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                                          CANDIDATE_INDEX])

                                                                          for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                                          elecCANDIDATE_INDEX]]

                                                                          if voter_index in selfrankings_changed

                                                                          for candidate in reversed(selfrankings_changed[voter_index

                                                                          ])

                                                                          if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                          excluded

                                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                          ]] += 1

                                                                          selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                          add(voter_index)

                                                                          break

                                                                          else

                                                                          continue

                                                                          else

                                                                          for candidate in reversed(selfelecsorted_voters[

                                                                          voter_index])

                                                                          if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                          excluded

                                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                          ]] += 1

                                                                          selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                          add(voter_index)

                                                                          break

                                                                          else

                                                                          continue

                                                                          selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                          return 0

                                                                          76

                                                                          APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                                          Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                                          for index in range(selfelecN_CANDIDATES)

                                                                          selfcandidates[index] = 0

                                                                          for voter in selfelecsorted_voters

                                                                          for candidate in reversed(voter)

                                                                          if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                          else

                                                                          break

                                                                          APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                                          Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                                          for index in range(selfelecN_CANDIDATES)

                                                                          selfcandidates[index] = 0

                                                                          for voter in selfelecsorted_voters

                                                                          if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                          elecCANDIDATE_INDEX]]

                                                                          selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                                          else

                                                                          for candidate in reversed(voter)

                                                                          if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                          else

                                                                          break

                                                                          77

                                                                          APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                                          Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                                          pos = set()

                                                                          for index perc in enumerate(selfelectactical_vote_percentages)

                                                                          if perc gt 0

                                                                          posadd(index)

                                                                          for candidate in selfeleccandidates

                                                                          if candidate not in selfleading_candidates

                                                                          for voter_index in selfvotes[candidate]

                                                                          raised = None

                                                                          for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                                          ])

                                                                          if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                                          leading_candidates

                                                                          if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                                          if randomrandom() lt selfelectactical_vote_percentages[

                                                                          candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                                          ranking = [None]selfelecN_CANDIDATES

                                                                          ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                          selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                          CANDIDATE_INDEX]])

                                                                          raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                          break

                                                                          break

                                                                          break

                                                                          if raised = None

                                                                          for _candidate in selfleading_candidates

                                                                          if _candidate = ranking[-1][0]

                                                                          ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                          _candidate])

                                                                          buried = _candidate

                                                                          break

                                                                          i = 1

                                                                          for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                          if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                                          buried]

                                                                          continue

                                                                          else

                                                                          ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                          selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                          CANDIDATE_INDEX]])

                                                                          i += 1

                                                                          selfrankings_changed[voter_index] = ranking

                                                                          78

                                                                          APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                                          Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                                          for voter_index in selfvotes[candidate]

                                                                          if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                                          ]

                                                                          for _candidate in selfleading_candidates

                                                                          if _candidate = candidate

                                                                          ranking = [None]selfelecN_CANDIDATES

                                                                          ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                          _candidate])

                                                                          buried = _candidate

                                                                          break

                                                                          i = 1

                                                                          for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                          if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                                          continue

                                                                          else

                                                                          ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                          selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                          CANDIDATE_INDEX]])

                                                                          i += 1

                                                                          selfrankings_changed[voter_index] = ranking

                                                                          79

                                                                          APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                                          Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                                          for index in range(selfelecN_CANDIDATES)

                                                                          selfcandidates[index] = 0

                                                                          for voter_index voter in enumerate(selfelecsorted_voters)

                                                                          score = 0

                                                                          if voter_index in selfrankings_changed

                                                                          for candidate in selfrankings_changed[voter_index]

                                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                          score += 1

                                                                          else

                                                                          for candidate in voter

                                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                          score += 1

                                                                          APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                                          Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                                          for voter_index voter in enumerate(selfelecsorted_voters)

                                                                          if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                          elecCANDIDATE_INDEX]]

                                                                          selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                                          sorted_voters[voter_index])

                                                                          for candidate_index candidate in enumerate(reversed(voter))

                                                                          if candidate_index == 0

                                                                          selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                          voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                                          else

                                                                          selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                          voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                                          80

                                                                          APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                                          Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                                          for index in range(selfelecN_CANDIDATES)

                                                                          selfcandidates[index] = 0

                                                                          for voter_index voter in enumerate(selfelecsorted_voters)

                                                                          if voter_index in selfrankings_changed

                                                                          for candidate in selfrankings_changed[voter_index]

                                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                          selfelecCANDIDATE_RANK]

                                                                          else

                                                                          for candidate in voter

                                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                          selfelecCANDIDATE_RANK]

                                                                          APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                                          Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                                          for index in range(selfelecN_CANDIDATES)

                                                                          selfcandidates[index] = 0

                                                                          for voter in selfelecsorted_voters

                                                                          votes = selfelecN_VACANCIES

                                                                          for candidate in reversed(voter)

                                                                          if votes == 0

                                                                          break

                                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                          votes -= 1

                                                                          • Folha de aprovaccedilatildeo
                                                                          • Agradecimentos
                                                                          • Epiacutegrafe
                                                                          • Resumo
                                                                          • Abstract
                                                                          • Lista de ilustraccedilotildees
                                                                          • Lista de Coacutedigos
                                                                          • Lista de tabelas
                                                                          • Lista de abreviaturas e siglas
                                                                          • Sumaacuterio
                                                                          • INTRODUCcedilAtildeO
                                                                            • MOTIVACcedilAtildeO E OBJETIVO
                                                                            • MEacuteTODO
                                                                            • ESTRUTURA
                                                                              • SISTEMAS ELEITORAIS
                                                                                • FISRT PAST THE POST
                                                                                  • Exemplo
                                                                                  • Vantagens e Desvantagens do FPTP
                                                                                  • Voto Uacutetil no FPTP
                                                                                    • TWO-ROUND SYSTEM
                                                                                      • Exemplo
                                                                                      • Vantagens e Desvantagens do TRS
                                                                                      • Voto Uacutetil no TRS
                                                                                        • INSTANT-RUNOFF VOTING
                                                                                          • Exemplo
                                                                                          • Vantagens e Desvantagens do IRV
                                                                                          • Voto Uacutetil no IRV
                                                                                            • APPROVAL VOTING SYSTEM
                                                                                              • Exemplo
                                                                                              • Vantagens e Desvantagens do AVS
                                                                                              • Voto Uacutetil no AVS
                                                                                                • THE BORDA COUNT
                                                                                                  • Exemplo
                                                                                                  • Vantagens e Desvantagens do BC
                                                                                                  • Voto Uacutetil no BC
                                                                                                    • SCORE VOTING SYSTEM
                                                                                                      • Exemplo
                                                                                                      • Vantagens e Desvantagens do SVS
                                                                                                      • Voto Uacutetil no SVS
                                                                                                        • BLOC VOTE
                                                                                                          • Exemplo
                                                                                                          • Voto Uacutetil no BV
                                                                                                              • O SIMULADOR
                                                                                                              • CENAacuteRIOS PERTINENTES
                                                                                                                • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                                • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                                • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                                • CENAacuteRIO 4 COALIZOtildeES
                                                                                                                • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                                • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                                  • COMO FUNCIONA O SIMULADOR
                                                                                                                    • CLASSE Elections
                                                                                                                    • CLASSE FirstPastThePost
                                                                                                                    • CLASSE TwoRoundSystem
                                                                                                                    • CLASSE InstantRunoffVoting
                                                                                                                    • CLASSE ApprovalVoting
                                                                                                                    • CLASSE BordaCount
                                                                                                                    • CLASSE ScoreVoting
                                                                                                                    • CLASSE BlocVote
                                                                                                                    • TECNOLOGIAS UTILIZADAS
                                                                                                                      • CONCLUSAtildeO
                                                                                                                      • Referecircncias
                                                                                                                      • Meacutetodo create_voters
                                                                                                                      • Meacutetodo create_candidates
                                                                                                                      • Meacutetodo calculate_means
                                                                                                                      • Meacutetodo get_mean
                                                                                                                      • Meacutetodo calculate_mean
                                                                                                                      • Meacutetodo set_leading_candidates
                                                                                                                      • Meacutetodo irv_set_leading_candidates
                                                                                                                      • Meacutetodo sort_ranks
                                                                                                                      • Meacutetodo fptp_count_tactical_votes
                                                                                                                      • Meacutetodo fptp_count_minority_votes
                                                                                                                      • Meacutetodo trs_second_round
                                                                                                                      • Meacutetodo trs_account_for_coalitions
                                                                                                                      • Meacutetodo irv_count_votes
                                                                                                                      • Meacutetodo avs_count_votes
                                                                                                                      • Meacutetodo avs_count_votes_with_tactical
                                                                                                                      • Meacutetodo irv_apply_tactical_votes
                                                                                                                      • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                                      • Meacutetodo bc_sum_candidates_scores
                                                                                                                      • Meacutetodo svs_apply_tactical_votes
                                                                                                                      • Meacutetodo svs_sum_candidates_scores
                                                                                                                      • Meacutetodo bv_count_votes

                                                                            38

                                                                            Figura 18 ndash IRV primeiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                                            Figura 19 ndash IRV segundo turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                                            Figura 20 ndash IRV terceiro turno - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                                            39

                                                                            Figura 21 ndash AVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                                            Figura 22 ndash BC - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                                            Figura 23 ndash SVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                                            40

                                                                            Eacute claro que se os eleitores que preferem o Beto tambeacutem votassem de maneira estra-teacutegica a situaccedilatildeo se equilibraria e haveria o mesmo niacutevel de concorrecircncia entre os doiscandidatos que ocorre quando natildeo haacute voto taacutetico Poreacutem no Borda Count esse equiliacute-brio pode natildeo acontecer e as estrateacutegias de compromising e burying podem acabar saindopela culatra se uma porcentagem elevada dos eleitores as adotarem Abaixo encontram-seos resultados para esse sistema quando 100 dos eleitores de Carla e Diego se comportammaliciosamente

                                                                            Figura 24 ndash BC - Cenaacuterio 1 100 de voto taacutetico na Ana e Beto

                                                                            Por causa do uso demasiado da estrateacutegia burying Ana e Beto perdem muitos pontose isso abre espaccedilo para uma vitoacuteria da Carla No entanto para porcentagens menores que100 o Beto ainda eacute o vencedor

                                                                            Essas duas estrateacutegias tambeacutem foram implementadas nesse simulador para o sistemaIRV e eacute possiacutevel ver como ele eacute resistente a elas Para que seja possiacutevel mudar os resultadosde uma eleiccedilatildeo sob o IRV eacute necessaacuterio mudar a ordem de eliminaccedilatildeo dos candidatos paraque o seu candidato preferido acabe enfrentando um candidato mais fraco nas rodadasfinais Isso natildeo ocorre com compromising e burying No proacuteximo cenaacuterio seraacute analisadacomo eacute possiacutevel modificar os resultados de uma eleiccedilatildeo sob o IRV

                                                                            Esses resultados podem ser replicados acessando os linksSem votos taacuteticos lthttpelectionsimpythonanywherecomdirect_res1111110

                                                                            --[0021][22Ana2222Beto222022Carla2222Diego22]------100gt

                                                                            Com 20 de voto taacutetico lthttpelectionsimpythonanywherecomdirect_res1111110--[0021][22Ana222022Beto2222Carla2222Diego22]1-[02000]---100gt

                                                                            Com 100 de voto taacuteticona Ana e Beto lthttpelectionsimpythonanywherecomdirect_res0000100--[0021][22Ana222022Beto222022Carla2222Diego22]1-[101000]---100gt

                                                                            41

                                                                            42 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV

                                                                            Neste cenaacuterio teremos Ana Carla e Beto concorrendo e trecircs perfis distintos que apoiamcada candidato As distribuiccedilotildees de notas dos perfis se encontram na tabela abaixo

                                                                            Tabela 12 ndash Distribuiccedilatildeo de notas - Cenaacuterio 2

                                                                            Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                                            deeleitores

                                                                            1 10 5 0 422 0 10 5 303 5 0 10 28

                                                                            Com essas distribuiccedilotildees Carla eacute eliminada na primeira rodada e seus 28 de votossatildeo transferidos para a segunda opccedilatildeo de seus eleitores Ana que eacute eleita com 70 dosvotos e uma meacutedia de 56

                                                                            Figura 25 ndash IRV primeiro turno - Cenaacuterio 2

                                                                            Figura 26 ndash IRV segundo turno - Cenaacuterio 2

                                                                            42

                                                                            Cientes desse provaacutevel futuro cenaacuterio onde Ana eacute eleita uma pequena parte dos elei-tores de Beto estrategicamente o abandona e decide apoiar Carla na esperanccedila de leva-laao segundo turno contra Ana As novas distribuiccedilotildees de notas se encontram na tabelaabaixo com essa porccedilatildeo de eleitores representada pelo perfil 4

                                                                            Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2

                                                                            Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                                            deeleitores

                                                                            1 10 5 0 422 0 10 5 283 5 0 10 284 0 8 10 2

                                                                            Essa mudanccedila estrateacutegica de voto altera a ordem de eliminaccedilotildees do sistema com Betosendo o primeiro a ser eliminado Com isso seus votos satildeo naturalmente transferidos paraCarla que derrota Ana no segundo turno com 58 dos votos

                                                                            Figura 27 ndash IRV primeiro turno com voto taacutetico - Cenaacuterio 2

                                                                            Figura 28 ndash IRV segundo turno com voto taacutetico - Cenaacuterio 2

                                                                            43

                                                                            Percebendo que a eleiccedilatildeo de Beto natildeo era provaacutevel seus eleitores conseguiram aomenos impedir a eleiccedilatildeo do pior candidato para eles Mas para isso foi necessaacuterio queeles tivessem a informaccedilatildeo de como os outros eleitores votariam Uma aproximaccedilatildeo dessasinformaccedilotildees poderia ser obtida em um cenaacuterio real com poucos candidatos atraveacutes depesquisas eleitorais poreacutem se o nuacutemero de candidatos eacute significativo uma noccedilatildeo completadas distribuiccedilotildees dos rankings dos eleitores se torna muito menos viaacutevel e dificulta aformulaccedilatildeo de estrateacutegias para alterar a ordem em que os candidatos satildeo eliminados

                                                                            Esses resultados podem ser replicados acessando os linksSem voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana22

                                                                            22Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                                            Com voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana

                                                                            2222Beto2222Carla22]-----42Voter20Profile2001020520028Voter20Profile2010201020528Voter20Profile202520020102Voter20Profile20302082010100gt

                                                                            43 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE

                                                                            O interessante dos sistemas IRV e TRS eacute que os resultados do cenaacuterio anterior po-deriam ter sido obtidos ao inveacutes do voto taacutetico pela sua natildeo-monotonicidade Seriapossiacutevel que a Carla derrotasse a Ana no segundo turno atraveacutes do proacuteprio aumento depopularidade da Ana Assumindo que essa popularizaccedilatildeo ocorresse entre os candidatosdo perfil 2 onde 3 passasse a apoiar a Ana ao inveacutes do Beto as novas distribuiccedilotildeesseguiriam a tabela abaixo

                                                                            Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                                            Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                                            deeleitores

                                                                            1 10 5 0 452 0 10 5 273 5 0 10 28

                                                                            Dessa maneira Beto agora com uma porcentagem dos eleitores menor do que a deCarla seraacute eliminado na primeira rodada e como seus eleitores tecircm a Carla como segundaopccedilatildeo ela receberaacute todos os seus votos e seraacute eleita na segunda rodada As rodadas doIRV podem ser vistas nas figuras 29 e 30

                                                                            44

                                                                            Figura 29 ndash IRV primeiro turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                                            Figura 30 ndash IRV segundo turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                                            Tabela 15 ndash Resultados do Cenaacuterio 3Candidato

                                                                            eleitoMeacutedia das

                                                                            notasAntes da

                                                                            popularizaccedilatildeode Ana

                                                                            Ana 56

                                                                            Apoacutespopularizaccedilatildeo

                                                                            de AnaCarla 415

                                                                            Os efeitos dessa caracteriacutestica se refletem na satisfaccedilatildeo meacutedia da populaccedilatildeo A Ana eacuteclaramente a melhor candidata e mesmo com o seu ganho de popularidade (ou devido aele) a Carla eacute eleita

                                                                            Esses resultados podem ser replicados acessando os linksAntes da popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecom

                                                                            direct_res0010000---[22Ana2222Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                                            45

                                                                            Apoacutes popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana2222Beto2222Carla22]-----45Voter20Profile2001020520027Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                                            44 CENAacuteRIO 4 COALIZOtildeES

                                                                            O TRS por ser organizado em dois turnos separados normalmente a semanas dedistacircncia um do outro acaba abrindo brecha agrave mudanccedila de opiniatildeo por parte dos eleitorese o desenvolvimento de novas estrateacutegias por parte dos candidatos tais como a coalizatildeocom candidatos jaacute eliminados Com isso em mente nesse cenaacuterio teremos novamenteos quatro candidatos Ana Beto Carla e Diego Os trecircs primeiros seratildeo gerados dadistribuiccedilatildeo Neutral e Diego da distribuiccedilatildeo Disliked

                                                                            Figura 31 ndash TRS turno 1 - Cenaacuterio 4

                                                                            No TRS normal Ana Beto e Carla possuem com essas distribuiccedilotildees quantidades devotos muito proacuteximas com Beto e Carla indo para o segundo turno Carla estaacute 10 votosatraacutes de Beto e decide aproveitar o espaccedilo de tempo entre os dois turnos para tentaragregar mais votos Com isso Carla se aproxima de Diego e juntos formam uma coalizatildeoNo entanto com sua baixa popularidade Diego acaba ferindo a reputaccedilatildeo de Carla etorna o segundo turno muito mais faacutecil para Beto (Figura 33) Se Carla tivesse buscado osuporte de Ana por outro lado ela se veria vitoriosa no segundo turno e com uma amplavantagem sobre o Beto (Figura 34) Ou ateacute mesmo sem buscar uma coalizatildeo mesmosendo uma corrida apertada Carla teria naturalmente sido eleita (Figura 32)

                                                                            Esses resultados podem ser replicados acessando os linksSem coalizotildees lthttpelectionsimpythonanywherecomdirect_res0100000

                                                                            --[0002][22Ana222022Beto2222Carla2222Diego22]------100gt

                                                                            46

                                                                            Figura 32 ndash TRS turno 2 - Cenaacuterio 4

                                                                            Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4

                                                                            Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4

                                                                            47

                                                                            Coalizatildeo Carla e Diego lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2203Carla20Diego-100gt

                                                                            Coalizatildeo Carla e Ana lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2200Carla20Ana-100gt

                                                                            45 CENAacuteRIO 5 DILEMA DO PRISIONEIRO

                                                                            Neste cenaacuterio temos uma eleiccedilatildeo de uma vaga com trecircs candidatos concorrentes e trecircsperfis distintos de eleitores que seguiratildeo as seguintes distribuiccedilotildees

                                                                            Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5

                                                                            Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                                            deeleitores

                                                                            1 10 -10 5 362 -10 10 5 343 -10 -10 5 30

                                                                            Esse contexto nos remete ao notaacutevel dilema do prisioneiro Nele dois prisioneiroscuacutemplices satildeo interrogados individualmente sem poder se comunicar um com o outro ecada um enfrenta o dilema de delatar ou natildeo o seu parceiro Se os dois prisioneirosdecidem se manter calados sobre o crime ambos satildeo sentenciados a um ano de prisatildeo Seapenas um deles dedurar o outro o traidor sai livre enquanto seu parceiro eacute condenadoa trecircs anos Se ambos dedurarem um ao outro eles satildeo condenados juntos a dois anosde prisatildeo Esse dilema eacute uma ideia claacutessica presente no estudo da teoria dos jogos sendooriginalmente elaborada por Merrill Flood e Melvin Dresher em 1950 e mais tarde sendonomeada de dilema dos prisioneiros por Albert W Tucker (POUNDSTONE 1992)

                                                                            O que esse dilema nos mostra eacute a tentaccedilatildeo que o indiviacuteduo deteacutem se sua racionalizaccedilatildeoestiver voltada para seus proacuteprios interesses e somente eles em oposiccedilatildeo a pensar no bemdo grupo como um todo Neste cenaacuterio encontramos dois grupos de eleitores expressiva-mente opostos os perfis 1 e 2 Se qualquer uma das preferecircncias desses perfis fosse eleitaisso significaria uma alta rejeiccedilatildeo de maior parte da populaccedilatildeo No entanto eles possuema segunda opccedilatildeo em comum a Carla que por sua vez eacute a preferecircncia do terceiro perfilPortanto a eleiccedilatildeo da Carla seria logicamente o resultado oacutetimo

                                                                            Mesmo assim a Ana eacute eleita nos dois sistemas acima o que natildeo parece justo poispela tabela 16 eacute evidente que apenas 36 da populaccedilatildeo a aprova enquanto que os outros64 a reprovam ao maacuteximo O sistema IRV se comporta de maneira idecircntica ao TRS

                                                                            48

                                                                            Figura 35 ndash FPTP - Cenaacuterio 5

                                                                            Figura 36 ndash TRS segundo turno - Cenaacuterio 5

                                                                            nesta situaccedilatildeo Com esse resultado a meacutedia das notas eacute -28 No entanto os trecircs sistemasseguintes nos apresentam resultados diferentes

                                                                            Tabela 17 ndash Resultados do Cenaacuterio 5

                                                                            Sistema Candidatoeleito

                                                                            Meacutedia dasnotas

                                                                            FPTP Ana -28TRS Ana -28IRV Ana -28AVS Carla 50BC Carla 50SVS Carla 50

                                                                            49

                                                                            Figura 37 ndash AVS - Cenaacuterio 5

                                                                            Figura 38 ndash BC - Cenaacuterio 5

                                                                            Tanto o AVS quanto o Borda Count e o SVS satildeo sistemas que consideram todasas opiniotildees de cada eleitor ao mesmo tempo e por isso satildeo capazes de eleger o melhorcandidato nesta situaccedilatildeo diferentemente do TRS que natildeo absorve completamente todosentimento do eleitor por todos os candidatos e o IRV que apesar de ser bem expressivoquebra esse processo em inuacutemeras rodadas o que permite a perda de informaccedilatildeo ao longodelas

                                                                            Esses resultados podem ser replicados acessando o linklthttpelectionsimpythonanywherecomdirect_res1111110---[22Ana

                                                                            222022Beto222022Carla22]-----36Voter20Profile2001020-1020534Voter20Profile201-10201020530Voter20Profile202-1020-10205100gt

                                                                            50

                                                                            Figura 39 ndash SVS - Cenaacuterio 5

                                                                            46 CENAacuteRIO 6 VOTO DE MINORIA

                                                                            Neste cenaacuterio temos uma eleiccedilatildeo com quatro candidatos e duas vagas A Ana seraacutea preferecircncia de uma extensa parte da populaccedilatildeo (distribuiccedilatildeo Loved Figura 53) Betoe Carla seratildeo candidatos razoavelmente populares (distribuiccedilatildeo Neutral Figura 47) eDiego seraacute a preferecircncia de apenas um pequeno grupo especiacutefico e rejeitado pela maioria(distribuiccedilatildeo Disliked Figura 51) Eacute intuitivo esperar que os dois candidatos eleitos seratildeoa Ana e ou o Beto ou a Carla e isso eacute exatamente o que ocorre na figura 40 no sistemaFPTP sem voto de minoria

                                                                            Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria

                                                                            Eacute evidente a discrepacircncia da quantidade de votos da Ana para os outros candidatose apesar de Beto e Carla serem mais populares que Diego os trecircs natildeo se encontrammuito afastados Poreacutem se a pequena fraccedilatildeo de candidatos que possuem a Ana como

                                                                            51

                                                                            Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego

                                                                            preferecircncia e Diego como segunda opccedilatildeo optarem pelo voto de minoria a situaccedilatildeo mudacompletamente (Figura 41) Assim apesar de extensamente rejeitado Diego conquistaa segunda vaga e a meacutedia das notas despenca de 2929 para 0505 No entanto aindaexiste um cenaacuterio pior Se os outros grupos de eleitores pensarem da mesma forma eevitarem votar na Ana achando que sua eleiccedilatildeo jaacute estaacute assegurada apenas 80 de votode minoria para esses grupos jaacute eacute o suficiente para eliminaacute-la das eleiccedilotildees (Figura 42)Com a Ana eliminada a meacutedia das notas cai ainda mais para 0058

                                                                            Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego

                                                                            O sistema Bloc Vote eacute uma das soluccedilotildees para o voto de minoria Permitindo queos eleitores votem no mesmo nuacutemero de candidatos que de vagas a serem preenchidasnatildeo existe o iacutempeto a esse tipo de voto estrateacutegico O resultado desse sistema portantoretorna a meacutedia das notas a casa dos 29 (Figura 43) Os sistemas AVS Borda Count eSVS tambeacutem impedem a presenccedila do voto de minoria e atingem resultados semelhantes

                                                                            52

                                                                            Figura 43 ndash BV - Cenaacuterio 6

                                                                            Tabela 18 ndash Resultados do Cenaacuterio 6

                                                                            Sistema Candidatoseleitos

                                                                            Meacutedia dasnotas

                                                                            FPTP sem voto de minoriaAna eBeto 2929

                                                                            FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

                                                                            FPTP com 80 de voto de minoriaBeto eCarla 0058

                                                                            Bloc VoteAna eCarla 2913

                                                                            Esses resultados podem ser replicados acessando os links

                                                                            Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

                                                                            100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

                                                                            80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

                                                                            53

                                                                            5 COMO FUNCIONA O SIMULADOR

                                                                            O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

                                                                            51 CLASSE ELECTIONS

                                                                            Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

                                                                            bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

                                                                            Figura 44 ndash estrutura candidates

                                                                            bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

                                                                            bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

                                                                            Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

                                                                            Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

                                                                            54

                                                                            Figura 45 ndash estrutura voters

                                                                            Figura 46 ndash estrutura votes

                                                                            daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

                                                                            Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

                                                                            55

                                                                            Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

                                                                            Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

                                                                            na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

                                                                            56

                                                                            Figura 49 ndash PDF - Distribuiccedilatildeo Liked

                                                                            Figura 50 ndash CDF - Distribuiccedilatildeo Liked

                                                                            (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

                                                                            Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

                                                                            57

                                                                            Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

                                                                            Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

                                                                            candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

                                                                            Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

                                                                            58

                                                                            Figura 53 ndash PDF - Distribuiccedilatildeo Loved

                                                                            Figura 54 ndash CDF - Distribuiccedilatildeo Loved

                                                                            funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

                                                                            59

                                                                            Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                                                                            Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                                                                            Meacutedia das Notas sumei

                                                                            sumvj nij

                                                                            etimes v

                                                                            Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                                                                            Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                                                                            60

                                                                            Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                                                                            Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                                                                            52 CLASSE FIRSTPASTTHEPOST

                                                                            Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                                                                            Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                                                                            61

                                                                            Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                                                                            Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                                                                            mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                                                                            62

                                                                            53 CLASSE TWOROUNDSYSTEM

                                                                            A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                                                                            54 CLASSE INSTANTRUNOFFVOTING

                                                                            A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                                                                            Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                                                                            63

                                                                            cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                                                                            55 CLASSE APPROVALVOTING

                                                                            Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                                                                            56 CLASSE BORDACOUNT

                                                                            Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                                                                            57 CLASSE SCOREVOTING

                                                                            De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                                                                            64

                                                                            58 CLASSE BLOCVOTE

                                                                            O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                                                                            59 TECNOLOGIAS UTILIZADAS

                                                                            A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                                                                            Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                                                                            O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                                                                            Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                                                                            65

                                                                            6 CONCLUSAtildeO

                                                                            Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                                                                            Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                                                                            Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                                                                            Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                                                                            Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                                                                            66

                                                                            REFEREcircNCIAS

                                                                            AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                                                                            Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                                                                            Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                                                                            Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                                                                            HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                                                                            LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                                                                            ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                                                                            Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                                                                            POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                                                                            The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                                                                            67

                                                                            APEcircNDICES

                                                                            APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                                                            Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                                                            if(not len(selfvoter_profiles))

                                                                            for voter in range(selfN_VOTERS)

                                                                            candidates_rank = dict()

                                                                            for candidate in reversed(range(selfN_CANDIDATES))

                                                                            if(selfBIAS_VECTOR[candidate]==4)

                                                                            candidates_rank[candidate] = self_sortear(selfloved)

                                                                            elif(selfBIAS_VECTOR[candidate]==3)

                                                                            candidates_rank[candidate] = self_sortear(selfliked)

                                                                            elif(selfBIAS_VECTOR[candidate]==2)

                                                                            candidates_rank[candidate] = self_sortear(selfdisliked)

                                                                            elif(selfBIAS_VECTOR[candidate]==1)

                                                                            candidates_rank[candidate] = self_sortear(selfhated)

                                                                            elif(selfBIAS_VECTOR[candidate]==-1)

                                                                            candidates_rank[candidate] = self_sortear(selfpolarizer

                                                                            )

                                                                            elif(selfBIAS_VECTOR[candidate]==-2)

                                                                            candidates_rank[candidate] = self_sortear(self

                                                                            more_polarizer)

                                                                            else

                                                                            candidates_rank[candidate] = self_sortear(selfneutral)

                                                                            selfvotersappend(candidates_rank)

                                                                            else

                                                                            ranges = []

                                                                            ranks = []

                                                                            for prof in selfvoter_profiles

                                                                            rangesappend(int(prof[pop_percentage]))

                                                                            rank =

                                                                            for index score in enumerate(prof[scores])

                                                                            rank[index] = score

                                                                            ranksappend(rank)

                                                                            for index _range in enumerate(ranges)

                                                                            for _ in range(int(selfN_VOTERS(_range100)))

                                                                            selfvotersappend(ranks[index])

                                                                            68

                                                                            APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                                                            Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                                                            for i in range(selfN_CANDIDATES)

                                                                            selfcandidates[i] = 0

                                                                            selfvotes[i] = set()

                                                                            APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                                                            Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                                                            for candidate in range(selfN_CANDIDATES)

                                                                            rating_sum = 0

                                                                            for voter in selfvoters

                                                                            rating_sum += voter[candidate]

                                                                            selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                                                            APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                                                            Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                                                            if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                                                            return selfcalculate_mean(winners)

                                                                            else

                                                                            chose_best = True if winners[0] == selfbest_candidate else

                                                                            False

                                                                            return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                                                            69

                                                                            APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                                                            Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                                                            rating_sum = 0

                                                                            for voter in selfvoters

                                                                            for candidate in winners

                                                                            rating_sum += voter[candidate]

                                                                            return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                                                            APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                                                            Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                                                            for i in range(1 selfN_VACANCIES + 2)

                                                                            selfleading_candidatesappend(selfsorted_candidates[-i][self

                                                                            CANDIDATE_INDEX])

                                                                            APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                                                            Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                                                            for leader in selfelecrounds[-1]

                                                                            selfleading_candidatesappend(leader[0])

                                                                            70

                                                                            APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                                                            Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                                                            self_account_for_coalitions()

                                                                            for voter in selfvoters

                                                                            selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                                                            (1)))

                                                                            temp = []

                                                                            for voter in selfsorted_voters

                                                                            new_dict = defaultdict(list)

                                                                            for k in voter

                                                                            new_dict[k[1]]append(k[0])

                                                                            tempappend(new_dict)

                                                                            selfsorted_voters = []

                                                                            for voter_index current_voter in enumerate(temp)

                                                                            new_voter = []

                                                                            for rating candidate_indexes in current_voteritems()

                                                                            if len(current_voter[rating]) gt 1

                                                                            shuffle(current_voter[rating])

                                                                            for e in candidate_indexes

                                                                            new_voterappend((e rating))

                                                                            else

                                                                            new_voterappend((candidate_indexes[0] rating))

                                                                            selfsorted_votersappend(new_voter)

                                                                            selfcandidates[new_voter[-1][0]] += 1

                                                                            selfvotes[new_voter[-1][0]]add(voter_index)

                                                                            71

                                                                            APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                                                            Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                                                            for candidate in selfvotes_copy

                                                                            if candidate not in selfelecleading_candidates

                                                                            for voter_index in selfvotes_copy[candidate]

                                                                            for index _candidate in enumerate(reversed(selfelec

                                                                            sorted_voters[voter_index]))

                                                                            if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                                                            leading_candidates

                                                                            if randomrandom() lt selfelec

                                                                            tactical_vote_percentages[_candidate[selfelec

                                                                            CANDIDATE_INDEX]]

                                                                            selfrankings_changed[voter_index] = copy

                                                                            deepcopy(selfelecsorted_voters[voter_index])

                                                                            selfrankings_changed[voter_index][-(index + 1)]

                                                                            selfrankings_changed[voter_index][-1] = self

                                                                            rankings_changed[voter_index][-1] self

                                                                            rankings_changed[voter_index][-(index + 1)]

                                                                            selfcandidates[candidate] -= 1

                                                                            selfcandidates[_candidate[selfelec

                                                                            CANDIDATE_INDEX]] += 1

                                                                            selfvotes[candidate]remove(voter_index)

                                                                            selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                                                            ]]add(voter_index)

                                                                            break

                                                                            break

                                                                            72

                                                                            APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                                                            Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                                                            half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                                                            for candidate in selfelecleading_candidates

                                                                            if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                                                            continue

                                                                            for voter_index in selfvotes_copy[candidate]

                                                                            if voter_index in selfrankings_changed

                                                                            ranking = selfrankings_changed[voter_index]

                                                                            else

                                                                            ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                                                            ])

                                                                            for index _candidate in enumerate(reversed(ranking))

                                                                            if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                            leading_candidates or (_candidate[selfelec

                                                                            CANDIDATE_INDEX] in selfelecleading_candidates and

                                                                            selfelecleading_candidatesindex(_candidate[selfelec

                                                                            CANDIDATE_INDEX]) gt= half_vacancies)

                                                                            if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                                                            if randomrandom() lt selfelec

                                                                            minority_vote_percentages[_candidate[selfelec

                                                                            CANDIDATE_INDEX]]

                                                                            selfcandidates[candidate] -= 1

                                                                            selfcandidates[_candidate[selfelec

                                                                            CANDIDATE_INDEX]] += 1

                                                                            break

                                                                            break

                                                                            break

                                                                            73

                                                                            APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                                                            Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                                                            self_account_for_coalitions()

                                                                            for candidate in selfvotes

                                                                            if candidate = selfwinner and candidate = selfsecond_place

                                                                            for voter_index in selfvotes[candidate]

                                                                            if voter_index in selfrankings_changed

                                                                            ranking = selfrankings_changed[voter_index]

                                                                            else

                                                                            ranking = copydeepcopy(selfelecsorted_voters[

                                                                            voter_index])

                                                                            for index2 candidate in enumerate(reversed(ranking))

                                                                            if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                                                            selfcandidates[selfwinner] += 1

                                                                            selfvotes[selfwinner]add(voter_index)

                                                                            break

                                                                            elif candidate[selfelecCANDIDATE_INDEX] == self

                                                                            second_place

                                                                            selfcandidates[selfsecond_place] += 1

                                                                            selfvotes[selfsecond_place]add(voter_index)

                                                                            break

                                                                            selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                            winners = []

                                                                            vacancies = selfelecN_VACANCIES

                                                                            for candidate in reversed(selfsorted_candidates)

                                                                            if vacancies == 0

                                                                            break

                                                                            winnersappend(candidate[0])

                                                                            vacancies -= 1

                                                                            mean chose_best = selfelecget_mean(winners = winners)

                                                                            74

                                                                            APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                                                            Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                                                            for voter_index voter in enumerate(selfelecsorted_voters)

                                                                            voter_dict = dict()

                                                                            og_voter_dict = dict()

                                                                            for tup in voter

                                                                            voter_dict[tup[0]] = tup[1]

                                                                            og_voter_dict[tup[0]] = tup[1]

                                                                            for coalition in selfeleccoalitions

                                                                            for candidate in coalition

                                                                            add_to_score = 0

                                                                            for candidate2 in coalition

                                                                            if candidate == candidate2

                                                                            continue

                                                                            half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                                                            if half lt 0

                                                                            add_to_score += mathceil(half)

                                                                            else

                                                                            add_to_score += mathfloor(half)

                                                                            if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                                                            voter_dict[candidate[rsquovaluersquo]] = 10

                                                                            elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                                                            voter_dict[candidate[rsquovaluersquo]] = -10

                                                                            else

                                                                            voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                                                            selfrankings_changed[voter_index] = []

                                                                            for candidate in voter_dict

                                                                            selfrankings_changed[voter_index]append((candidate voter_dict[

                                                                            candidate]))

                                                                            selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                                                            voter_index] key=lambda x x[1])

                                                                            75

                                                                            APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                                            Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                                            selfelecroundsappend(selfsorted_candidates[_round])

                                                                            if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                            N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                                            N_VACANCIES - 1)

                                                                            return 2

                                                                            elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                            N_VOTERS gt 05)

                                                                            return 1

                                                                            else

                                                                            selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                                            CANDIDATE_INDEX])

                                                                            for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                                            elecCANDIDATE_INDEX]]

                                                                            if voter_index in selfrankings_changed

                                                                            for candidate in reversed(selfrankings_changed[voter_index

                                                                            ])

                                                                            if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                            excluded

                                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                            ]] += 1

                                                                            selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                            add(voter_index)

                                                                            break

                                                                            else

                                                                            continue

                                                                            else

                                                                            for candidate in reversed(selfelecsorted_voters[

                                                                            voter_index])

                                                                            if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                            excluded

                                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                            ]] += 1

                                                                            selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                            add(voter_index)

                                                                            break

                                                                            else

                                                                            continue

                                                                            selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                            return 0

                                                                            76

                                                                            APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                                            Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                                            for index in range(selfelecN_CANDIDATES)

                                                                            selfcandidates[index] = 0

                                                                            for voter in selfelecsorted_voters

                                                                            for candidate in reversed(voter)

                                                                            if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                            else

                                                                            break

                                                                            APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                                            Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                                            for index in range(selfelecN_CANDIDATES)

                                                                            selfcandidates[index] = 0

                                                                            for voter in selfelecsorted_voters

                                                                            if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                            elecCANDIDATE_INDEX]]

                                                                            selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                                            else

                                                                            for candidate in reversed(voter)

                                                                            if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                            else

                                                                            break

                                                                            77

                                                                            APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                                            Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                                            pos = set()

                                                                            for index perc in enumerate(selfelectactical_vote_percentages)

                                                                            if perc gt 0

                                                                            posadd(index)

                                                                            for candidate in selfeleccandidates

                                                                            if candidate not in selfleading_candidates

                                                                            for voter_index in selfvotes[candidate]

                                                                            raised = None

                                                                            for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                                            ])

                                                                            if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                                            leading_candidates

                                                                            if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                                            if randomrandom() lt selfelectactical_vote_percentages[

                                                                            candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                                            ranking = [None]selfelecN_CANDIDATES

                                                                            ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                            selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                            CANDIDATE_INDEX]])

                                                                            raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                            break

                                                                            break

                                                                            break

                                                                            if raised = None

                                                                            for _candidate in selfleading_candidates

                                                                            if _candidate = ranking[-1][0]

                                                                            ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                            _candidate])

                                                                            buried = _candidate

                                                                            break

                                                                            i = 1

                                                                            for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                            if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                                            buried]

                                                                            continue

                                                                            else

                                                                            ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                            selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                            CANDIDATE_INDEX]])

                                                                            i += 1

                                                                            selfrankings_changed[voter_index] = ranking

                                                                            78

                                                                            APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                                            Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                                            for voter_index in selfvotes[candidate]

                                                                            if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                                            ]

                                                                            for _candidate in selfleading_candidates

                                                                            if _candidate = candidate

                                                                            ranking = [None]selfelecN_CANDIDATES

                                                                            ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                            _candidate])

                                                                            buried = _candidate

                                                                            break

                                                                            i = 1

                                                                            for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                            if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                                            continue

                                                                            else

                                                                            ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                            selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                            CANDIDATE_INDEX]])

                                                                            i += 1

                                                                            selfrankings_changed[voter_index] = ranking

                                                                            79

                                                                            APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                                            Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                                            for index in range(selfelecN_CANDIDATES)

                                                                            selfcandidates[index] = 0

                                                                            for voter_index voter in enumerate(selfelecsorted_voters)

                                                                            score = 0

                                                                            if voter_index in selfrankings_changed

                                                                            for candidate in selfrankings_changed[voter_index]

                                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                            score += 1

                                                                            else

                                                                            for candidate in voter

                                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                            score += 1

                                                                            APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                                            Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                                            for voter_index voter in enumerate(selfelecsorted_voters)

                                                                            if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                            elecCANDIDATE_INDEX]]

                                                                            selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                                            sorted_voters[voter_index])

                                                                            for candidate_index candidate in enumerate(reversed(voter))

                                                                            if candidate_index == 0

                                                                            selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                            voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                                            else

                                                                            selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                            voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                                            80

                                                                            APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                                            Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                                            for index in range(selfelecN_CANDIDATES)

                                                                            selfcandidates[index] = 0

                                                                            for voter_index voter in enumerate(selfelecsorted_voters)

                                                                            if voter_index in selfrankings_changed

                                                                            for candidate in selfrankings_changed[voter_index]

                                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                            selfelecCANDIDATE_RANK]

                                                                            else

                                                                            for candidate in voter

                                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                            selfelecCANDIDATE_RANK]

                                                                            APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                                            Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                                            for index in range(selfelecN_CANDIDATES)

                                                                            selfcandidates[index] = 0

                                                                            for voter in selfelecsorted_voters

                                                                            votes = selfelecN_VACANCIES

                                                                            for candidate in reversed(voter)

                                                                            if votes == 0

                                                                            break

                                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                            votes -= 1

                                                                            • Folha de aprovaccedilatildeo
                                                                            • Agradecimentos
                                                                            • Epiacutegrafe
                                                                            • Resumo
                                                                            • Abstract
                                                                            • Lista de ilustraccedilotildees
                                                                            • Lista de Coacutedigos
                                                                            • Lista de tabelas
                                                                            • Lista de abreviaturas e siglas
                                                                            • Sumaacuterio
                                                                            • INTRODUCcedilAtildeO
                                                                              • MOTIVACcedilAtildeO E OBJETIVO
                                                                              • MEacuteTODO
                                                                              • ESTRUTURA
                                                                                • SISTEMAS ELEITORAIS
                                                                                  • FISRT PAST THE POST
                                                                                    • Exemplo
                                                                                    • Vantagens e Desvantagens do FPTP
                                                                                    • Voto Uacutetil no FPTP
                                                                                      • TWO-ROUND SYSTEM
                                                                                        • Exemplo
                                                                                        • Vantagens e Desvantagens do TRS
                                                                                        • Voto Uacutetil no TRS
                                                                                          • INSTANT-RUNOFF VOTING
                                                                                            • Exemplo
                                                                                            • Vantagens e Desvantagens do IRV
                                                                                            • Voto Uacutetil no IRV
                                                                                              • APPROVAL VOTING SYSTEM
                                                                                                • Exemplo
                                                                                                • Vantagens e Desvantagens do AVS
                                                                                                • Voto Uacutetil no AVS
                                                                                                  • THE BORDA COUNT
                                                                                                    • Exemplo
                                                                                                    • Vantagens e Desvantagens do BC
                                                                                                    • Voto Uacutetil no BC
                                                                                                      • SCORE VOTING SYSTEM
                                                                                                        • Exemplo
                                                                                                        • Vantagens e Desvantagens do SVS
                                                                                                        • Voto Uacutetil no SVS
                                                                                                          • BLOC VOTE
                                                                                                            • Exemplo
                                                                                                            • Voto Uacutetil no BV
                                                                                                                • O SIMULADOR
                                                                                                                • CENAacuteRIOS PERTINENTES
                                                                                                                  • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                                  • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                                  • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                                  • CENAacuteRIO 4 COALIZOtildeES
                                                                                                                  • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                                  • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                                    • COMO FUNCIONA O SIMULADOR
                                                                                                                      • CLASSE Elections
                                                                                                                      • CLASSE FirstPastThePost
                                                                                                                      • CLASSE TwoRoundSystem
                                                                                                                      • CLASSE InstantRunoffVoting
                                                                                                                      • CLASSE ApprovalVoting
                                                                                                                      • CLASSE BordaCount
                                                                                                                      • CLASSE ScoreVoting
                                                                                                                      • CLASSE BlocVote
                                                                                                                      • TECNOLOGIAS UTILIZADAS
                                                                                                                        • CONCLUSAtildeO
                                                                                                                        • Referecircncias
                                                                                                                        • Meacutetodo create_voters
                                                                                                                        • Meacutetodo create_candidates
                                                                                                                        • Meacutetodo calculate_means
                                                                                                                        • Meacutetodo get_mean
                                                                                                                        • Meacutetodo calculate_mean
                                                                                                                        • Meacutetodo set_leading_candidates
                                                                                                                        • Meacutetodo irv_set_leading_candidates
                                                                                                                        • Meacutetodo sort_ranks
                                                                                                                        • Meacutetodo fptp_count_tactical_votes
                                                                                                                        • Meacutetodo fptp_count_minority_votes
                                                                                                                        • Meacutetodo trs_second_round
                                                                                                                        • Meacutetodo trs_account_for_coalitions
                                                                                                                        • Meacutetodo irv_count_votes
                                                                                                                        • Meacutetodo avs_count_votes
                                                                                                                        • Meacutetodo avs_count_votes_with_tactical
                                                                                                                        • Meacutetodo irv_apply_tactical_votes
                                                                                                                        • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                                        • Meacutetodo bc_sum_candidates_scores
                                                                                                                        • Meacutetodo svs_apply_tactical_votes
                                                                                                                        • Meacutetodo svs_sum_candidates_scores
                                                                                                                        • Meacutetodo bv_count_votes

                                                                              39

                                                                              Figura 21 ndash AVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                                              Figura 22 ndash BC - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                                              Figura 23 ndash SVS - Cenaacuterio 1 20 de voto taacutetico na Ana

                                                                              40

                                                                              Eacute claro que se os eleitores que preferem o Beto tambeacutem votassem de maneira estra-teacutegica a situaccedilatildeo se equilibraria e haveria o mesmo niacutevel de concorrecircncia entre os doiscandidatos que ocorre quando natildeo haacute voto taacutetico Poreacutem no Borda Count esse equiliacute-brio pode natildeo acontecer e as estrateacutegias de compromising e burying podem acabar saindopela culatra se uma porcentagem elevada dos eleitores as adotarem Abaixo encontram-seos resultados para esse sistema quando 100 dos eleitores de Carla e Diego se comportammaliciosamente

                                                                              Figura 24 ndash BC - Cenaacuterio 1 100 de voto taacutetico na Ana e Beto

                                                                              Por causa do uso demasiado da estrateacutegia burying Ana e Beto perdem muitos pontose isso abre espaccedilo para uma vitoacuteria da Carla No entanto para porcentagens menores que100 o Beto ainda eacute o vencedor

                                                                              Essas duas estrateacutegias tambeacutem foram implementadas nesse simulador para o sistemaIRV e eacute possiacutevel ver como ele eacute resistente a elas Para que seja possiacutevel mudar os resultadosde uma eleiccedilatildeo sob o IRV eacute necessaacuterio mudar a ordem de eliminaccedilatildeo dos candidatos paraque o seu candidato preferido acabe enfrentando um candidato mais fraco nas rodadasfinais Isso natildeo ocorre com compromising e burying No proacuteximo cenaacuterio seraacute analisadacomo eacute possiacutevel modificar os resultados de uma eleiccedilatildeo sob o IRV

                                                                              Esses resultados podem ser replicados acessando os linksSem votos taacuteticos lthttpelectionsimpythonanywherecomdirect_res1111110

                                                                              --[0021][22Ana2222Beto222022Carla2222Diego22]------100gt

                                                                              Com 20 de voto taacutetico lthttpelectionsimpythonanywherecomdirect_res1111110--[0021][22Ana222022Beto2222Carla2222Diego22]1-[02000]---100gt

                                                                              Com 100 de voto taacuteticona Ana e Beto lthttpelectionsimpythonanywherecomdirect_res0000100--[0021][22Ana222022Beto222022Carla2222Diego22]1-[101000]---100gt

                                                                              41

                                                                              42 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV

                                                                              Neste cenaacuterio teremos Ana Carla e Beto concorrendo e trecircs perfis distintos que apoiamcada candidato As distribuiccedilotildees de notas dos perfis se encontram na tabela abaixo

                                                                              Tabela 12 ndash Distribuiccedilatildeo de notas - Cenaacuterio 2

                                                                              Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                                              deeleitores

                                                                              1 10 5 0 422 0 10 5 303 5 0 10 28

                                                                              Com essas distribuiccedilotildees Carla eacute eliminada na primeira rodada e seus 28 de votossatildeo transferidos para a segunda opccedilatildeo de seus eleitores Ana que eacute eleita com 70 dosvotos e uma meacutedia de 56

                                                                              Figura 25 ndash IRV primeiro turno - Cenaacuterio 2

                                                                              Figura 26 ndash IRV segundo turno - Cenaacuterio 2

                                                                              42

                                                                              Cientes desse provaacutevel futuro cenaacuterio onde Ana eacute eleita uma pequena parte dos elei-tores de Beto estrategicamente o abandona e decide apoiar Carla na esperanccedila de leva-laao segundo turno contra Ana As novas distribuiccedilotildees de notas se encontram na tabelaabaixo com essa porccedilatildeo de eleitores representada pelo perfil 4

                                                                              Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2

                                                                              Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                                              deeleitores

                                                                              1 10 5 0 422 0 10 5 283 5 0 10 284 0 8 10 2

                                                                              Essa mudanccedila estrateacutegica de voto altera a ordem de eliminaccedilotildees do sistema com Betosendo o primeiro a ser eliminado Com isso seus votos satildeo naturalmente transferidos paraCarla que derrota Ana no segundo turno com 58 dos votos

                                                                              Figura 27 ndash IRV primeiro turno com voto taacutetico - Cenaacuterio 2

                                                                              Figura 28 ndash IRV segundo turno com voto taacutetico - Cenaacuterio 2

                                                                              43

                                                                              Percebendo que a eleiccedilatildeo de Beto natildeo era provaacutevel seus eleitores conseguiram aomenos impedir a eleiccedilatildeo do pior candidato para eles Mas para isso foi necessaacuterio queeles tivessem a informaccedilatildeo de como os outros eleitores votariam Uma aproximaccedilatildeo dessasinformaccedilotildees poderia ser obtida em um cenaacuterio real com poucos candidatos atraveacutes depesquisas eleitorais poreacutem se o nuacutemero de candidatos eacute significativo uma noccedilatildeo completadas distribuiccedilotildees dos rankings dos eleitores se torna muito menos viaacutevel e dificulta aformulaccedilatildeo de estrateacutegias para alterar a ordem em que os candidatos satildeo eliminados

                                                                              Esses resultados podem ser replicados acessando os linksSem voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana22

                                                                              22Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                                              Com voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana

                                                                              2222Beto2222Carla22]-----42Voter20Profile2001020520028Voter20Profile2010201020528Voter20Profile202520020102Voter20Profile20302082010100gt

                                                                              43 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE

                                                                              O interessante dos sistemas IRV e TRS eacute que os resultados do cenaacuterio anterior po-deriam ter sido obtidos ao inveacutes do voto taacutetico pela sua natildeo-monotonicidade Seriapossiacutevel que a Carla derrotasse a Ana no segundo turno atraveacutes do proacuteprio aumento depopularidade da Ana Assumindo que essa popularizaccedilatildeo ocorresse entre os candidatosdo perfil 2 onde 3 passasse a apoiar a Ana ao inveacutes do Beto as novas distribuiccedilotildeesseguiriam a tabela abaixo

                                                                              Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                                              Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                                              deeleitores

                                                                              1 10 5 0 452 0 10 5 273 5 0 10 28

                                                                              Dessa maneira Beto agora com uma porcentagem dos eleitores menor do que a deCarla seraacute eliminado na primeira rodada e como seus eleitores tecircm a Carla como segundaopccedilatildeo ela receberaacute todos os seus votos e seraacute eleita na segunda rodada As rodadas doIRV podem ser vistas nas figuras 29 e 30

                                                                              44

                                                                              Figura 29 ndash IRV primeiro turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                                              Figura 30 ndash IRV segundo turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                                              Tabela 15 ndash Resultados do Cenaacuterio 3Candidato

                                                                              eleitoMeacutedia das

                                                                              notasAntes da

                                                                              popularizaccedilatildeode Ana

                                                                              Ana 56

                                                                              Apoacutespopularizaccedilatildeo

                                                                              de AnaCarla 415

                                                                              Os efeitos dessa caracteriacutestica se refletem na satisfaccedilatildeo meacutedia da populaccedilatildeo A Ana eacuteclaramente a melhor candidata e mesmo com o seu ganho de popularidade (ou devido aele) a Carla eacute eleita

                                                                              Esses resultados podem ser replicados acessando os linksAntes da popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecom

                                                                              direct_res0010000---[22Ana2222Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                                              45

                                                                              Apoacutes popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana2222Beto2222Carla22]-----45Voter20Profile2001020520027Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                                              44 CENAacuteRIO 4 COALIZOtildeES

                                                                              O TRS por ser organizado em dois turnos separados normalmente a semanas dedistacircncia um do outro acaba abrindo brecha agrave mudanccedila de opiniatildeo por parte dos eleitorese o desenvolvimento de novas estrateacutegias por parte dos candidatos tais como a coalizatildeocom candidatos jaacute eliminados Com isso em mente nesse cenaacuterio teremos novamenteos quatro candidatos Ana Beto Carla e Diego Os trecircs primeiros seratildeo gerados dadistribuiccedilatildeo Neutral e Diego da distribuiccedilatildeo Disliked

                                                                              Figura 31 ndash TRS turno 1 - Cenaacuterio 4

                                                                              No TRS normal Ana Beto e Carla possuem com essas distribuiccedilotildees quantidades devotos muito proacuteximas com Beto e Carla indo para o segundo turno Carla estaacute 10 votosatraacutes de Beto e decide aproveitar o espaccedilo de tempo entre os dois turnos para tentaragregar mais votos Com isso Carla se aproxima de Diego e juntos formam uma coalizatildeoNo entanto com sua baixa popularidade Diego acaba ferindo a reputaccedilatildeo de Carla etorna o segundo turno muito mais faacutecil para Beto (Figura 33) Se Carla tivesse buscado osuporte de Ana por outro lado ela se veria vitoriosa no segundo turno e com uma amplavantagem sobre o Beto (Figura 34) Ou ateacute mesmo sem buscar uma coalizatildeo mesmosendo uma corrida apertada Carla teria naturalmente sido eleita (Figura 32)

                                                                              Esses resultados podem ser replicados acessando os linksSem coalizotildees lthttpelectionsimpythonanywherecomdirect_res0100000

                                                                              --[0002][22Ana222022Beto2222Carla2222Diego22]------100gt

                                                                              46

                                                                              Figura 32 ndash TRS turno 2 - Cenaacuterio 4

                                                                              Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4

                                                                              Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4

                                                                              47

                                                                              Coalizatildeo Carla e Diego lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2203Carla20Diego-100gt

                                                                              Coalizatildeo Carla e Ana lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2200Carla20Ana-100gt

                                                                              45 CENAacuteRIO 5 DILEMA DO PRISIONEIRO

                                                                              Neste cenaacuterio temos uma eleiccedilatildeo de uma vaga com trecircs candidatos concorrentes e trecircsperfis distintos de eleitores que seguiratildeo as seguintes distribuiccedilotildees

                                                                              Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5

                                                                              Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                                              deeleitores

                                                                              1 10 -10 5 362 -10 10 5 343 -10 -10 5 30

                                                                              Esse contexto nos remete ao notaacutevel dilema do prisioneiro Nele dois prisioneiroscuacutemplices satildeo interrogados individualmente sem poder se comunicar um com o outro ecada um enfrenta o dilema de delatar ou natildeo o seu parceiro Se os dois prisioneirosdecidem se manter calados sobre o crime ambos satildeo sentenciados a um ano de prisatildeo Seapenas um deles dedurar o outro o traidor sai livre enquanto seu parceiro eacute condenadoa trecircs anos Se ambos dedurarem um ao outro eles satildeo condenados juntos a dois anosde prisatildeo Esse dilema eacute uma ideia claacutessica presente no estudo da teoria dos jogos sendooriginalmente elaborada por Merrill Flood e Melvin Dresher em 1950 e mais tarde sendonomeada de dilema dos prisioneiros por Albert W Tucker (POUNDSTONE 1992)

                                                                              O que esse dilema nos mostra eacute a tentaccedilatildeo que o indiviacuteduo deteacutem se sua racionalizaccedilatildeoestiver voltada para seus proacuteprios interesses e somente eles em oposiccedilatildeo a pensar no bemdo grupo como um todo Neste cenaacuterio encontramos dois grupos de eleitores expressiva-mente opostos os perfis 1 e 2 Se qualquer uma das preferecircncias desses perfis fosse eleitaisso significaria uma alta rejeiccedilatildeo de maior parte da populaccedilatildeo No entanto eles possuema segunda opccedilatildeo em comum a Carla que por sua vez eacute a preferecircncia do terceiro perfilPortanto a eleiccedilatildeo da Carla seria logicamente o resultado oacutetimo

                                                                              Mesmo assim a Ana eacute eleita nos dois sistemas acima o que natildeo parece justo poispela tabela 16 eacute evidente que apenas 36 da populaccedilatildeo a aprova enquanto que os outros64 a reprovam ao maacuteximo O sistema IRV se comporta de maneira idecircntica ao TRS

                                                                              48

                                                                              Figura 35 ndash FPTP - Cenaacuterio 5

                                                                              Figura 36 ndash TRS segundo turno - Cenaacuterio 5

                                                                              nesta situaccedilatildeo Com esse resultado a meacutedia das notas eacute -28 No entanto os trecircs sistemasseguintes nos apresentam resultados diferentes

                                                                              Tabela 17 ndash Resultados do Cenaacuterio 5

                                                                              Sistema Candidatoeleito

                                                                              Meacutedia dasnotas

                                                                              FPTP Ana -28TRS Ana -28IRV Ana -28AVS Carla 50BC Carla 50SVS Carla 50

                                                                              49

                                                                              Figura 37 ndash AVS - Cenaacuterio 5

                                                                              Figura 38 ndash BC - Cenaacuterio 5

                                                                              Tanto o AVS quanto o Borda Count e o SVS satildeo sistemas que consideram todasas opiniotildees de cada eleitor ao mesmo tempo e por isso satildeo capazes de eleger o melhorcandidato nesta situaccedilatildeo diferentemente do TRS que natildeo absorve completamente todosentimento do eleitor por todos os candidatos e o IRV que apesar de ser bem expressivoquebra esse processo em inuacutemeras rodadas o que permite a perda de informaccedilatildeo ao longodelas

                                                                              Esses resultados podem ser replicados acessando o linklthttpelectionsimpythonanywherecomdirect_res1111110---[22Ana

                                                                              222022Beto222022Carla22]-----36Voter20Profile2001020-1020534Voter20Profile201-10201020530Voter20Profile202-1020-10205100gt

                                                                              50

                                                                              Figura 39 ndash SVS - Cenaacuterio 5

                                                                              46 CENAacuteRIO 6 VOTO DE MINORIA

                                                                              Neste cenaacuterio temos uma eleiccedilatildeo com quatro candidatos e duas vagas A Ana seraacutea preferecircncia de uma extensa parte da populaccedilatildeo (distribuiccedilatildeo Loved Figura 53) Betoe Carla seratildeo candidatos razoavelmente populares (distribuiccedilatildeo Neutral Figura 47) eDiego seraacute a preferecircncia de apenas um pequeno grupo especiacutefico e rejeitado pela maioria(distribuiccedilatildeo Disliked Figura 51) Eacute intuitivo esperar que os dois candidatos eleitos seratildeoa Ana e ou o Beto ou a Carla e isso eacute exatamente o que ocorre na figura 40 no sistemaFPTP sem voto de minoria

                                                                              Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria

                                                                              Eacute evidente a discrepacircncia da quantidade de votos da Ana para os outros candidatose apesar de Beto e Carla serem mais populares que Diego os trecircs natildeo se encontrammuito afastados Poreacutem se a pequena fraccedilatildeo de candidatos que possuem a Ana como

                                                                              51

                                                                              Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego

                                                                              preferecircncia e Diego como segunda opccedilatildeo optarem pelo voto de minoria a situaccedilatildeo mudacompletamente (Figura 41) Assim apesar de extensamente rejeitado Diego conquistaa segunda vaga e a meacutedia das notas despenca de 2929 para 0505 No entanto aindaexiste um cenaacuterio pior Se os outros grupos de eleitores pensarem da mesma forma eevitarem votar na Ana achando que sua eleiccedilatildeo jaacute estaacute assegurada apenas 80 de votode minoria para esses grupos jaacute eacute o suficiente para eliminaacute-la das eleiccedilotildees (Figura 42)Com a Ana eliminada a meacutedia das notas cai ainda mais para 0058

                                                                              Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego

                                                                              O sistema Bloc Vote eacute uma das soluccedilotildees para o voto de minoria Permitindo queos eleitores votem no mesmo nuacutemero de candidatos que de vagas a serem preenchidasnatildeo existe o iacutempeto a esse tipo de voto estrateacutegico O resultado desse sistema portantoretorna a meacutedia das notas a casa dos 29 (Figura 43) Os sistemas AVS Borda Count eSVS tambeacutem impedem a presenccedila do voto de minoria e atingem resultados semelhantes

                                                                              52

                                                                              Figura 43 ndash BV - Cenaacuterio 6

                                                                              Tabela 18 ndash Resultados do Cenaacuterio 6

                                                                              Sistema Candidatoseleitos

                                                                              Meacutedia dasnotas

                                                                              FPTP sem voto de minoriaAna eBeto 2929

                                                                              FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

                                                                              FPTP com 80 de voto de minoriaBeto eCarla 0058

                                                                              Bloc VoteAna eCarla 2913

                                                                              Esses resultados podem ser replicados acessando os links

                                                                              Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

                                                                              100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

                                                                              80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

                                                                              53

                                                                              5 COMO FUNCIONA O SIMULADOR

                                                                              O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

                                                                              51 CLASSE ELECTIONS

                                                                              Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

                                                                              bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

                                                                              Figura 44 ndash estrutura candidates

                                                                              bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

                                                                              bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

                                                                              Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

                                                                              Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

                                                                              54

                                                                              Figura 45 ndash estrutura voters

                                                                              Figura 46 ndash estrutura votes

                                                                              daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

                                                                              Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

                                                                              55

                                                                              Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

                                                                              Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

                                                                              na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

                                                                              56

                                                                              Figura 49 ndash PDF - Distribuiccedilatildeo Liked

                                                                              Figura 50 ndash CDF - Distribuiccedilatildeo Liked

                                                                              (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

                                                                              Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

                                                                              57

                                                                              Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

                                                                              Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

                                                                              candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

                                                                              Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

                                                                              58

                                                                              Figura 53 ndash PDF - Distribuiccedilatildeo Loved

                                                                              Figura 54 ndash CDF - Distribuiccedilatildeo Loved

                                                                              funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

                                                                              59

                                                                              Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                                                                              Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                                                                              Meacutedia das Notas sumei

                                                                              sumvj nij

                                                                              etimes v

                                                                              Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                                                                              Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                                                                              60

                                                                              Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                                                                              Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                                                                              52 CLASSE FIRSTPASTTHEPOST

                                                                              Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                                                                              Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                                                                              61

                                                                              Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                                                                              Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                                                                              mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                                                                              62

                                                                              53 CLASSE TWOROUNDSYSTEM

                                                                              A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                                                                              54 CLASSE INSTANTRUNOFFVOTING

                                                                              A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                                                                              Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                                                                              63

                                                                              cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                                                                              55 CLASSE APPROVALVOTING

                                                                              Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                                                                              56 CLASSE BORDACOUNT

                                                                              Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                                                                              57 CLASSE SCOREVOTING

                                                                              De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                                                                              64

                                                                              58 CLASSE BLOCVOTE

                                                                              O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                                                                              59 TECNOLOGIAS UTILIZADAS

                                                                              A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                                                                              Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                                                                              O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                                                                              Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                                                                              65

                                                                              6 CONCLUSAtildeO

                                                                              Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                                                                              Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                                                                              Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                                                                              Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                                                                              Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                                                                              66

                                                                              REFEREcircNCIAS

                                                                              AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                                                                              Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                                                                              Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                                                                              Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                                                                              HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                                                                              LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                                                                              ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                                                                              Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                                                                              POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                                                                              The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                                                                              67

                                                                              APEcircNDICES

                                                                              APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                                                              Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                                                              if(not len(selfvoter_profiles))

                                                                              for voter in range(selfN_VOTERS)

                                                                              candidates_rank = dict()

                                                                              for candidate in reversed(range(selfN_CANDIDATES))

                                                                              if(selfBIAS_VECTOR[candidate]==4)

                                                                              candidates_rank[candidate] = self_sortear(selfloved)

                                                                              elif(selfBIAS_VECTOR[candidate]==3)

                                                                              candidates_rank[candidate] = self_sortear(selfliked)

                                                                              elif(selfBIAS_VECTOR[candidate]==2)

                                                                              candidates_rank[candidate] = self_sortear(selfdisliked)

                                                                              elif(selfBIAS_VECTOR[candidate]==1)

                                                                              candidates_rank[candidate] = self_sortear(selfhated)

                                                                              elif(selfBIAS_VECTOR[candidate]==-1)

                                                                              candidates_rank[candidate] = self_sortear(selfpolarizer

                                                                              )

                                                                              elif(selfBIAS_VECTOR[candidate]==-2)

                                                                              candidates_rank[candidate] = self_sortear(self

                                                                              more_polarizer)

                                                                              else

                                                                              candidates_rank[candidate] = self_sortear(selfneutral)

                                                                              selfvotersappend(candidates_rank)

                                                                              else

                                                                              ranges = []

                                                                              ranks = []

                                                                              for prof in selfvoter_profiles

                                                                              rangesappend(int(prof[pop_percentage]))

                                                                              rank =

                                                                              for index score in enumerate(prof[scores])

                                                                              rank[index] = score

                                                                              ranksappend(rank)

                                                                              for index _range in enumerate(ranges)

                                                                              for _ in range(int(selfN_VOTERS(_range100)))

                                                                              selfvotersappend(ranks[index])

                                                                              68

                                                                              APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                                                              Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                                                              for i in range(selfN_CANDIDATES)

                                                                              selfcandidates[i] = 0

                                                                              selfvotes[i] = set()

                                                                              APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                                                              Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                                                              for candidate in range(selfN_CANDIDATES)

                                                                              rating_sum = 0

                                                                              for voter in selfvoters

                                                                              rating_sum += voter[candidate]

                                                                              selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                                                              APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                                                              Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                                                              if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                                                              return selfcalculate_mean(winners)

                                                                              else

                                                                              chose_best = True if winners[0] == selfbest_candidate else

                                                                              False

                                                                              return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                                                              69

                                                                              APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                                                              Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                                                              rating_sum = 0

                                                                              for voter in selfvoters

                                                                              for candidate in winners

                                                                              rating_sum += voter[candidate]

                                                                              return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                                                              APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                                                              Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                                                              for i in range(1 selfN_VACANCIES + 2)

                                                                              selfleading_candidatesappend(selfsorted_candidates[-i][self

                                                                              CANDIDATE_INDEX])

                                                                              APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                                                              Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                                                              for leader in selfelecrounds[-1]

                                                                              selfleading_candidatesappend(leader[0])

                                                                              70

                                                                              APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                                                              Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                                                              self_account_for_coalitions()

                                                                              for voter in selfvoters

                                                                              selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                                                              (1)))

                                                                              temp = []

                                                                              for voter in selfsorted_voters

                                                                              new_dict = defaultdict(list)

                                                                              for k in voter

                                                                              new_dict[k[1]]append(k[0])

                                                                              tempappend(new_dict)

                                                                              selfsorted_voters = []

                                                                              for voter_index current_voter in enumerate(temp)

                                                                              new_voter = []

                                                                              for rating candidate_indexes in current_voteritems()

                                                                              if len(current_voter[rating]) gt 1

                                                                              shuffle(current_voter[rating])

                                                                              for e in candidate_indexes

                                                                              new_voterappend((e rating))

                                                                              else

                                                                              new_voterappend((candidate_indexes[0] rating))

                                                                              selfsorted_votersappend(new_voter)

                                                                              selfcandidates[new_voter[-1][0]] += 1

                                                                              selfvotes[new_voter[-1][0]]add(voter_index)

                                                                              71

                                                                              APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                                                              Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                                                              for candidate in selfvotes_copy

                                                                              if candidate not in selfelecleading_candidates

                                                                              for voter_index in selfvotes_copy[candidate]

                                                                              for index _candidate in enumerate(reversed(selfelec

                                                                              sorted_voters[voter_index]))

                                                                              if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                                                              leading_candidates

                                                                              if randomrandom() lt selfelec

                                                                              tactical_vote_percentages[_candidate[selfelec

                                                                              CANDIDATE_INDEX]]

                                                                              selfrankings_changed[voter_index] = copy

                                                                              deepcopy(selfelecsorted_voters[voter_index])

                                                                              selfrankings_changed[voter_index][-(index + 1)]

                                                                              selfrankings_changed[voter_index][-1] = self

                                                                              rankings_changed[voter_index][-1] self

                                                                              rankings_changed[voter_index][-(index + 1)]

                                                                              selfcandidates[candidate] -= 1

                                                                              selfcandidates[_candidate[selfelec

                                                                              CANDIDATE_INDEX]] += 1

                                                                              selfvotes[candidate]remove(voter_index)

                                                                              selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                                                              ]]add(voter_index)

                                                                              break

                                                                              break

                                                                              72

                                                                              APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                                                              Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                                                              half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                                                              for candidate in selfelecleading_candidates

                                                                              if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                                                              continue

                                                                              for voter_index in selfvotes_copy[candidate]

                                                                              if voter_index in selfrankings_changed

                                                                              ranking = selfrankings_changed[voter_index]

                                                                              else

                                                                              ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                                                              ])

                                                                              for index _candidate in enumerate(reversed(ranking))

                                                                              if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                              leading_candidates or (_candidate[selfelec

                                                                              CANDIDATE_INDEX] in selfelecleading_candidates and

                                                                              selfelecleading_candidatesindex(_candidate[selfelec

                                                                              CANDIDATE_INDEX]) gt= half_vacancies)

                                                                              if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                                                              if randomrandom() lt selfelec

                                                                              minority_vote_percentages[_candidate[selfelec

                                                                              CANDIDATE_INDEX]]

                                                                              selfcandidates[candidate] -= 1

                                                                              selfcandidates[_candidate[selfelec

                                                                              CANDIDATE_INDEX]] += 1

                                                                              break

                                                                              break

                                                                              break

                                                                              73

                                                                              APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                                                              Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                                                              self_account_for_coalitions()

                                                                              for candidate in selfvotes

                                                                              if candidate = selfwinner and candidate = selfsecond_place

                                                                              for voter_index in selfvotes[candidate]

                                                                              if voter_index in selfrankings_changed

                                                                              ranking = selfrankings_changed[voter_index]

                                                                              else

                                                                              ranking = copydeepcopy(selfelecsorted_voters[

                                                                              voter_index])

                                                                              for index2 candidate in enumerate(reversed(ranking))

                                                                              if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                                                              selfcandidates[selfwinner] += 1

                                                                              selfvotes[selfwinner]add(voter_index)

                                                                              break

                                                                              elif candidate[selfelecCANDIDATE_INDEX] == self

                                                                              second_place

                                                                              selfcandidates[selfsecond_place] += 1

                                                                              selfvotes[selfsecond_place]add(voter_index)

                                                                              break

                                                                              selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                              winners = []

                                                                              vacancies = selfelecN_VACANCIES

                                                                              for candidate in reversed(selfsorted_candidates)

                                                                              if vacancies == 0

                                                                              break

                                                                              winnersappend(candidate[0])

                                                                              vacancies -= 1

                                                                              mean chose_best = selfelecget_mean(winners = winners)

                                                                              74

                                                                              APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                                                              Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                                                              for voter_index voter in enumerate(selfelecsorted_voters)

                                                                              voter_dict = dict()

                                                                              og_voter_dict = dict()

                                                                              for tup in voter

                                                                              voter_dict[tup[0]] = tup[1]

                                                                              og_voter_dict[tup[0]] = tup[1]

                                                                              for coalition in selfeleccoalitions

                                                                              for candidate in coalition

                                                                              add_to_score = 0

                                                                              for candidate2 in coalition

                                                                              if candidate == candidate2

                                                                              continue

                                                                              half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                                                              if half lt 0

                                                                              add_to_score += mathceil(half)

                                                                              else

                                                                              add_to_score += mathfloor(half)

                                                                              if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                                                              voter_dict[candidate[rsquovaluersquo]] = 10

                                                                              elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                                                              voter_dict[candidate[rsquovaluersquo]] = -10

                                                                              else

                                                                              voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                                                              selfrankings_changed[voter_index] = []

                                                                              for candidate in voter_dict

                                                                              selfrankings_changed[voter_index]append((candidate voter_dict[

                                                                              candidate]))

                                                                              selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                                                              voter_index] key=lambda x x[1])

                                                                              75

                                                                              APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                                              Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                                              selfelecroundsappend(selfsorted_candidates[_round])

                                                                              if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                              N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                                              N_VACANCIES - 1)

                                                                              return 2

                                                                              elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                              N_VOTERS gt 05)

                                                                              return 1

                                                                              else

                                                                              selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                                              CANDIDATE_INDEX])

                                                                              for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                                              elecCANDIDATE_INDEX]]

                                                                              if voter_index in selfrankings_changed

                                                                              for candidate in reversed(selfrankings_changed[voter_index

                                                                              ])

                                                                              if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                              excluded

                                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                              ]] += 1

                                                                              selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                              add(voter_index)

                                                                              break

                                                                              else

                                                                              continue

                                                                              else

                                                                              for candidate in reversed(selfelecsorted_voters[

                                                                              voter_index])

                                                                              if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                              excluded

                                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                              ]] += 1

                                                                              selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                              add(voter_index)

                                                                              break

                                                                              else

                                                                              continue

                                                                              selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                              return 0

                                                                              76

                                                                              APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                                              Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                                              for index in range(selfelecN_CANDIDATES)

                                                                              selfcandidates[index] = 0

                                                                              for voter in selfelecsorted_voters

                                                                              for candidate in reversed(voter)

                                                                              if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                              else

                                                                              break

                                                                              APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                                              Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                                              for index in range(selfelecN_CANDIDATES)

                                                                              selfcandidates[index] = 0

                                                                              for voter in selfelecsorted_voters

                                                                              if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                              elecCANDIDATE_INDEX]]

                                                                              selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                                              else

                                                                              for candidate in reversed(voter)

                                                                              if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                              else

                                                                              break

                                                                              77

                                                                              APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                                              Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                                              pos = set()

                                                                              for index perc in enumerate(selfelectactical_vote_percentages)

                                                                              if perc gt 0

                                                                              posadd(index)

                                                                              for candidate in selfeleccandidates

                                                                              if candidate not in selfleading_candidates

                                                                              for voter_index in selfvotes[candidate]

                                                                              raised = None

                                                                              for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                                              ])

                                                                              if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                                              leading_candidates

                                                                              if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                                              if randomrandom() lt selfelectactical_vote_percentages[

                                                                              candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                                              ranking = [None]selfelecN_CANDIDATES

                                                                              ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                              selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                              CANDIDATE_INDEX]])

                                                                              raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                              break

                                                                              break

                                                                              break

                                                                              if raised = None

                                                                              for _candidate in selfleading_candidates

                                                                              if _candidate = ranking[-1][0]

                                                                              ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                              _candidate])

                                                                              buried = _candidate

                                                                              break

                                                                              i = 1

                                                                              for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                              if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                                              buried]

                                                                              continue

                                                                              else

                                                                              ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                              selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                              CANDIDATE_INDEX]])

                                                                              i += 1

                                                                              selfrankings_changed[voter_index] = ranking

                                                                              78

                                                                              APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                                              Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                                              for voter_index in selfvotes[candidate]

                                                                              if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                                              ]

                                                                              for _candidate in selfleading_candidates

                                                                              if _candidate = candidate

                                                                              ranking = [None]selfelecN_CANDIDATES

                                                                              ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                              _candidate])

                                                                              buried = _candidate

                                                                              break

                                                                              i = 1

                                                                              for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                              if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                                              continue

                                                                              else

                                                                              ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                              selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                              CANDIDATE_INDEX]])

                                                                              i += 1

                                                                              selfrankings_changed[voter_index] = ranking

                                                                              79

                                                                              APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                                              Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                                              for index in range(selfelecN_CANDIDATES)

                                                                              selfcandidates[index] = 0

                                                                              for voter_index voter in enumerate(selfelecsorted_voters)

                                                                              score = 0

                                                                              if voter_index in selfrankings_changed

                                                                              for candidate in selfrankings_changed[voter_index]

                                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                              score += 1

                                                                              else

                                                                              for candidate in voter

                                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                              score += 1

                                                                              APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                                              Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                                              for voter_index voter in enumerate(selfelecsorted_voters)

                                                                              if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                              elecCANDIDATE_INDEX]]

                                                                              selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                                              sorted_voters[voter_index])

                                                                              for candidate_index candidate in enumerate(reversed(voter))

                                                                              if candidate_index == 0

                                                                              selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                              voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                                              else

                                                                              selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                              voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                                              80

                                                                              APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                                              Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                                              for index in range(selfelecN_CANDIDATES)

                                                                              selfcandidates[index] = 0

                                                                              for voter_index voter in enumerate(selfelecsorted_voters)

                                                                              if voter_index in selfrankings_changed

                                                                              for candidate in selfrankings_changed[voter_index]

                                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                              selfelecCANDIDATE_RANK]

                                                                              else

                                                                              for candidate in voter

                                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                              selfelecCANDIDATE_RANK]

                                                                              APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                                              Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                                              for index in range(selfelecN_CANDIDATES)

                                                                              selfcandidates[index] = 0

                                                                              for voter in selfelecsorted_voters

                                                                              votes = selfelecN_VACANCIES

                                                                              for candidate in reversed(voter)

                                                                              if votes == 0

                                                                              break

                                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                              votes -= 1

                                                                              • Folha de aprovaccedilatildeo
                                                                              • Agradecimentos
                                                                              • Epiacutegrafe
                                                                              • Resumo
                                                                              • Abstract
                                                                              • Lista de ilustraccedilotildees
                                                                              • Lista de Coacutedigos
                                                                              • Lista de tabelas
                                                                              • Lista de abreviaturas e siglas
                                                                              • Sumaacuterio
                                                                              • INTRODUCcedilAtildeO
                                                                                • MOTIVACcedilAtildeO E OBJETIVO
                                                                                • MEacuteTODO
                                                                                • ESTRUTURA
                                                                                  • SISTEMAS ELEITORAIS
                                                                                    • FISRT PAST THE POST
                                                                                      • Exemplo
                                                                                      • Vantagens e Desvantagens do FPTP
                                                                                      • Voto Uacutetil no FPTP
                                                                                        • TWO-ROUND SYSTEM
                                                                                          • Exemplo
                                                                                          • Vantagens e Desvantagens do TRS
                                                                                          • Voto Uacutetil no TRS
                                                                                            • INSTANT-RUNOFF VOTING
                                                                                              • Exemplo
                                                                                              • Vantagens e Desvantagens do IRV
                                                                                              • Voto Uacutetil no IRV
                                                                                                • APPROVAL VOTING SYSTEM
                                                                                                  • Exemplo
                                                                                                  • Vantagens e Desvantagens do AVS
                                                                                                  • Voto Uacutetil no AVS
                                                                                                    • THE BORDA COUNT
                                                                                                      • Exemplo
                                                                                                      • Vantagens e Desvantagens do BC
                                                                                                      • Voto Uacutetil no BC
                                                                                                        • SCORE VOTING SYSTEM
                                                                                                          • Exemplo
                                                                                                          • Vantagens e Desvantagens do SVS
                                                                                                          • Voto Uacutetil no SVS
                                                                                                            • BLOC VOTE
                                                                                                              • Exemplo
                                                                                                              • Voto Uacutetil no BV
                                                                                                                  • O SIMULADOR
                                                                                                                  • CENAacuteRIOS PERTINENTES
                                                                                                                    • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                                    • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                                    • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                                    • CENAacuteRIO 4 COALIZOtildeES
                                                                                                                    • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                                    • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                                      • COMO FUNCIONA O SIMULADOR
                                                                                                                        • CLASSE Elections
                                                                                                                        • CLASSE FirstPastThePost
                                                                                                                        • CLASSE TwoRoundSystem
                                                                                                                        • CLASSE InstantRunoffVoting
                                                                                                                        • CLASSE ApprovalVoting
                                                                                                                        • CLASSE BordaCount
                                                                                                                        • CLASSE ScoreVoting
                                                                                                                        • CLASSE BlocVote
                                                                                                                        • TECNOLOGIAS UTILIZADAS
                                                                                                                          • CONCLUSAtildeO
                                                                                                                          • Referecircncias
                                                                                                                          • Meacutetodo create_voters
                                                                                                                          • Meacutetodo create_candidates
                                                                                                                          • Meacutetodo calculate_means
                                                                                                                          • Meacutetodo get_mean
                                                                                                                          • Meacutetodo calculate_mean
                                                                                                                          • Meacutetodo set_leading_candidates
                                                                                                                          • Meacutetodo irv_set_leading_candidates
                                                                                                                          • Meacutetodo sort_ranks
                                                                                                                          • Meacutetodo fptp_count_tactical_votes
                                                                                                                          • Meacutetodo fptp_count_minority_votes
                                                                                                                          • Meacutetodo trs_second_round
                                                                                                                          • Meacutetodo trs_account_for_coalitions
                                                                                                                          • Meacutetodo irv_count_votes
                                                                                                                          • Meacutetodo avs_count_votes
                                                                                                                          • Meacutetodo avs_count_votes_with_tactical
                                                                                                                          • Meacutetodo irv_apply_tactical_votes
                                                                                                                          • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                                          • Meacutetodo bc_sum_candidates_scores
                                                                                                                          • Meacutetodo svs_apply_tactical_votes
                                                                                                                          • Meacutetodo svs_sum_candidates_scores
                                                                                                                          • Meacutetodo bv_count_votes

                                                                                40

                                                                                Eacute claro que se os eleitores que preferem o Beto tambeacutem votassem de maneira estra-teacutegica a situaccedilatildeo se equilibraria e haveria o mesmo niacutevel de concorrecircncia entre os doiscandidatos que ocorre quando natildeo haacute voto taacutetico Poreacutem no Borda Count esse equiliacute-brio pode natildeo acontecer e as estrateacutegias de compromising e burying podem acabar saindopela culatra se uma porcentagem elevada dos eleitores as adotarem Abaixo encontram-seos resultados para esse sistema quando 100 dos eleitores de Carla e Diego se comportammaliciosamente

                                                                                Figura 24 ndash BC - Cenaacuterio 1 100 de voto taacutetico na Ana e Beto

                                                                                Por causa do uso demasiado da estrateacutegia burying Ana e Beto perdem muitos pontose isso abre espaccedilo para uma vitoacuteria da Carla No entanto para porcentagens menores que100 o Beto ainda eacute o vencedor

                                                                                Essas duas estrateacutegias tambeacutem foram implementadas nesse simulador para o sistemaIRV e eacute possiacutevel ver como ele eacute resistente a elas Para que seja possiacutevel mudar os resultadosde uma eleiccedilatildeo sob o IRV eacute necessaacuterio mudar a ordem de eliminaccedilatildeo dos candidatos paraque o seu candidato preferido acabe enfrentando um candidato mais fraco nas rodadasfinais Isso natildeo ocorre com compromising e burying No proacuteximo cenaacuterio seraacute analisadacomo eacute possiacutevel modificar os resultados de uma eleiccedilatildeo sob o IRV

                                                                                Esses resultados podem ser replicados acessando os linksSem votos taacuteticos lthttpelectionsimpythonanywherecomdirect_res1111110

                                                                                --[0021][22Ana2222Beto222022Carla2222Diego22]------100gt

                                                                                Com 20 de voto taacutetico lthttpelectionsimpythonanywherecomdirect_res1111110--[0021][22Ana222022Beto2222Carla2222Diego22]1-[02000]---100gt

                                                                                Com 100 de voto taacuteticona Ana e Beto lthttpelectionsimpythonanywherecomdirect_res0000100--[0021][22Ana222022Beto222022Carla2222Diego22]1-[101000]---100gt

                                                                                41

                                                                                42 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV

                                                                                Neste cenaacuterio teremos Ana Carla e Beto concorrendo e trecircs perfis distintos que apoiamcada candidato As distribuiccedilotildees de notas dos perfis se encontram na tabela abaixo

                                                                                Tabela 12 ndash Distribuiccedilatildeo de notas - Cenaacuterio 2

                                                                                Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                                                deeleitores

                                                                                1 10 5 0 422 0 10 5 303 5 0 10 28

                                                                                Com essas distribuiccedilotildees Carla eacute eliminada na primeira rodada e seus 28 de votossatildeo transferidos para a segunda opccedilatildeo de seus eleitores Ana que eacute eleita com 70 dosvotos e uma meacutedia de 56

                                                                                Figura 25 ndash IRV primeiro turno - Cenaacuterio 2

                                                                                Figura 26 ndash IRV segundo turno - Cenaacuterio 2

                                                                                42

                                                                                Cientes desse provaacutevel futuro cenaacuterio onde Ana eacute eleita uma pequena parte dos elei-tores de Beto estrategicamente o abandona e decide apoiar Carla na esperanccedila de leva-laao segundo turno contra Ana As novas distribuiccedilotildees de notas se encontram na tabelaabaixo com essa porccedilatildeo de eleitores representada pelo perfil 4

                                                                                Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2

                                                                                Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                                                deeleitores

                                                                                1 10 5 0 422 0 10 5 283 5 0 10 284 0 8 10 2

                                                                                Essa mudanccedila estrateacutegica de voto altera a ordem de eliminaccedilotildees do sistema com Betosendo o primeiro a ser eliminado Com isso seus votos satildeo naturalmente transferidos paraCarla que derrota Ana no segundo turno com 58 dos votos

                                                                                Figura 27 ndash IRV primeiro turno com voto taacutetico - Cenaacuterio 2

                                                                                Figura 28 ndash IRV segundo turno com voto taacutetico - Cenaacuterio 2

                                                                                43

                                                                                Percebendo que a eleiccedilatildeo de Beto natildeo era provaacutevel seus eleitores conseguiram aomenos impedir a eleiccedilatildeo do pior candidato para eles Mas para isso foi necessaacuterio queeles tivessem a informaccedilatildeo de como os outros eleitores votariam Uma aproximaccedilatildeo dessasinformaccedilotildees poderia ser obtida em um cenaacuterio real com poucos candidatos atraveacutes depesquisas eleitorais poreacutem se o nuacutemero de candidatos eacute significativo uma noccedilatildeo completadas distribuiccedilotildees dos rankings dos eleitores se torna muito menos viaacutevel e dificulta aformulaccedilatildeo de estrateacutegias para alterar a ordem em que os candidatos satildeo eliminados

                                                                                Esses resultados podem ser replicados acessando os linksSem voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana22

                                                                                22Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                                                Com voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana

                                                                                2222Beto2222Carla22]-----42Voter20Profile2001020520028Voter20Profile2010201020528Voter20Profile202520020102Voter20Profile20302082010100gt

                                                                                43 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE

                                                                                O interessante dos sistemas IRV e TRS eacute que os resultados do cenaacuterio anterior po-deriam ter sido obtidos ao inveacutes do voto taacutetico pela sua natildeo-monotonicidade Seriapossiacutevel que a Carla derrotasse a Ana no segundo turno atraveacutes do proacuteprio aumento depopularidade da Ana Assumindo que essa popularizaccedilatildeo ocorresse entre os candidatosdo perfil 2 onde 3 passasse a apoiar a Ana ao inveacutes do Beto as novas distribuiccedilotildeesseguiriam a tabela abaixo

                                                                                Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                                                Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                                                deeleitores

                                                                                1 10 5 0 452 0 10 5 273 5 0 10 28

                                                                                Dessa maneira Beto agora com uma porcentagem dos eleitores menor do que a deCarla seraacute eliminado na primeira rodada e como seus eleitores tecircm a Carla como segundaopccedilatildeo ela receberaacute todos os seus votos e seraacute eleita na segunda rodada As rodadas doIRV podem ser vistas nas figuras 29 e 30

                                                                                44

                                                                                Figura 29 ndash IRV primeiro turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                                                Figura 30 ndash IRV segundo turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                                                Tabela 15 ndash Resultados do Cenaacuterio 3Candidato

                                                                                eleitoMeacutedia das

                                                                                notasAntes da

                                                                                popularizaccedilatildeode Ana

                                                                                Ana 56

                                                                                Apoacutespopularizaccedilatildeo

                                                                                de AnaCarla 415

                                                                                Os efeitos dessa caracteriacutestica se refletem na satisfaccedilatildeo meacutedia da populaccedilatildeo A Ana eacuteclaramente a melhor candidata e mesmo com o seu ganho de popularidade (ou devido aele) a Carla eacute eleita

                                                                                Esses resultados podem ser replicados acessando os linksAntes da popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecom

                                                                                direct_res0010000---[22Ana2222Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                                                45

                                                                                Apoacutes popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana2222Beto2222Carla22]-----45Voter20Profile2001020520027Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                                                44 CENAacuteRIO 4 COALIZOtildeES

                                                                                O TRS por ser organizado em dois turnos separados normalmente a semanas dedistacircncia um do outro acaba abrindo brecha agrave mudanccedila de opiniatildeo por parte dos eleitorese o desenvolvimento de novas estrateacutegias por parte dos candidatos tais como a coalizatildeocom candidatos jaacute eliminados Com isso em mente nesse cenaacuterio teremos novamenteos quatro candidatos Ana Beto Carla e Diego Os trecircs primeiros seratildeo gerados dadistribuiccedilatildeo Neutral e Diego da distribuiccedilatildeo Disliked

                                                                                Figura 31 ndash TRS turno 1 - Cenaacuterio 4

                                                                                No TRS normal Ana Beto e Carla possuem com essas distribuiccedilotildees quantidades devotos muito proacuteximas com Beto e Carla indo para o segundo turno Carla estaacute 10 votosatraacutes de Beto e decide aproveitar o espaccedilo de tempo entre os dois turnos para tentaragregar mais votos Com isso Carla se aproxima de Diego e juntos formam uma coalizatildeoNo entanto com sua baixa popularidade Diego acaba ferindo a reputaccedilatildeo de Carla etorna o segundo turno muito mais faacutecil para Beto (Figura 33) Se Carla tivesse buscado osuporte de Ana por outro lado ela se veria vitoriosa no segundo turno e com uma amplavantagem sobre o Beto (Figura 34) Ou ateacute mesmo sem buscar uma coalizatildeo mesmosendo uma corrida apertada Carla teria naturalmente sido eleita (Figura 32)

                                                                                Esses resultados podem ser replicados acessando os linksSem coalizotildees lthttpelectionsimpythonanywherecomdirect_res0100000

                                                                                --[0002][22Ana222022Beto2222Carla2222Diego22]------100gt

                                                                                46

                                                                                Figura 32 ndash TRS turno 2 - Cenaacuterio 4

                                                                                Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4

                                                                                Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4

                                                                                47

                                                                                Coalizatildeo Carla e Diego lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2203Carla20Diego-100gt

                                                                                Coalizatildeo Carla e Ana lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2200Carla20Ana-100gt

                                                                                45 CENAacuteRIO 5 DILEMA DO PRISIONEIRO

                                                                                Neste cenaacuterio temos uma eleiccedilatildeo de uma vaga com trecircs candidatos concorrentes e trecircsperfis distintos de eleitores que seguiratildeo as seguintes distribuiccedilotildees

                                                                                Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5

                                                                                Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                                                deeleitores

                                                                                1 10 -10 5 362 -10 10 5 343 -10 -10 5 30

                                                                                Esse contexto nos remete ao notaacutevel dilema do prisioneiro Nele dois prisioneiroscuacutemplices satildeo interrogados individualmente sem poder se comunicar um com o outro ecada um enfrenta o dilema de delatar ou natildeo o seu parceiro Se os dois prisioneirosdecidem se manter calados sobre o crime ambos satildeo sentenciados a um ano de prisatildeo Seapenas um deles dedurar o outro o traidor sai livre enquanto seu parceiro eacute condenadoa trecircs anos Se ambos dedurarem um ao outro eles satildeo condenados juntos a dois anosde prisatildeo Esse dilema eacute uma ideia claacutessica presente no estudo da teoria dos jogos sendooriginalmente elaborada por Merrill Flood e Melvin Dresher em 1950 e mais tarde sendonomeada de dilema dos prisioneiros por Albert W Tucker (POUNDSTONE 1992)

                                                                                O que esse dilema nos mostra eacute a tentaccedilatildeo que o indiviacuteduo deteacutem se sua racionalizaccedilatildeoestiver voltada para seus proacuteprios interesses e somente eles em oposiccedilatildeo a pensar no bemdo grupo como um todo Neste cenaacuterio encontramos dois grupos de eleitores expressiva-mente opostos os perfis 1 e 2 Se qualquer uma das preferecircncias desses perfis fosse eleitaisso significaria uma alta rejeiccedilatildeo de maior parte da populaccedilatildeo No entanto eles possuema segunda opccedilatildeo em comum a Carla que por sua vez eacute a preferecircncia do terceiro perfilPortanto a eleiccedilatildeo da Carla seria logicamente o resultado oacutetimo

                                                                                Mesmo assim a Ana eacute eleita nos dois sistemas acima o que natildeo parece justo poispela tabela 16 eacute evidente que apenas 36 da populaccedilatildeo a aprova enquanto que os outros64 a reprovam ao maacuteximo O sistema IRV se comporta de maneira idecircntica ao TRS

                                                                                48

                                                                                Figura 35 ndash FPTP - Cenaacuterio 5

                                                                                Figura 36 ndash TRS segundo turno - Cenaacuterio 5

                                                                                nesta situaccedilatildeo Com esse resultado a meacutedia das notas eacute -28 No entanto os trecircs sistemasseguintes nos apresentam resultados diferentes

                                                                                Tabela 17 ndash Resultados do Cenaacuterio 5

                                                                                Sistema Candidatoeleito

                                                                                Meacutedia dasnotas

                                                                                FPTP Ana -28TRS Ana -28IRV Ana -28AVS Carla 50BC Carla 50SVS Carla 50

                                                                                49

                                                                                Figura 37 ndash AVS - Cenaacuterio 5

                                                                                Figura 38 ndash BC - Cenaacuterio 5

                                                                                Tanto o AVS quanto o Borda Count e o SVS satildeo sistemas que consideram todasas opiniotildees de cada eleitor ao mesmo tempo e por isso satildeo capazes de eleger o melhorcandidato nesta situaccedilatildeo diferentemente do TRS que natildeo absorve completamente todosentimento do eleitor por todos os candidatos e o IRV que apesar de ser bem expressivoquebra esse processo em inuacutemeras rodadas o que permite a perda de informaccedilatildeo ao longodelas

                                                                                Esses resultados podem ser replicados acessando o linklthttpelectionsimpythonanywherecomdirect_res1111110---[22Ana

                                                                                222022Beto222022Carla22]-----36Voter20Profile2001020-1020534Voter20Profile201-10201020530Voter20Profile202-1020-10205100gt

                                                                                50

                                                                                Figura 39 ndash SVS - Cenaacuterio 5

                                                                                46 CENAacuteRIO 6 VOTO DE MINORIA

                                                                                Neste cenaacuterio temos uma eleiccedilatildeo com quatro candidatos e duas vagas A Ana seraacutea preferecircncia de uma extensa parte da populaccedilatildeo (distribuiccedilatildeo Loved Figura 53) Betoe Carla seratildeo candidatos razoavelmente populares (distribuiccedilatildeo Neutral Figura 47) eDiego seraacute a preferecircncia de apenas um pequeno grupo especiacutefico e rejeitado pela maioria(distribuiccedilatildeo Disliked Figura 51) Eacute intuitivo esperar que os dois candidatos eleitos seratildeoa Ana e ou o Beto ou a Carla e isso eacute exatamente o que ocorre na figura 40 no sistemaFPTP sem voto de minoria

                                                                                Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria

                                                                                Eacute evidente a discrepacircncia da quantidade de votos da Ana para os outros candidatose apesar de Beto e Carla serem mais populares que Diego os trecircs natildeo se encontrammuito afastados Poreacutem se a pequena fraccedilatildeo de candidatos que possuem a Ana como

                                                                                51

                                                                                Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego

                                                                                preferecircncia e Diego como segunda opccedilatildeo optarem pelo voto de minoria a situaccedilatildeo mudacompletamente (Figura 41) Assim apesar de extensamente rejeitado Diego conquistaa segunda vaga e a meacutedia das notas despenca de 2929 para 0505 No entanto aindaexiste um cenaacuterio pior Se os outros grupos de eleitores pensarem da mesma forma eevitarem votar na Ana achando que sua eleiccedilatildeo jaacute estaacute assegurada apenas 80 de votode minoria para esses grupos jaacute eacute o suficiente para eliminaacute-la das eleiccedilotildees (Figura 42)Com a Ana eliminada a meacutedia das notas cai ainda mais para 0058

                                                                                Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego

                                                                                O sistema Bloc Vote eacute uma das soluccedilotildees para o voto de minoria Permitindo queos eleitores votem no mesmo nuacutemero de candidatos que de vagas a serem preenchidasnatildeo existe o iacutempeto a esse tipo de voto estrateacutegico O resultado desse sistema portantoretorna a meacutedia das notas a casa dos 29 (Figura 43) Os sistemas AVS Borda Count eSVS tambeacutem impedem a presenccedila do voto de minoria e atingem resultados semelhantes

                                                                                52

                                                                                Figura 43 ndash BV - Cenaacuterio 6

                                                                                Tabela 18 ndash Resultados do Cenaacuterio 6

                                                                                Sistema Candidatoseleitos

                                                                                Meacutedia dasnotas

                                                                                FPTP sem voto de minoriaAna eBeto 2929

                                                                                FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

                                                                                FPTP com 80 de voto de minoriaBeto eCarla 0058

                                                                                Bloc VoteAna eCarla 2913

                                                                                Esses resultados podem ser replicados acessando os links

                                                                                Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

                                                                                100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

                                                                                80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

                                                                                53

                                                                                5 COMO FUNCIONA O SIMULADOR

                                                                                O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

                                                                                51 CLASSE ELECTIONS

                                                                                Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

                                                                                bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

                                                                                Figura 44 ndash estrutura candidates

                                                                                bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

                                                                                bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

                                                                                Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

                                                                                Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

                                                                                54

                                                                                Figura 45 ndash estrutura voters

                                                                                Figura 46 ndash estrutura votes

                                                                                daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

                                                                                Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

                                                                                55

                                                                                Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

                                                                                Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

                                                                                na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

                                                                                56

                                                                                Figura 49 ndash PDF - Distribuiccedilatildeo Liked

                                                                                Figura 50 ndash CDF - Distribuiccedilatildeo Liked

                                                                                (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

                                                                                Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

                                                                                57

                                                                                Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

                                                                                Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

                                                                                candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

                                                                                Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

                                                                                58

                                                                                Figura 53 ndash PDF - Distribuiccedilatildeo Loved

                                                                                Figura 54 ndash CDF - Distribuiccedilatildeo Loved

                                                                                funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

                                                                                59

                                                                                Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                                                                                Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                                                                                Meacutedia das Notas sumei

                                                                                sumvj nij

                                                                                etimes v

                                                                                Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                                                                                Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                                                                                60

                                                                                Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                                                                                Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                                                                                52 CLASSE FIRSTPASTTHEPOST

                                                                                Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                                                                                Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                                                                                61

                                                                                Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                                                                                Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                                                                                mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                                                                                62

                                                                                53 CLASSE TWOROUNDSYSTEM

                                                                                A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                                                                                54 CLASSE INSTANTRUNOFFVOTING

                                                                                A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                                                                                Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                                                                                63

                                                                                cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                                                                                55 CLASSE APPROVALVOTING

                                                                                Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                                                                                56 CLASSE BORDACOUNT

                                                                                Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                                                                                57 CLASSE SCOREVOTING

                                                                                De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                                                                                64

                                                                                58 CLASSE BLOCVOTE

                                                                                O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                                                                                59 TECNOLOGIAS UTILIZADAS

                                                                                A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                                                                                Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                                                                                O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                                                                                Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                                                                                65

                                                                                6 CONCLUSAtildeO

                                                                                Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                                                                                Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                                                                                Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                                                                                Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                                                                                Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                                                                                66

                                                                                REFEREcircNCIAS

                                                                                AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                                                                                Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                                                                                Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                                                                                Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                                                                                HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                                                                                LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                                                                                ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                                                                                Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                                                                                POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                                                                                The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                                                                                67

                                                                                APEcircNDICES

                                                                                APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                                                                Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                                                                if(not len(selfvoter_profiles))

                                                                                for voter in range(selfN_VOTERS)

                                                                                candidates_rank = dict()

                                                                                for candidate in reversed(range(selfN_CANDIDATES))

                                                                                if(selfBIAS_VECTOR[candidate]==4)

                                                                                candidates_rank[candidate] = self_sortear(selfloved)

                                                                                elif(selfBIAS_VECTOR[candidate]==3)

                                                                                candidates_rank[candidate] = self_sortear(selfliked)

                                                                                elif(selfBIAS_VECTOR[candidate]==2)

                                                                                candidates_rank[candidate] = self_sortear(selfdisliked)

                                                                                elif(selfBIAS_VECTOR[candidate]==1)

                                                                                candidates_rank[candidate] = self_sortear(selfhated)

                                                                                elif(selfBIAS_VECTOR[candidate]==-1)

                                                                                candidates_rank[candidate] = self_sortear(selfpolarizer

                                                                                )

                                                                                elif(selfBIAS_VECTOR[candidate]==-2)

                                                                                candidates_rank[candidate] = self_sortear(self

                                                                                more_polarizer)

                                                                                else

                                                                                candidates_rank[candidate] = self_sortear(selfneutral)

                                                                                selfvotersappend(candidates_rank)

                                                                                else

                                                                                ranges = []

                                                                                ranks = []

                                                                                for prof in selfvoter_profiles

                                                                                rangesappend(int(prof[pop_percentage]))

                                                                                rank =

                                                                                for index score in enumerate(prof[scores])

                                                                                rank[index] = score

                                                                                ranksappend(rank)

                                                                                for index _range in enumerate(ranges)

                                                                                for _ in range(int(selfN_VOTERS(_range100)))

                                                                                selfvotersappend(ranks[index])

                                                                                68

                                                                                APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                                                                Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                                                                for i in range(selfN_CANDIDATES)

                                                                                selfcandidates[i] = 0

                                                                                selfvotes[i] = set()

                                                                                APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                                                                Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                                                                for candidate in range(selfN_CANDIDATES)

                                                                                rating_sum = 0

                                                                                for voter in selfvoters

                                                                                rating_sum += voter[candidate]

                                                                                selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                                                                APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                                                                Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                                                                if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                                                                return selfcalculate_mean(winners)

                                                                                else

                                                                                chose_best = True if winners[0] == selfbest_candidate else

                                                                                False

                                                                                return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                                                                69

                                                                                APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                                                                Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                                                                rating_sum = 0

                                                                                for voter in selfvoters

                                                                                for candidate in winners

                                                                                rating_sum += voter[candidate]

                                                                                return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                                                                APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                                                                Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                                                                for i in range(1 selfN_VACANCIES + 2)

                                                                                selfleading_candidatesappend(selfsorted_candidates[-i][self

                                                                                CANDIDATE_INDEX])

                                                                                APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                                                                Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                                                                for leader in selfelecrounds[-1]

                                                                                selfleading_candidatesappend(leader[0])

                                                                                70

                                                                                APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                                                                Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                                                                self_account_for_coalitions()

                                                                                for voter in selfvoters

                                                                                selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                                                                (1)))

                                                                                temp = []

                                                                                for voter in selfsorted_voters

                                                                                new_dict = defaultdict(list)

                                                                                for k in voter

                                                                                new_dict[k[1]]append(k[0])

                                                                                tempappend(new_dict)

                                                                                selfsorted_voters = []

                                                                                for voter_index current_voter in enumerate(temp)

                                                                                new_voter = []

                                                                                for rating candidate_indexes in current_voteritems()

                                                                                if len(current_voter[rating]) gt 1

                                                                                shuffle(current_voter[rating])

                                                                                for e in candidate_indexes

                                                                                new_voterappend((e rating))

                                                                                else

                                                                                new_voterappend((candidate_indexes[0] rating))

                                                                                selfsorted_votersappend(new_voter)

                                                                                selfcandidates[new_voter[-1][0]] += 1

                                                                                selfvotes[new_voter[-1][0]]add(voter_index)

                                                                                71

                                                                                APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                                                                Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                                                                for candidate in selfvotes_copy

                                                                                if candidate not in selfelecleading_candidates

                                                                                for voter_index in selfvotes_copy[candidate]

                                                                                for index _candidate in enumerate(reversed(selfelec

                                                                                sorted_voters[voter_index]))

                                                                                if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                                                                leading_candidates

                                                                                if randomrandom() lt selfelec

                                                                                tactical_vote_percentages[_candidate[selfelec

                                                                                CANDIDATE_INDEX]]

                                                                                selfrankings_changed[voter_index] = copy

                                                                                deepcopy(selfelecsorted_voters[voter_index])

                                                                                selfrankings_changed[voter_index][-(index + 1)]

                                                                                selfrankings_changed[voter_index][-1] = self

                                                                                rankings_changed[voter_index][-1] self

                                                                                rankings_changed[voter_index][-(index + 1)]

                                                                                selfcandidates[candidate] -= 1

                                                                                selfcandidates[_candidate[selfelec

                                                                                CANDIDATE_INDEX]] += 1

                                                                                selfvotes[candidate]remove(voter_index)

                                                                                selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                                                                ]]add(voter_index)

                                                                                break

                                                                                break

                                                                                72

                                                                                APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                                                                Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                                                                half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                                                                for candidate in selfelecleading_candidates

                                                                                if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                                                                continue

                                                                                for voter_index in selfvotes_copy[candidate]

                                                                                if voter_index in selfrankings_changed

                                                                                ranking = selfrankings_changed[voter_index]

                                                                                else

                                                                                ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                                                                ])

                                                                                for index _candidate in enumerate(reversed(ranking))

                                                                                if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                leading_candidates or (_candidate[selfelec

                                                                                CANDIDATE_INDEX] in selfelecleading_candidates and

                                                                                selfelecleading_candidatesindex(_candidate[selfelec

                                                                                CANDIDATE_INDEX]) gt= half_vacancies)

                                                                                if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                                                                if randomrandom() lt selfelec

                                                                                minority_vote_percentages[_candidate[selfelec

                                                                                CANDIDATE_INDEX]]

                                                                                selfcandidates[candidate] -= 1

                                                                                selfcandidates[_candidate[selfelec

                                                                                CANDIDATE_INDEX]] += 1

                                                                                break

                                                                                break

                                                                                break

                                                                                73

                                                                                APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                                                                Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                                                                self_account_for_coalitions()

                                                                                for candidate in selfvotes

                                                                                if candidate = selfwinner and candidate = selfsecond_place

                                                                                for voter_index in selfvotes[candidate]

                                                                                if voter_index in selfrankings_changed

                                                                                ranking = selfrankings_changed[voter_index]

                                                                                else

                                                                                ranking = copydeepcopy(selfelecsorted_voters[

                                                                                voter_index])

                                                                                for index2 candidate in enumerate(reversed(ranking))

                                                                                if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                                                                selfcandidates[selfwinner] += 1

                                                                                selfvotes[selfwinner]add(voter_index)

                                                                                break

                                                                                elif candidate[selfelecCANDIDATE_INDEX] == self

                                                                                second_place

                                                                                selfcandidates[selfsecond_place] += 1

                                                                                selfvotes[selfsecond_place]add(voter_index)

                                                                                break

                                                                                selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                winners = []

                                                                                vacancies = selfelecN_VACANCIES

                                                                                for candidate in reversed(selfsorted_candidates)

                                                                                if vacancies == 0

                                                                                break

                                                                                winnersappend(candidate[0])

                                                                                vacancies -= 1

                                                                                mean chose_best = selfelecget_mean(winners = winners)

                                                                                74

                                                                                APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                                                                Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                                                                for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                voter_dict = dict()

                                                                                og_voter_dict = dict()

                                                                                for tup in voter

                                                                                voter_dict[tup[0]] = tup[1]

                                                                                og_voter_dict[tup[0]] = tup[1]

                                                                                for coalition in selfeleccoalitions

                                                                                for candidate in coalition

                                                                                add_to_score = 0

                                                                                for candidate2 in coalition

                                                                                if candidate == candidate2

                                                                                continue

                                                                                half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                                                                if half lt 0

                                                                                add_to_score += mathceil(half)

                                                                                else

                                                                                add_to_score += mathfloor(half)

                                                                                if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                                                                voter_dict[candidate[rsquovaluersquo]] = 10

                                                                                elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                                                                voter_dict[candidate[rsquovaluersquo]] = -10

                                                                                else

                                                                                voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                                                                selfrankings_changed[voter_index] = []

                                                                                for candidate in voter_dict

                                                                                selfrankings_changed[voter_index]append((candidate voter_dict[

                                                                                candidate]))

                                                                                selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                                                                voter_index] key=lambda x x[1])

                                                                                75

                                                                                APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                                                Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                                                selfelecroundsappend(selfsorted_candidates[_round])

                                                                                if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                                                N_VACANCIES - 1)

                                                                                return 2

                                                                                elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                N_VOTERS gt 05)

                                                                                return 1

                                                                                else

                                                                                selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                                                CANDIDATE_INDEX])

                                                                                for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                                                elecCANDIDATE_INDEX]]

                                                                                if voter_index in selfrankings_changed

                                                                                for candidate in reversed(selfrankings_changed[voter_index

                                                                                ])

                                                                                if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                excluded

                                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                ]] += 1

                                                                                selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                add(voter_index)

                                                                                break

                                                                                else

                                                                                continue

                                                                                else

                                                                                for candidate in reversed(selfelecsorted_voters[

                                                                                voter_index])

                                                                                if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                excluded

                                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                ]] += 1

                                                                                selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                add(voter_index)

                                                                                break

                                                                                else

                                                                                continue

                                                                                selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                return 0

                                                                                76

                                                                                APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                                                Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                                                for index in range(selfelecN_CANDIDATES)

                                                                                selfcandidates[index] = 0

                                                                                for voter in selfelecsorted_voters

                                                                                for candidate in reversed(voter)

                                                                                if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                else

                                                                                break

                                                                                APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                                                Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                                                for index in range(selfelecN_CANDIDATES)

                                                                                selfcandidates[index] = 0

                                                                                for voter in selfelecsorted_voters

                                                                                if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                elecCANDIDATE_INDEX]]

                                                                                selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                                                else

                                                                                for candidate in reversed(voter)

                                                                                if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                else

                                                                                break

                                                                                77

                                                                                APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                                                Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                                                pos = set()

                                                                                for index perc in enumerate(selfelectactical_vote_percentages)

                                                                                if perc gt 0

                                                                                posadd(index)

                                                                                for candidate in selfeleccandidates

                                                                                if candidate not in selfleading_candidates

                                                                                for voter_index in selfvotes[candidate]

                                                                                raised = None

                                                                                for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                                                ])

                                                                                if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                                                leading_candidates

                                                                                if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                                                if randomrandom() lt selfelectactical_vote_percentages[

                                                                                candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                                                ranking = [None]selfelecN_CANDIDATES

                                                                                ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                CANDIDATE_INDEX]])

                                                                                raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                break

                                                                                break

                                                                                break

                                                                                if raised = None

                                                                                for _candidate in selfleading_candidates

                                                                                if _candidate = ranking[-1][0]

                                                                                ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                _candidate])

                                                                                buried = _candidate

                                                                                break

                                                                                i = 1

                                                                                for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                                                buried]

                                                                                continue

                                                                                else

                                                                                ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                CANDIDATE_INDEX]])

                                                                                i += 1

                                                                                selfrankings_changed[voter_index] = ranking

                                                                                78

                                                                                APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                                                Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                                                for voter_index in selfvotes[candidate]

                                                                                if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                                                ]

                                                                                for _candidate in selfleading_candidates

                                                                                if _candidate = candidate

                                                                                ranking = [None]selfelecN_CANDIDATES

                                                                                ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                _candidate])

                                                                                buried = _candidate

                                                                                break

                                                                                i = 1

                                                                                for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                                                continue

                                                                                else

                                                                                ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                CANDIDATE_INDEX]])

                                                                                i += 1

                                                                                selfrankings_changed[voter_index] = ranking

                                                                                79

                                                                                APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                                                Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                                                for index in range(selfelecN_CANDIDATES)

                                                                                selfcandidates[index] = 0

                                                                                for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                score = 0

                                                                                if voter_index in selfrankings_changed

                                                                                for candidate in selfrankings_changed[voter_index]

                                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                score += 1

                                                                                else

                                                                                for candidate in voter

                                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                score += 1

                                                                                APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                                                Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                                                for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                elecCANDIDATE_INDEX]]

                                                                                selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                                                sorted_voters[voter_index])

                                                                                for candidate_index candidate in enumerate(reversed(voter))

                                                                                if candidate_index == 0

                                                                                selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                                                else

                                                                                selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                                                80

                                                                                APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                                                Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                                                for index in range(selfelecN_CANDIDATES)

                                                                                selfcandidates[index] = 0

                                                                                for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                if voter_index in selfrankings_changed

                                                                                for candidate in selfrankings_changed[voter_index]

                                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                selfelecCANDIDATE_RANK]

                                                                                else

                                                                                for candidate in voter

                                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                selfelecCANDIDATE_RANK]

                                                                                APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                                                Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                                                for index in range(selfelecN_CANDIDATES)

                                                                                selfcandidates[index] = 0

                                                                                for voter in selfelecsorted_voters

                                                                                votes = selfelecN_VACANCIES

                                                                                for candidate in reversed(voter)

                                                                                if votes == 0

                                                                                break

                                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                votes -= 1

                                                                                • Folha de aprovaccedilatildeo
                                                                                • Agradecimentos
                                                                                • Epiacutegrafe
                                                                                • Resumo
                                                                                • Abstract
                                                                                • Lista de ilustraccedilotildees
                                                                                • Lista de Coacutedigos
                                                                                • Lista de tabelas
                                                                                • Lista de abreviaturas e siglas
                                                                                • Sumaacuterio
                                                                                • INTRODUCcedilAtildeO
                                                                                  • MOTIVACcedilAtildeO E OBJETIVO
                                                                                  • MEacuteTODO
                                                                                  • ESTRUTURA
                                                                                    • SISTEMAS ELEITORAIS
                                                                                      • FISRT PAST THE POST
                                                                                        • Exemplo
                                                                                        • Vantagens e Desvantagens do FPTP
                                                                                        • Voto Uacutetil no FPTP
                                                                                          • TWO-ROUND SYSTEM
                                                                                            • Exemplo
                                                                                            • Vantagens e Desvantagens do TRS
                                                                                            • Voto Uacutetil no TRS
                                                                                              • INSTANT-RUNOFF VOTING
                                                                                                • Exemplo
                                                                                                • Vantagens e Desvantagens do IRV
                                                                                                • Voto Uacutetil no IRV
                                                                                                  • APPROVAL VOTING SYSTEM
                                                                                                    • Exemplo
                                                                                                    • Vantagens e Desvantagens do AVS
                                                                                                    • Voto Uacutetil no AVS
                                                                                                      • THE BORDA COUNT
                                                                                                        • Exemplo
                                                                                                        • Vantagens e Desvantagens do BC
                                                                                                        • Voto Uacutetil no BC
                                                                                                          • SCORE VOTING SYSTEM
                                                                                                            • Exemplo
                                                                                                            • Vantagens e Desvantagens do SVS
                                                                                                            • Voto Uacutetil no SVS
                                                                                                              • BLOC VOTE
                                                                                                                • Exemplo
                                                                                                                • Voto Uacutetil no BV
                                                                                                                    • O SIMULADOR
                                                                                                                    • CENAacuteRIOS PERTINENTES
                                                                                                                      • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                                      • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                                      • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                                      • CENAacuteRIO 4 COALIZOtildeES
                                                                                                                      • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                                      • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                                        • COMO FUNCIONA O SIMULADOR
                                                                                                                          • CLASSE Elections
                                                                                                                          • CLASSE FirstPastThePost
                                                                                                                          • CLASSE TwoRoundSystem
                                                                                                                          • CLASSE InstantRunoffVoting
                                                                                                                          • CLASSE ApprovalVoting
                                                                                                                          • CLASSE BordaCount
                                                                                                                          • CLASSE ScoreVoting
                                                                                                                          • CLASSE BlocVote
                                                                                                                          • TECNOLOGIAS UTILIZADAS
                                                                                                                            • CONCLUSAtildeO
                                                                                                                            • Referecircncias
                                                                                                                            • Meacutetodo create_voters
                                                                                                                            • Meacutetodo create_candidates
                                                                                                                            • Meacutetodo calculate_means
                                                                                                                            • Meacutetodo get_mean
                                                                                                                            • Meacutetodo calculate_mean
                                                                                                                            • Meacutetodo set_leading_candidates
                                                                                                                            • Meacutetodo irv_set_leading_candidates
                                                                                                                            • Meacutetodo sort_ranks
                                                                                                                            • Meacutetodo fptp_count_tactical_votes
                                                                                                                            • Meacutetodo fptp_count_minority_votes
                                                                                                                            • Meacutetodo trs_second_round
                                                                                                                            • Meacutetodo trs_account_for_coalitions
                                                                                                                            • Meacutetodo irv_count_votes
                                                                                                                            • Meacutetodo avs_count_votes
                                                                                                                            • Meacutetodo avs_count_votes_with_tactical
                                                                                                                            • Meacutetodo irv_apply_tactical_votes
                                                                                                                            • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                                            • Meacutetodo bc_sum_candidates_scores
                                                                                                                            • Meacutetodo svs_apply_tactical_votes
                                                                                                                            • Meacutetodo svs_sum_candidates_scores
                                                                                                                            • Meacutetodo bv_count_votes

                                                                                  41

                                                                                  42 CENAacuteRIO 2 VOTO TAacuteTICO NO IRV

                                                                                  Neste cenaacuterio teremos Ana Carla e Beto concorrendo e trecircs perfis distintos que apoiamcada candidato As distribuiccedilotildees de notas dos perfis se encontram na tabela abaixo

                                                                                  Tabela 12 ndash Distribuiccedilatildeo de notas - Cenaacuterio 2

                                                                                  Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                                                  deeleitores

                                                                                  1 10 5 0 422 0 10 5 303 5 0 10 28

                                                                                  Com essas distribuiccedilotildees Carla eacute eliminada na primeira rodada e seus 28 de votossatildeo transferidos para a segunda opccedilatildeo de seus eleitores Ana que eacute eleita com 70 dosvotos e uma meacutedia de 56

                                                                                  Figura 25 ndash IRV primeiro turno - Cenaacuterio 2

                                                                                  Figura 26 ndash IRV segundo turno - Cenaacuterio 2

                                                                                  42

                                                                                  Cientes desse provaacutevel futuro cenaacuterio onde Ana eacute eleita uma pequena parte dos elei-tores de Beto estrategicamente o abandona e decide apoiar Carla na esperanccedila de leva-laao segundo turno contra Ana As novas distribuiccedilotildees de notas se encontram na tabelaabaixo com essa porccedilatildeo de eleitores representada pelo perfil 4

                                                                                  Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2

                                                                                  Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                                                  deeleitores

                                                                                  1 10 5 0 422 0 10 5 283 5 0 10 284 0 8 10 2

                                                                                  Essa mudanccedila estrateacutegica de voto altera a ordem de eliminaccedilotildees do sistema com Betosendo o primeiro a ser eliminado Com isso seus votos satildeo naturalmente transferidos paraCarla que derrota Ana no segundo turno com 58 dos votos

                                                                                  Figura 27 ndash IRV primeiro turno com voto taacutetico - Cenaacuterio 2

                                                                                  Figura 28 ndash IRV segundo turno com voto taacutetico - Cenaacuterio 2

                                                                                  43

                                                                                  Percebendo que a eleiccedilatildeo de Beto natildeo era provaacutevel seus eleitores conseguiram aomenos impedir a eleiccedilatildeo do pior candidato para eles Mas para isso foi necessaacuterio queeles tivessem a informaccedilatildeo de como os outros eleitores votariam Uma aproximaccedilatildeo dessasinformaccedilotildees poderia ser obtida em um cenaacuterio real com poucos candidatos atraveacutes depesquisas eleitorais poreacutem se o nuacutemero de candidatos eacute significativo uma noccedilatildeo completadas distribuiccedilotildees dos rankings dos eleitores se torna muito menos viaacutevel e dificulta aformulaccedilatildeo de estrateacutegias para alterar a ordem em que os candidatos satildeo eliminados

                                                                                  Esses resultados podem ser replicados acessando os linksSem voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana22

                                                                                  22Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                                                  Com voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana

                                                                                  2222Beto2222Carla22]-----42Voter20Profile2001020520028Voter20Profile2010201020528Voter20Profile202520020102Voter20Profile20302082010100gt

                                                                                  43 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE

                                                                                  O interessante dos sistemas IRV e TRS eacute que os resultados do cenaacuterio anterior po-deriam ter sido obtidos ao inveacutes do voto taacutetico pela sua natildeo-monotonicidade Seriapossiacutevel que a Carla derrotasse a Ana no segundo turno atraveacutes do proacuteprio aumento depopularidade da Ana Assumindo que essa popularizaccedilatildeo ocorresse entre os candidatosdo perfil 2 onde 3 passasse a apoiar a Ana ao inveacutes do Beto as novas distribuiccedilotildeesseguiriam a tabela abaixo

                                                                                  Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                                                  Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                                                  deeleitores

                                                                                  1 10 5 0 452 0 10 5 273 5 0 10 28

                                                                                  Dessa maneira Beto agora com uma porcentagem dos eleitores menor do que a deCarla seraacute eliminado na primeira rodada e como seus eleitores tecircm a Carla como segundaopccedilatildeo ela receberaacute todos os seus votos e seraacute eleita na segunda rodada As rodadas doIRV podem ser vistas nas figuras 29 e 30

                                                                                  44

                                                                                  Figura 29 ndash IRV primeiro turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                                                  Figura 30 ndash IRV segundo turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                                                  Tabela 15 ndash Resultados do Cenaacuterio 3Candidato

                                                                                  eleitoMeacutedia das

                                                                                  notasAntes da

                                                                                  popularizaccedilatildeode Ana

                                                                                  Ana 56

                                                                                  Apoacutespopularizaccedilatildeo

                                                                                  de AnaCarla 415

                                                                                  Os efeitos dessa caracteriacutestica se refletem na satisfaccedilatildeo meacutedia da populaccedilatildeo A Ana eacuteclaramente a melhor candidata e mesmo com o seu ganho de popularidade (ou devido aele) a Carla eacute eleita

                                                                                  Esses resultados podem ser replicados acessando os linksAntes da popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecom

                                                                                  direct_res0010000---[22Ana2222Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                                                  45

                                                                                  Apoacutes popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana2222Beto2222Carla22]-----45Voter20Profile2001020520027Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                                                  44 CENAacuteRIO 4 COALIZOtildeES

                                                                                  O TRS por ser organizado em dois turnos separados normalmente a semanas dedistacircncia um do outro acaba abrindo brecha agrave mudanccedila de opiniatildeo por parte dos eleitorese o desenvolvimento de novas estrateacutegias por parte dos candidatos tais como a coalizatildeocom candidatos jaacute eliminados Com isso em mente nesse cenaacuterio teremos novamenteos quatro candidatos Ana Beto Carla e Diego Os trecircs primeiros seratildeo gerados dadistribuiccedilatildeo Neutral e Diego da distribuiccedilatildeo Disliked

                                                                                  Figura 31 ndash TRS turno 1 - Cenaacuterio 4

                                                                                  No TRS normal Ana Beto e Carla possuem com essas distribuiccedilotildees quantidades devotos muito proacuteximas com Beto e Carla indo para o segundo turno Carla estaacute 10 votosatraacutes de Beto e decide aproveitar o espaccedilo de tempo entre os dois turnos para tentaragregar mais votos Com isso Carla se aproxima de Diego e juntos formam uma coalizatildeoNo entanto com sua baixa popularidade Diego acaba ferindo a reputaccedilatildeo de Carla etorna o segundo turno muito mais faacutecil para Beto (Figura 33) Se Carla tivesse buscado osuporte de Ana por outro lado ela se veria vitoriosa no segundo turno e com uma amplavantagem sobre o Beto (Figura 34) Ou ateacute mesmo sem buscar uma coalizatildeo mesmosendo uma corrida apertada Carla teria naturalmente sido eleita (Figura 32)

                                                                                  Esses resultados podem ser replicados acessando os linksSem coalizotildees lthttpelectionsimpythonanywherecomdirect_res0100000

                                                                                  --[0002][22Ana222022Beto2222Carla2222Diego22]------100gt

                                                                                  46

                                                                                  Figura 32 ndash TRS turno 2 - Cenaacuterio 4

                                                                                  Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4

                                                                                  Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4

                                                                                  47

                                                                                  Coalizatildeo Carla e Diego lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2203Carla20Diego-100gt

                                                                                  Coalizatildeo Carla e Ana lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2200Carla20Ana-100gt

                                                                                  45 CENAacuteRIO 5 DILEMA DO PRISIONEIRO

                                                                                  Neste cenaacuterio temos uma eleiccedilatildeo de uma vaga com trecircs candidatos concorrentes e trecircsperfis distintos de eleitores que seguiratildeo as seguintes distribuiccedilotildees

                                                                                  Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5

                                                                                  Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                                                  deeleitores

                                                                                  1 10 -10 5 362 -10 10 5 343 -10 -10 5 30

                                                                                  Esse contexto nos remete ao notaacutevel dilema do prisioneiro Nele dois prisioneiroscuacutemplices satildeo interrogados individualmente sem poder se comunicar um com o outro ecada um enfrenta o dilema de delatar ou natildeo o seu parceiro Se os dois prisioneirosdecidem se manter calados sobre o crime ambos satildeo sentenciados a um ano de prisatildeo Seapenas um deles dedurar o outro o traidor sai livre enquanto seu parceiro eacute condenadoa trecircs anos Se ambos dedurarem um ao outro eles satildeo condenados juntos a dois anosde prisatildeo Esse dilema eacute uma ideia claacutessica presente no estudo da teoria dos jogos sendooriginalmente elaborada por Merrill Flood e Melvin Dresher em 1950 e mais tarde sendonomeada de dilema dos prisioneiros por Albert W Tucker (POUNDSTONE 1992)

                                                                                  O que esse dilema nos mostra eacute a tentaccedilatildeo que o indiviacuteduo deteacutem se sua racionalizaccedilatildeoestiver voltada para seus proacuteprios interesses e somente eles em oposiccedilatildeo a pensar no bemdo grupo como um todo Neste cenaacuterio encontramos dois grupos de eleitores expressiva-mente opostos os perfis 1 e 2 Se qualquer uma das preferecircncias desses perfis fosse eleitaisso significaria uma alta rejeiccedilatildeo de maior parte da populaccedilatildeo No entanto eles possuema segunda opccedilatildeo em comum a Carla que por sua vez eacute a preferecircncia do terceiro perfilPortanto a eleiccedilatildeo da Carla seria logicamente o resultado oacutetimo

                                                                                  Mesmo assim a Ana eacute eleita nos dois sistemas acima o que natildeo parece justo poispela tabela 16 eacute evidente que apenas 36 da populaccedilatildeo a aprova enquanto que os outros64 a reprovam ao maacuteximo O sistema IRV se comporta de maneira idecircntica ao TRS

                                                                                  48

                                                                                  Figura 35 ndash FPTP - Cenaacuterio 5

                                                                                  Figura 36 ndash TRS segundo turno - Cenaacuterio 5

                                                                                  nesta situaccedilatildeo Com esse resultado a meacutedia das notas eacute -28 No entanto os trecircs sistemasseguintes nos apresentam resultados diferentes

                                                                                  Tabela 17 ndash Resultados do Cenaacuterio 5

                                                                                  Sistema Candidatoeleito

                                                                                  Meacutedia dasnotas

                                                                                  FPTP Ana -28TRS Ana -28IRV Ana -28AVS Carla 50BC Carla 50SVS Carla 50

                                                                                  49

                                                                                  Figura 37 ndash AVS - Cenaacuterio 5

                                                                                  Figura 38 ndash BC - Cenaacuterio 5

                                                                                  Tanto o AVS quanto o Borda Count e o SVS satildeo sistemas que consideram todasas opiniotildees de cada eleitor ao mesmo tempo e por isso satildeo capazes de eleger o melhorcandidato nesta situaccedilatildeo diferentemente do TRS que natildeo absorve completamente todosentimento do eleitor por todos os candidatos e o IRV que apesar de ser bem expressivoquebra esse processo em inuacutemeras rodadas o que permite a perda de informaccedilatildeo ao longodelas

                                                                                  Esses resultados podem ser replicados acessando o linklthttpelectionsimpythonanywherecomdirect_res1111110---[22Ana

                                                                                  222022Beto222022Carla22]-----36Voter20Profile2001020-1020534Voter20Profile201-10201020530Voter20Profile202-1020-10205100gt

                                                                                  50

                                                                                  Figura 39 ndash SVS - Cenaacuterio 5

                                                                                  46 CENAacuteRIO 6 VOTO DE MINORIA

                                                                                  Neste cenaacuterio temos uma eleiccedilatildeo com quatro candidatos e duas vagas A Ana seraacutea preferecircncia de uma extensa parte da populaccedilatildeo (distribuiccedilatildeo Loved Figura 53) Betoe Carla seratildeo candidatos razoavelmente populares (distribuiccedilatildeo Neutral Figura 47) eDiego seraacute a preferecircncia de apenas um pequeno grupo especiacutefico e rejeitado pela maioria(distribuiccedilatildeo Disliked Figura 51) Eacute intuitivo esperar que os dois candidatos eleitos seratildeoa Ana e ou o Beto ou a Carla e isso eacute exatamente o que ocorre na figura 40 no sistemaFPTP sem voto de minoria

                                                                                  Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria

                                                                                  Eacute evidente a discrepacircncia da quantidade de votos da Ana para os outros candidatose apesar de Beto e Carla serem mais populares que Diego os trecircs natildeo se encontrammuito afastados Poreacutem se a pequena fraccedilatildeo de candidatos que possuem a Ana como

                                                                                  51

                                                                                  Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego

                                                                                  preferecircncia e Diego como segunda opccedilatildeo optarem pelo voto de minoria a situaccedilatildeo mudacompletamente (Figura 41) Assim apesar de extensamente rejeitado Diego conquistaa segunda vaga e a meacutedia das notas despenca de 2929 para 0505 No entanto aindaexiste um cenaacuterio pior Se os outros grupos de eleitores pensarem da mesma forma eevitarem votar na Ana achando que sua eleiccedilatildeo jaacute estaacute assegurada apenas 80 de votode minoria para esses grupos jaacute eacute o suficiente para eliminaacute-la das eleiccedilotildees (Figura 42)Com a Ana eliminada a meacutedia das notas cai ainda mais para 0058

                                                                                  Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego

                                                                                  O sistema Bloc Vote eacute uma das soluccedilotildees para o voto de minoria Permitindo queos eleitores votem no mesmo nuacutemero de candidatos que de vagas a serem preenchidasnatildeo existe o iacutempeto a esse tipo de voto estrateacutegico O resultado desse sistema portantoretorna a meacutedia das notas a casa dos 29 (Figura 43) Os sistemas AVS Borda Count eSVS tambeacutem impedem a presenccedila do voto de minoria e atingem resultados semelhantes

                                                                                  52

                                                                                  Figura 43 ndash BV - Cenaacuterio 6

                                                                                  Tabela 18 ndash Resultados do Cenaacuterio 6

                                                                                  Sistema Candidatoseleitos

                                                                                  Meacutedia dasnotas

                                                                                  FPTP sem voto de minoriaAna eBeto 2929

                                                                                  FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

                                                                                  FPTP com 80 de voto de minoriaBeto eCarla 0058

                                                                                  Bloc VoteAna eCarla 2913

                                                                                  Esses resultados podem ser replicados acessando os links

                                                                                  Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

                                                                                  100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

                                                                                  80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

                                                                                  53

                                                                                  5 COMO FUNCIONA O SIMULADOR

                                                                                  O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

                                                                                  51 CLASSE ELECTIONS

                                                                                  Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

                                                                                  bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

                                                                                  Figura 44 ndash estrutura candidates

                                                                                  bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

                                                                                  bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

                                                                                  Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

                                                                                  Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

                                                                                  54

                                                                                  Figura 45 ndash estrutura voters

                                                                                  Figura 46 ndash estrutura votes

                                                                                  daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

                                                                                  Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

                                                                                  55

                                                                                  Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

                                                                                  Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

                                                                                  na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

                                                                                  56

                                                                                  Figura 49 ndash PDF - Distribuiccedilatildeo Liked

                                                                                  Figura 50 ndash CDF - Distribuiccedilatildeo Liked

                                                                                  (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

                                                                                  Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

                                                                                  57

                                                                                  Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

                                                                                  Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

                                                                                  candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

                                                                                  Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

                                                                                  58

                                                                                  Figura 53 ndash PDF - Distribuiccedilatildeo Loved

                                                                                  Figura 54 ndash CDF - Distribuiccedilatildeo Loved

                                                                                  funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

                                                                                  59

                                                                                  Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                                                                                  Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                                                                                  Meacutedia das Notas sumei

                                                                                  sumvj nij

                                                                                  etimes v

                                                                                  Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                                                                                  Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                                                                                  60

                                                                                  Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                                                                                  Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                                                                                  52 CLASSE FIRSTPASTTHEPOST

                                                                                  Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                                                                                  Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                                                                                  61

                                                                                  Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                                                                                  Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                                                                                  mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                                                                                  62

                                                                                  53 CLASSE TWOROUNDSYSTEM

                                                                                  A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                                                                                  54 CLASSE INSTANTRUNOFFVOTING

                                                                                  A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                                                                                  Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                                                                                  63

                                                                                  cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                                                                                  55 CLASSE APPROVALVOTING

                                                                                  Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                                                                                  56 CLASSE BORDACOUNT

                                                                                  Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                                                                                  57 CLASSE SCOREVOTING

                                                                                  De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                                                                                  64

                                                                                  58 CLASSE BLOCVOTE

                                                                                  O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                                                                                  59 TECNOLOGIAS UTILIZADAS

                                                                                  A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                                                                                  Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                                                                                  O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                                                                                  Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                                                                                  65

                                                                                  6 CONCLUSAtildeO

                                                                                  Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                                                                                  Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                                                                                  Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                                                                                  Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                                                                                  Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                                                                                  66

                                                                                  REFEREcircNCIAS

                                                                                  AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                                                                                  Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                                                                                  Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                                                                                  Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                                                                                  HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                                                                                  LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                                                                                  ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                                                                                  Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                                                                                  POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                                                                                  The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                                                                                  67

                                                                                  APEcircNDICES

                                                                                  APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                                                                  Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                                                                  if(not len(selfvoter_profiles))

                                                                                  for voter in range(selfN_VOTERS)

                                                                                  candidates_rank = dict()

                                                                                  for candidate in reversed(range(selfN_CANDIDATES))

                                                                                  if(selfBIAS_VECTOR[candidate]==4)

                                                                                  candidates_rank[candidate] = self_sortear(selfloved)

                                                                                  elif(selfBIAS_VECTOR[candidate]==3)

                                                                                  candidates_rank[candidate] = self_sortear(selfliked)

                                                                                  elif(selfBIAS_VECTOR[candidate]==2)

                                                                                  candidates_rank[candidate] = self_sortear(selfdisliked)

                                                                                  elif(selfBIAS_VECTOR[candidate]==1)

                                                                                  candidates_rank[candidate] = self_sortear(selfhated)

                                                                                  elif(selfBIAS_VECTOR[candidate]==-1)

                                                                                  candidates_rank[candidate] = self_sortear(selfpolarizer

                                                                                  )

                                                                                  elif(selfBIAS_VECTOR[candidate]==-2)

                                                                                  candidates_rank[candidate] = self_sortear(self

                                                                                  more_polarizer)

                                                                                  else

                                                                                  candidates_rank[candidate] = self_sortear(selfneutral)

                                                                                  selfvotersappend(candidates_rank)

                                                                                  else

                                                                                  ranges = []

                                                                                  ranks = []

                                                                                  for prof in selfvoter_profiles

                                                                                  rangesappend(int(prof[pop_percentage]))

                                                                                  rank =

                                                                                  for index score in enumerate(prof[scores])

                                                                                  rank[index] = score

                                                                                  ranksappend(rank)

                                                                                  for index _range in enumerate(ranges)

                                                                                  for _ in range(int(selfN_VOTERS(_range100)))

                                                                                  selfvotersappend(ranks[index])

                                                                                  68

                                                                                  APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                                                                  Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                                                                  for i in range(selfN_CANDIDATES)

                                                                                  selfcandidates[i] = 0

                                                                                  selfvotes[i] = set()

                                                                                  APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                                                                  Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                                                                  for candidate in range(selfN_CANDIDATES)

                                                                                  rating_sum = 0

                                                                                  for voter in selfvoters

                                                                                  rating_sum += voter[candidate]

                                                                                  selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                                                                  APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                                                                  Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                                                                  if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                                                                  return selfcalculate_mean(winners)

                                                                                  else

                                                                                  chose_best = True if winners[0] == selfbest_candidate else

                                                                                  False

                                                                                  return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                                                                  69

                                                                                  APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                                                                  Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                                                                  rating_sum = 0

                                                                                  for voter in selfvoters

                                                                                  for candidate in winners

                                                                                  rating_sum += voter[candidate]

                                                                                  return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                                                                  APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                                                                  Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                                                                  for i in range(1 selfN_VACANCIES + 2)

                                                                                  selfleading_candidatesappend(selfsorted_candidates[-i][self

                                                                                  CANDIDATE_INDEX])

                                                                                  APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                                                                  Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                                                                  for leader in selfelecrounds[-1]

                                                                                  selfleading_candidatesappend(leader[0])

                                                                                  70

                                                                                  APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                                                                  Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                                                                  self_account_for_coalitions()

                                                                                  for voter in selfvoters

                                                                                  selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                                                                  (1)))

                                                                                  temp = []

                                                                                  for voter in selfsorted_voters

                                                                                  new_dict = defaultdict(list)

                                                                                  for k in voter

                                                                                  new_dict[k[1]]append(k[0])

                                                                                  tempappend(new_dict)

                                                                                  selfsorted_voters = []

                                                                                  for voter_index current_voter in enumerate(temp)

                                                                                  new_voter = []

                                                                                  for rating candidate_indexes in current_voteritems()

                                                                                  if len(current_voter[rating]) gt 1

                                                                                  shuffle(current_voter[rating])

                                                                                  for e in candidate_indexes

                                                                                  new_voterappend((e rating))

                                                                                  else

                                                                                  new_voterappend((candidate_indexes[0] rating))

                                                                                  selfsorted_votersappend(new_voter)

                                                                                  selfcandidates[new_voter[-1][0]] += 1

                                                                                  selfvotes[new_voter[-1][0]]add(voter_index)

                                                                                  71

                                                                                  APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                                                                  Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                                                                  for candidate in selfvotes_copy

                                                                                  if candidate not in selfelecleading_candidates

                                                                                  for voter_index in selfvotes_copy[candidate]

                                                                                  for index _candidate in enumerate(reversed(selfelec

                                                                                  sorted_voters[voter_index]))

                                                                                  if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                                                                  leading_candidates

                                                                                  if randomrandom() lt selfelec

                                                                                  tactical_vote_percentages[_candidate[selfelec

                                                                                  CANDIDATE_INDEX]]

                                                                                  selfrankings_changed[voter_index] = copy

                                                                                  deepcopy(selfelecsorted_voters[voter_index])

                                                                                  selfrankings_changed[voter_index][-(index + 1)]

                                                                                  selfrankings_changed[voter_index][-1] = self

                                                                                  rankings_changed[voter_index][-1] self

                                                                                  rankings_changed[voter_index][-(index + 1)]

                                                                                  selfcandidates[candidate] -= 1

                                                                                  selfcandidates[_candidate[selfelec

                                                                                  CANDIDATE_INDEX]] += 1

                                                                                  selfvotes[candidate]remove(voter_index)

                                                                                  selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                                                                  ]]add(voter_index)

                                                                                  break

                                                                                  break

                                                                                  72

                                                                                  APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                                                                  Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                                                                  half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                                                                  for candidate in selfelecleading_candidates

                                                                                  if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                                                                  continue

                                                                                  for voter_index in selfvotes_copy[candidate]

                                                                                  if voter_index in selfrankings_changed

                                                                                  ranking = selfrankings_changed[voter_index]

                                                                                  else

                                                                                  ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                                                                  ])

                                                                                  for index _candidate in enumerate(reversed(ranking))

                                                                                  if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                  leading_candidates or (_candidate[selfelec

                                                                                  CANDIDATE_INDEX] in selfelecleading_candidates and

                                                                                  selfelecleading_candidatesindex(_candidate[selfelec

                                                                                  CANDIDATE_INDEX]) gt= half_vacancies)

                                                                                  if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                                                                  if randomrandom() lt selfelec

                                                                                  minority_vote_percentages[_candidate[selfelec

                                                                                  CANDIDATE_INDEX]]

                                                                                  selfcandidates[candidate] -= 1

                                                                                  selfcandidates[_candidate[selfelec

                                                                                  CANDIDATE_INDEX]] += 1

                                                                                  break

                                                                                  break

                                                                                  break

                                                                                  73

                                                                                  APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                                                                  Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                                                                  self_account_for_coalitions()

                                                                                  for candidate in selfvotes

                                                                                  if candidate = selfwinner and candidate = selfsecond_place

                                                                                  for voter_index in selfvotes[candidate]

                                                                                  if voter_index in selfrankings_changed

                                                                                  ranking = selfrankings_changed[voter_index]

                                                                                  else

                                                                                  ranking = copydeepcopy(selfelecsorted_voters[

                                                                                  voter_index])

                                                                                  for index2 candidate in enumerate(reversed(ranking))

                                                                                  if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                                                                  selfcandidates[selfwinner] += 1

                                                                                  selfvotes[selfwinner]add(voter_index)

                                                                                  break

                                                                                  elif candidate[selfelecCANDIDATE_INDEX] == self

                                                                                  second_place

                                                                                  selfcandidates[selfsecond_place] += 1

                                                                                  selfvotes[selfsecond_place]add(voter_index)

                                                                                  break

                                                                                  selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                  winners = []

                                                                                  vacancies = selfelecN_VACANCIES

                                                                                  for candidate in reversed(selfsorted_candidates)

                                                                                  if vacancies == 0

                                                                                  break

                                                                                  winnersappend(candidate[0])

                                                                                  vacancies -= 1

                                                                                  mean chose_best = selfelecget_mean(winners = winners)

                                                                                  74

                                                                                  APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                                                                  Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                                                                  for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                  voter_dict = dict()

                                                                                  og_voter_dict = dict()

                                                                                  for tup in voter

                                                                                  voter_dict[tup[0]] = tup[1]

                                                                                  og_voter_dict[tup[0]] = tup[1]

                                                                                  for coalition in selfeleccoalitions

                                                                                  for candidate in coalition

                                                                                  add_to_score = 0

                                                                                  for candidate2 in coalition

                                                                                  if candidate == candidate2

                                                                                  continue

                                                                                  half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                                                                  if half lt 0

                                                                                  add_to_score += mathceil(half)

                                                                                  else

                                                                                  add_to_score += mathfloor(half)

                                                                                  if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                                                                  voter_dict[candidate[rsquovaluersquo]] = 10

                                                                                  elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                                                                  voter_dict[candidate[rsquovaluersquo]] = -10

                                                                                  else

                                                                                  voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                                                                  selfrankings_changed[voter_index] = []

                                                                                  for candidate in voter_dict

                                                                                  selfrankings_changed[voter_index]append((candidate voter_dict[

                                                                                  candidate]))

                                                                                  selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                                                                  voter_index] key=lambda x x[1])

                                                                                  75

                                                                                  APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                                                  Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                                                  selfelecroundsappend(selfsorted_candidates[_round])

                                                                                  if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                  N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                                                  N_VACANCIES - 1)

                                                                                  return 2

                                                                                  elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                  N_VOTERS gt 05)

                                                                                  return 1

                                                                                  else

                                                                                  selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                                                  CANDIDATE_INDEX])

                                                                                  for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                                                  elecCANDIDATE_INDEX]]

                                                                                  if voter_index in selfrankings_changed

                                                                                  for candidate in reversed(selfrankings_changed[voter_index

                                                                                  ])

                                                                                  if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                  excluded

                                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                  ]] += 1

                                                                                  selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                  add(voter_index)

                                                                                  break

                                                                                  else

                                                                                  continue

                                                                                  else

                                                                                  for candidate in reversed(selfelecsorted_voters[

                                                                                  voter_index])

                                                                                  if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                  excluded

                                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                  ]] += 1

                                                                                  selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                  add(voter_index)

                                                                                  break

                                                                                  else

                                                                                  continue

                                                                                  selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                  return 0

                                                                                  76

                                                                                  APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                                                  Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                                                  for index in range(selfelecN_CANDIDATES)

                                                                                  selfcandidates[index] = 0

                                                                                  for voter in selfelecsorted_voters

                                                                                  for candidate in reversed(voter)

                                                                                  if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                  else

                                                                                  break

                                                                                  APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                                                  Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                                                  for index in range(selfelecN_CANDIDATES)

                                                                                  selfcandidates[index] = 0

                                                                                  for voter in selfelecsorted_voters

                                                                                  if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                  elecCANDIDATE_INDEX]]

                                                                                  selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                                                  else

                                                                                  for candidate in reversed(voter)

                                                                                  if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                  else

                                                                                  break

                                                                                  77

                                                                                  APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                                                  Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                                                  pos = set()

                                                                                  for index perc in enumerate(selfelectactical_vote_percentages)

                                                                                  if perc gt 0

                                                                                  posadd(index)

                                                                                  for candidate in selfeleccandidates

                                                                                  if candidate not in selfleading_candidates

                                                                                  for voter_index in selfvotes[candidate]

                                                                                  raised = None

                                                                                  for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                                                  ])

                                                                                  if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                                                  leading_candidates

                                                                                  if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                                                  if randomrandom() lt selfelectactical_vote_percentages[

                                                                                  candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                                                  ranking = [None]selfelecN_CANDIDATES

                                                                                  ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                  selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                  CANDIDATE_INDEX]])

                                                                                  raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                  break

                                                                                  break

                                                                                  break

                                                                                  if raised = None

                                                                                  for _candidate in selfleading_candidates

                                                                                  if _candidate = ranking[-1][0]

                                                                                  ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                  _candidate])

                                                                                  buried = _candidate

                                                                                  break

                                                                                  i = 1

                                                                                  for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                  if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                                                  buried]

                                                                                  continue

                                                                                  else

                                                                                  ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                  selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                  CANDIDATE_INDEX]])

                                                                                  i += 1

                                                                                  selfrankings_changed[voter_index] = ranking

                                                                                  78

                                                                                  APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                                                  Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                                                  for voter_index in selfvotes[candidate]

                                                                                  if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                                                  ]

                                                                                  for _candidate in selfleading_candidates

                                                                                  if _candidate = candidate

                                                                                  ranking = [None]selfelecN_CANDIDATES

                                                                                  ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                  _candidate])

                                                                                  buried = _candidate

                                                                                  break

                                                                                  i = 1

                                                                                  for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                  if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                                                  continue

                                                                                  else

                                                                                  ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                  selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                  CANDIDATE_INDEX]])

                                                                                  i += 1

                                                                                  selfrankings_changed[voter_index] = ranking

                                                                                  79

                                                                                  APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                                                  Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                                                  for index in range(selfelecN_CANDIDATES)

                                                                                  selfcandidates[index] = 0

                                                                                  for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                  score = 0

                                                                                  if voter_index in selfrankings_changed

                                                                                  for candidate in selfrankings_changed[voter_index]

                                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                  score += 1

                                                                                  else

                                                                                  for candidate in voter

                                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                  score += 1

                                                                                  APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                                                  Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                                                  for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                  if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                  elecCANDIDATE_INDEX]]

                                                                                  selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                                                  sorted_voters[voter_index])

                                                                                  for candidate_index candidate in enumerate(reversed(voter))

                                                                                  if candidate_index == 0

                                                                                  selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                  voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                                                  else

                                                                                  selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                  voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                                                  80

                                                                                  APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                                                  Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                                                  for index in range(selfelecN_CANDIDATES)

                                                                                  selfcandidates[index] = 0

                                                                                  for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                  if voter_index in selfrankings_changed

                                                                                  for candidate in selfrankings_changed[voter_index]

                                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                  selfelecCANDIDATE_RANK]

                                                                                  else

                                                                                  for candidate in voter

                                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                  selfelecCANDIDATE_RANK]

                                                                                  APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                                                  Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                                                  for index in range(selfelecN_CANDIDATES)

                                                                                  selfcandidates[index] = 0

                                                                                  for voter in selfelecsorted_voters

                                                                                  votes = selfelecN_VACANCIES

                                                                                  for candidate in reversed(voter)

                                                                                  if votes == 0

                                                                                  break

                                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                  votes -= 1

                                                                                  • Folha de aprovaccedilatildeo
                                                                                  • Agradecimentos
                                                                                  • Epiacutegrafe
                                                                                  • Resumo
                                                                                  • Abstract
                                                                                  • Lista de ilustraccedilotildees
                                                                                  • Lista de Coacutedigos
                                                                                  • Lista de tabelas
                                                                                  • Lista de abreviaturas e siglas
                                                                                  • Sumaacuterio
                                                                                  • INTRODUCcedilAtildeO
                                                                                    • MOTIVACcedilAtildeO E OBJETIVO
                                                                                    • MEacuteTODO
                                                                                    • ESTRUTURA
                                                                                      • SISTEMAS ELEITORAIS
                                                                                        • FISRT PAST THE POST
                                                                                          • Exemplo
                                                                                          • Vantagens e Desvantagens do FPTP
                                                                                          • Voto Uacutetil no FPTP
                                                                                            • TWO-ROUND SYSTEM
                                                                                              • Exemplo
                                                                                              • Vantagens e Desvantagens do TRS
                                                                                              • Voto Uacutetil no TRS
                                                                                                • INSTANT-RUNOFF VOTING
                                                                                                  • Exemplo
                                                                                                  • Vantagens e Desvantagens do IRV
                                                                                                  • Voto Uacutetil no IRV
                                                                                                    • APPROVAL VOTING SYSTEM
                                                                                                      • Exemplo
                                                                                                      • Vantagens e Desvantagens do AVS
                                                                                                      • Voto Uacutetil no AVS
                                                                                                        • THE BORDA COUNT
                                                                                                          • Exemplo
                                                                                                          • Vantagens e Desvantagens do BC
                                                                                                          • Voto Uacutetil no BC
                                                                                                            • SCORE VOTING SYSTEM
                                                                                                              • Exemplo
                                                                                                              • Vantagens e Desvantagens do SVS
                                                                                                              • Voto Uacutetil no SVS
                                                                                                                • BLOC VOTE
                                                                                                                  • Exemplo
                                                                                                                  • Voto Uacutetil no BV
                                                                                                                      • O SIMULADOR
                                                                                                                      • CENAacuteRIOS PERTINENTES
                                                                                                                        • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                                        • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                                        • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                                        • CENAacuteRIO 4 COALIZOtildeES
                                                                                                                        • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                                        • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                                          • COMO FUNCIONA O SIMULADOR
                                                                                                                            • CLASSE Elections
                                                                                                                            • CLASSE FirstPastThePost
                                                                                                                            • CLASSE TwoRoundSystem
                                                                                                                            • CLASSE InstantRunoffVoting
                                                                                                                            • CLASSE ApprovalVoting
                                                                                                                            • CLASSE BordaCount
                                                                                                                            • CLASSE ScoreVoting
                                                                                                                            • CLASSE BlocVote
                                                                                                                            • TECNOLOGIAS UTILIZADAS
                                                                                                                              • CONCLUSAtildeO
                                                                                                                              • Referecircncias
                                                                                                                              • Meacutetodo create_voters
                                                                                                                              • Meacutetodo create_candidates
                                                                                                                              • Meacutetodo calculate_means
                                                                                                                              • Meacutetodo get_mean
                                                                                                                              • Meacutetodo calculate_mean
                                                                                                                              • Meacutetodo set_leading_candidates
                                                                                                                              • Meacutetodo irv_set_leading_candidates
                                                                                                                              • Meacutetodo sort_ranks
                                                                                                                              • Meacutetodo fptp_count_tactical_votes
                                                                                                                              • Meacutetodo fptp_count_minority_votes
                                                                                                                              • Meacutetodo trs_second_round
                                                                                                                              • Meacutetodo trs_account_for_coalitions
                                                                                                                              • Meacutetodo irv_count_votes
                                                                                                                              • Meacutetodo avs_count_votes
                                                                                                                              • Meacutetodo avs_count_votes_with_tactical
                                                                                                                              • Meacutetodo irv_apply_tactical_votes
                                                                                                                              • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                                              • Meacutetodo bc_sum_candidates_scores
                                                                                                                              • Meacutetodo svs_apply_tactical_votes
                                                                                                                              • Meacutetodo svs_sum_candidates_scores
                                                                                                                              • Meacutetodo bv_count_votes

                                                                                    42

                                                                                    Cientes desse provaacutevel futuro cenaacuterio onde Ana eacute eleita uma pequena parte dos elei-tores de Beto estrategicamente o abandona e decide apoiar Carla na esperanccedila de leva-laao segundo turno contra Ana As novas distribuiccedilotildees de notas se encontram na tabelaabaixo com essa porccedilatildeo de eleitores representada pelo perfil 4

                                                                                    Tabela 13 ndash Distribuiccedilatildeo de notas com voto taacutetico - Cenaacuterio 2

                                                                                    Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                                                    deeleitores

                                                                                    1 10 5 0 422 0 10 5 283 5 0 10 284 0 8 10 2

                                                                                    Essa mudanccedila estrateacutegica de voto altera a ordem de eliminaccedilotildees do sistema com Betosendo o primeiro a ser eliminado Com isso seus votos satildeo naturalmente transferidos paraCarla que derrota Ana no segundo turno com 58 dos votos

                                                                                    Figura 27 ndash IRV primeiro turno com voto taacutetico - Cenaacuterio 2

                                                                                    Figura 28 ndash IRV segundo turno com voto taacutetico - Cenaacuterio 2

                                                                                    43

                                                                                    Percebendo que a eleiccedilatildeo de Beto natildeo era provaacutevel seus eleitores conseguiram aomenos impedir a eleiccedilatildeo do pior candidato para eles Mas para isso foi necessaacuterio queeles tivessem a informaccedilatildeo de como os outros eleitores votariam Uma aproximaccedilatildeo dessasinformaccedilotildees poderia ser obtida em um cenaacuterio real com poucos candidatos atraveacutes depesquisas eleitorais poreacutem se o nuacutemero de candidatos eacute significativo uma noccedilatildeo completadas distribuiccedilotildees dos rankings dos eleitores se torna muito menos viaacutevel e dificulta aformulaccedilatildeo de estrateacutegias para alterar a ordem em que os candidatos satildeo eliminados

                                                                                    Esses resultados podem ser replicados acessando os linksSem voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana22

                                                                                    22Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                                                    Com voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana

                                                                                    2222Beto2222Carla22]-----42Voter20Profile2001020520028Voter20Profile2010201020528Voter20Profile202520020102Voter20Profile20302082010100gt

                                                                                    43 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE

                                                                                    O interessante dos sistemas IRV e TRS eacute que os resultados do cenaacuterio anterior po-deriam ter sido obtidos ao inveacutes do voto taacutetico pela sua natildeo-monotonicidade Seriapossiacutevel que a Carla derrotasse a Ana no segundo turno atraveacutes do proacuteprio aumento depopularidade da Ana Assumindo que essa popularizaccedilatildeo ocorresse entre os candidatosdo perfil 2 onde 3 passasse a apoiar a Ana ao inveacutes do Beto as novas distribuiccedilotildeesseguiriam a tabela abaixo

                                                                                    Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                                                    Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                                                    deeleitores

                                                                                    1 10 5 0 452 0 10 5 273 5 0 10 28

                                                                                    Dessa maneira Beto agora com uma porcentagem dos eleitores menor do que a deCarla seraacute eliminado na primeira rodada e como seus eleitores tecircm a Carla como segundaopccedilatildeo ela receberaacute todos os seus votos e seraacute eleita na segunda rodada As rodadas doIRV podem ser vistas nas figuras 29 e 30

                                                                                    44

                                                                                    Figura 29 ndash IRV primeiro turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                                                    Figura 30 ndash IRV segundo turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                                                    Tabela 15 ndash Resultados do Cenaacuterio 3Candidato

                                                                                    eleitoMeacutedia das

                                                                                    notasAntes da

                                                                                    popularizaccedilatildeode Ana

                                                                                    Ana 56

                                                                                    Apoacutespopularizaccedilatildeo

                                                                                    de AnaCarla 415

                                                                                    Os efeitos dessa caracteriacutestica se refletem na satisfaccedilatildeo meacutedia da populaccedilatildeo A Ana eacuteclaramente a melhor candidata e mesmo com o seu ganho de popularidade (ou devido aele) a Carla eacute eleita

                                                                                    Esses resultados podem ser replicados acessando os linksAntes da popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecom

                                                                                    direct_res0010000---[22Ana2222Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                                                    45

                                                                                    Apoacutes popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana2222Beto2222Carla22]-----45Voter20Profile2001020520027Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                                                    44 CENAacuteRIO 4 COALIZOtildeES

                                                                                    O TRS por ser organizado em dois turnos separados normalmente a semanas dedistacircncia um do outro acaba abrindo brecha agrave mudanccedila de opiniatildeo por parte dos eleitorese o desenvolvimento de novas estrateacutegias por parte dos candidatos tais como a coalizatildeocom candidatos jaacute eliminados Com isso em mente nesse cenaacuterio teremos novamenteos quatro candidatos Ana Beto Carla e Diego Os trecircs primeiros seratildeo gerados dadistribuiccedilatildeo Neutral e Diego da distribuiccedilatildeo Disliked

                                                                                    Figura 31 ndash TRS turno 1 - Cenaacuterio 4

                                                                                    No TRS normal Ana Beto e Carla possuem com essas distribuiccedilotildees quantidades devotos muito proacuteximas com Beto e Carla indo para o segundo turno Carla estaacute 10 votosatraacutes de Beto e decide aproveitar o espaccedilo de tempo entre os dois turnos para tentaragregar mais votos Com isso Carla se aproxima de Diego e juntos formam uma coalizatildeoNo entanto com sua baixa popularidade Diego acaba ferindo a reputaccedilatildeo de Carla etorna o segundo turno muito mais faacutecil para Beto (Figura 33) Se Carla tivesse buscado osuporte de Ana por outro lado ela se veria vitoriosa no segundo turno e com uma amplavantagem sobre o Beto (Figura 34) Ou ateacute mesmo sem buscar uma coalizatildeo mesmosendo uma corrida apertada Carla teria naturalmente sido eleita (Figura 32)

                                                                                    Esses resultados podem ser replicados acessando os linksSem coalizotildees lthttpelectionsimpythonanywherecomdirect_res0100000

                                                                                    --[0002][22Ana222022Beto2222Carla2222Diego22]------100gt

                                                                                    46

                                                                                    Figura 32 ndash TRS turno 2 - Cenaacuterio 4

                                                                                    Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4

                                                                                    Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4

                                                                                    47

                                                                                    Coalizatildeo Carla e Diego lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2203Carla20Diego-100gt

                                                                                    Coalizatildeo Carla e Ana lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2200Carla20Ana-100gt

                                                                                    45 CENAacuteRIO 5 DILEMA DO PRISIONEIRO

                                                                                    Neste cenaacuterio temos uma eleiccedilatildeo de uma vaga com trecircs candidatos concorrentes e trecircsperfis distintos de eleitores que seguiratildeo as seguintes distribuiccedilotildees

                                                                                    Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5

                                                                                    Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                                                    deeleitores

                                                                                    1 10 -10 5 362 -10 10 5 343 -10 -10 5 30

                                                                                    Esse contexto nos remete ao notaacutevel dilema do prisioneiro Nele dois prisioneiroscuacutemplices satildeo interrogados individualmente sem poder se comunicar um com o outro ecada um enfrenta o dilema de delatar ou natildeo o seu parceiro Se os dois prisioneirosdecidem se manter calados sobre o crime ambos satildeo sentenciados a um ano de prisatildeo Seapenas um deles dedurar o outro o traidor sai livre enquanto seu parceiro eacute condenadoa trecircs anos Se ambos dedurarem um ao outro eles satildeo condenados juntos a dois anosde prisatildeo Esse dilema eacute uma ideia claacutessica presente no estudo da teoria dos jogos sendooriginalmente elaborada por Merrill Flood e Melvin Dresher em 1950 e mais tarde sendonomeada de dilema dos prisioneiros por Albert W Tucker (POUNDSTONE 1992)

                                                                                    O que esse dilema nos mostra eacute a tentaccedilatildeo que o indiviacuteduo deteacutem se sua racionalizaccedilatildeoestiver voltada para seus proacuteprios interesses e somente eles em oposiccedilatildeo a pensar no bemdo grupo como um todo Neste cenaacuterio encontramos dois grupos de eleitores expressiva-mente opostos os perfis 1 e 2 Se qualquer uma das preferecircncias desses perfis fosse eleitaisso significaria uma alta rejeiccedilatildeo de maior parte da populaccedilatildeo No entanto eles possuema segunda opccedilatildeo em comum a Carla que por sua vez eacute a preferecircncia do terceiro perfilPortanto a eleiccedilatildeo da Carla seria logicamente o resultado oacutetimo

                                                                                    Mesmo assim a Ana eacute eleita nos dois sistemas acima o que natildeo parece justo poispela tabela 16 eacute evidente que apenas 36 da populaccedilatildeo a aprova enquanto que os outros64 a reprovam ao maacuteximo O sistema IRV se comporta de maneira idecircntica ao TRS

                                                                                    48

                                                                                    Figura 35 ndash FPTP - Cenaacuterio 5

                                                                                    Figura 36 ndash TRS segundo turno - Cenaacuterio 5

                                                                                    nesta situaccedilatildeo Com esse resultado a meacutedia das notas eacute -28 No entanto os trecircs sistemasseguintes nos apresentam resultados diferentes

                                                                                    Tabela 17 ndash Resultados do Cenaacuterio 5

                                                                                    Sistema Candidatoeleito

                                                                                    Meacutedia dasnotas

                                                                                    FPTP Ana -28TRS Ana -28IRV Ana -28AVS Carla 50BC Carla 50SVS Carla 50

                                                                                    49

                                                                                    Figura 37 ndash AVS - Cenaacuterio 5

                                                                                    Figura 38 ndash BC - Cenaacuterio 5

                                                                                    Tanto o AVS quanto o Borda Count e o SVS satildeo sistemas que consideram todasas opiniotildees de cada eleitor ao mesmo tempo e por isso satildeo capazes de eleger o melhorcandidato nesta situaccedilatildeo diferentemente do TRS que natildeo absorve completamente todosentimento do eleitor por todos os candidatos e o IRV que apesar de ser bem expressivoquebra esse processo em inuacutemeras rodadas o que permite a perda de informaccedilatildeo ao longodelas

                                                                                    Esses resultados podem ser replicados acessando o linklthttpelectionsimpythonanywherecomdirect_res1111110---[22Ana

                                                                                    222022Beto222022Carla22]-----36Voter20Profile2001020-1020534Voter20Profile201-10201020530Voter20Profile202-1020-10205100gt

                                                                                    50

                                                                                    Figura 39 ndash SVS - Cenaacuterio 5

                                                                                    46 CENAacuteRIO 6 VOTO DE MINORIA

                                                                                    Neste cenaacuterio temos uma eleiccedilatildeo com quatro candidatos e duas vagas A Ana seraacutea preferecircncia de uma extensa parte da populaccedilatildeo (distribuiccedilatildeo Loved Figura 53) Betoe Carla seratildeo candidatos razoavelmente populares (distribuiccedilatildeo Neutral Figura 47) eDiego seraacute a preferecircncia de apenas um pequeno grupo especiacutefico e rejeitado pela maioria(distribuiccedilatildeo Disliked Figura 51) Eacute intuitivo esperar que os dois candidatos eleitos seratildeoa Ana e ou o Beto ou a Carla e isso eacute exatamente o que ocorre na figura 40 no sistemaFPTP sem voto de minoria

                                                                                    Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria

                                                                                    Eacute evidente a discrepacircncia da quantidade de votos da Ana para os outros candidatose apesar de Beto e Carla serem mais populares que Diego os trecircs natildeo se encontrammuito afastados Poreacutem se a pequena fraccedilatildeo de candidatos que possuem a Ana como

                                                                                    51

                                                                                    Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego

                                                                                    preferecircncia e Diego como segunda opccedilatildeo optarem pelo voto de minoria a situaccedilatildeo mudacompletamente (Figura 41) Assim apesar de extensamente rejeitado Diego conquistaa segunda vaga e a meacutedia das notas despenca de 2929 para 0505 No entanto aindaexiste um cenaacuterio pior Se os outros grupos de eleitores pensarem da mesma forma eevitarem votar na Ana achando que sua eleiccedilatildeo jaacute estaacute assegurada apenas 80 de votode minoria para esses grupos jaacute eacute o suficiente para eliminaacute-la das eleiccedilotildees (Figura 42)Com a Ana eliminada a meacutedia das notas cai ainda mais para 0058

                                                                                    Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego

                                                                                    O sistema Bloc Vote eacute uma das soluccedilotildees para o voto de minoria Permitindo queos eleitores votem no mesmo nuacutemero de candidatos que de vagas a serem preenchidasnatildeo existe o iacutempeto a esse tipo de voto estrateacutegico O resultado desse sistema portantoretorna a meacutedia das notas a casa dos 29 (Figura 43) Os sistemas AVS Borda Count eSVS tambeacutem impedem a presenccedila do voto de minoria e atingem resultados semelhantes

                                                                                    52

                                                                                    Figura 43 ndash BV - Cenaacuterio 6

                                                                                    Tabela 18 ndash Resultados do Cenaacuterio 6

                                                                                    Sistema Candidatoseleitos

                                                                                    Meacutedia dasnotas

                                                                                    FPTP sem voto de minoriaAna eBeto 2929

                                                                                    FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

                                                                                    FPTP com 80 de voto de minoriaBeto eCarla 0058

                                                                                    Bloc VoteAna eCarla 2913

                                                                                    Esses resultados podem ser replicados acessando os links

                                                                                    Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

                                                                                    100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

                                                                                    80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

                                                                                    53

                                                                                    5 COMO FUNCIONA O SIMULADOR

                                                                                    O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

                                                                                    51 CLASSE ELECTIONS

                                                                                    Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

                                                                                    bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

                                                                                    Figura 44 ndash estrutura candidates

                                                                                    bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

                                                                                    bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

                                                                                    Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

                                                                                    Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

                                                                                    54

                                                                                    Figura 45 ndash estrutura voters

                                                                                    Figura 46 ndash estrutura votes

                                                                                    daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

                                                                                    Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

                                                                                    55

                                                                                    Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

                                                                                    Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

                                                                                    na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

                                                                                    56

                                                                                    Figura 49 ndash PDF - Distribuiccedilatildeo Liked

                                                                                    Figura 50 ndash CDF - Distribuiccedilatildeo Liked

                                                                                    (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

                                                                                    Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

                                                                                    57

                                                                                    Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

                                                                                    Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

                                                                                    candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

                                                                                    Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

                                                                                    58

                                                                                    Figura 53 ndash PDF - Distribuiccedilatildeo Loved

                                                                                    Figura 54 ndash CDF - Distribuiccedilatildeo Loved

                                                                                    funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

                                                                                    59

                                                                                    Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                                                                                    Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                                                                                    Meacutedia das Notas sumei

                                                                                    sumvj nij

                                                                                    etimes v

                                                                                    Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                                                                                    Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                                                                                    60

                                                                                    Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                                                                                    Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                                                                                    52 CLASSE FIRSTPASTTHEPOST

                                                                                    Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                                                                                    Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                                                                                    61

                                                                                    Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                                                                                    Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                                                                                    mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                                                                                    62

                                                                                    53 CLASSE TWOROUNDSYSTEM

                                                                                    A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                                                                                    54 CLASSE INSTANTRUNOFFVOTING

                                                                                    A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                                                                                    Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                                                                                    63

                                                                                    cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                                                                                    55 CLASSE APPROVALVOTING

                                                                                    Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                                                                                    56 CLASSE BORDACOUNT

                                                                                    Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                                                                                    57 CLASSE SCOREVOTING

                                                                                    De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                                                                                    64

                                                                                    58 CLASSE BLOCVOTE

                                                                                    O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                                                                                    59 TECNOLOGIAS UTILIZADAS

                                                                                    A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                                                                                    Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                                                                                    O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                                                                                    Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                                                                                    65

                                                                                    6 CONCLUSAtildeO

                                                                                    Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                                                                                    Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                                                                                    Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                                                                                    Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                                                                                    Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                                                                                    66

                                                                                    REFEREcircNCIAS

                                                                                    AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                                                                                    Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                                                                                    Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                                                                                    Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                                                                                    HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                                                                                    LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                                                                                    ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                                                                                    Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                                                                                    POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                                                                                    The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                                                                                    67

                                                                                    APEcircNDICES

                                                                                    APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                                                                    Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                                                                    if(not len(selfvoter_profiles))

                                                                                    for voter in range(selfN_VOTERS)

                                                                                    candidates_rank = dict()

                                                                                    for candidate in reversed(range(selfN_CANDIDATES))

                                                                                    if(selfBIAS_VECTOR[candidate]==4)

                                                                                    candidates_rank[candidate] = self_sortear(selfloved)

                                                                                    elif(selfBIAS_VECTOR[candidate]==3)

                                                                                    candidates_rank[candidate] = self_sortear(selfliked)

                                                                                    elif(selfBIAS_VECTOR[candidate]==2)

                                                                                    candidates_rank[candidate] = self_sortear(selfdisliked)

                                                                                    elif(selfBIAS_VECTOR[candidate]==1)

                                                                                    candidates_rank[candidate] = self_sortear(selfhated)

                                                                                    elif(selfBIAS_VECTOR[candidate]==-1)

                                                                                    candidates_rank[candidate] = self_sortear(selfpolarizer

                                                                                    )

                                                                                    elif(selfBIAS_VECTOR[candidate]==-2)

                                                                                    candidates_rank[candidate] = self_sortear(self

                                                                                    more_polarizer)

                                                                                    else

                                                                                    candidates_rank[candidate] = self_sortear(selfneutral)

                                                                                    selfvotersappend(candidates_rank)

                                                                                    else

                                                                                    ranges = []

                                                                                    ranks = []

                                                                                    for prof in selfvoter_profiles

                                                                                    rangesappend(int(prof[pop_percentage]))

                                                                                    rank =

                                                                                    for index score in enumerate(prof[scores])

                                                                                    rank[index] = score

                                                                                    ranksappend(rank)

                                                                                    for index _range in enumerate(ranges)

                                                                                    for _ in range(int(selfN_VOTERS(_range100)))

                                                                                    selfvotersappend(ranks[index])

                                                                                    68

                                                                                    APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                                                                    Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                                                                    for i in range(selfN_CANDIDATES)

                                                                                    selfcandidates[i] = 0

                                                                                    selfvotes[i] = set()

                                                                                    APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                                                                    Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                                                                    for candidate in range(selfN_CANDIDATES)

                                                                                    rating_sum = 0

                                                                                    for voter in selfvoters

                                                                                    rating_sum += voter[candidate]

                                                                                    selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                                                                    APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                                                                    Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                                                                    if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                                                                    return selfcalculate_mean(winners)

                                                                                    else

                                                                                    chose_best = True if winners[0] == selfbest_candidate else

                                                                                    False

                                                                                    return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                                                                    69

                                                                                    APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                                                                    Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                                                                    rating_sum = 0

                                                                                    for voter in selfvoters

                                                                                    for candidate in winners

                                                                                    rating_sum += voter[candidate]

                                                                                    return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                                                                    APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                                                                    Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                                                                    for i in range(1 selfN_VACANCIES + 2)

                                                                                    selfleading_candidatesappend(selfsorted_candidates[-i][self

                                                                                    CANDIDATE_INDEX])

                                                                                    APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                                                                    Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                                                                    for leader in selfelecrounds[-1]

                                                                                    selfleading_candidatesappend(leader[0])

                                                                                    70

                                                                                    APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                                                                    Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                                                                    self_account_for_coalitions()

                                                                                    for voter in selfvoters

                                                                                    selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                                                                    (1)))

                                                                                    temp = []

                                                                                    for voter in selfsorted_voters

                                                                                    new_dict = defaultdict(list)

                                                                                    for k in voter

                                                                                    new_dict[k[1]]append(k[0])

                                                                                    tempappend(new_dict)

                                                                                    selfsorted_voters = []

                                                                                    for voter_index current_voter in enumerate(temp)

                                                                                    new_voter = []

                                                                                    for rating candidate_indexes in current_voteritems()

                                                                                    if len(current_voter[rating]) gt 1

                                                                                    shuffle(current_voter[rating])

                                                                                    for e in candidate_indexes

                                                                                    new_voterappend((e rating))

                                                                                    else

                                                                                    new_voterappend((candidate_indexes[0] rating))

                                                                                    selfsorted_votersappend(new_voter)

                                                                                    selfcandidates[new_voter[-1][0]] += 1

                                                                                    selfvotes[new_voter[-1][0]]add(voter_index)

                                                                                    71

                                                                                    APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                                                                    Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                                                                    for candidate in selfvotes_copy

                                                                                    if candidate not in selfelecleading_candidates

                                                                                    for voter_index in selfvotes_copy[candidate]

                                                                                    for index _candidate in enumerate(reversed(selfelec

                                                                                    sorted_voters[voter_index]))

                                                                                    if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                                                                    leading_candidates

                                                                                    if randomrandom() lt selfelec

                                                                                    tactical_vote_percentages[_candidate[selfelec

                                                                                    CANDIDATE_INDEX]]

                                                                                    selfrankings_changed[voter_index] = copy

                                                                                    deepcopy(selfelecsorted_voters[voter_index])

                                                                                    selfrankings_changed[voter_index][-(index + 1)]

                                                                                    selfrankings_changed[voter_index][-1] = self

                                                                                    rankings_changed[voter_index][-1] self

                                                                                    rankings_changed[voter_index][-(index + 1)]

                                                                                    selfcandidates[candidate] -= 1

                                                                                    selfcandidates[_candidate[selfelec

                                                                                    CANDIDATE_INDEX]] += 1

                                                                                    selfvotes[candidate]remove(voter_index)

                                                                                    selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                                                                    ]]add(voter_index)

                                                                                    break

                                                                                    break

                                                                                    72

                                                                                    APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                                                                    Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                                                                    half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                                                                    for candidate in selfelecleading_candidates

                                                                                    if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                                                                    continue

                                                                                    for voter_index in selfvotes_copy[candidate]

                                                                                    if voter_index in selfrankings_changed

                                                                                    ranking = selfrankings_changed[voter_index]

                                                                                    else

                                                                                    ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                                                                    ])

                                                                                    for index _candidate in enumerate(reversed(ranking))

                                                                                    if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                    leading_candidates or (_candidate[selfelec

                                                                                    CANDIDATE_INDEX] in selfelecleading_candidates and

                                                                                    selfelecleading_candidatesindex(_candidate[selfelec

                                                                                    CANDIDATE_INDEX]) gt= half_vacancies)

                                                                                    if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                                                                    if randomrandom() lt selfelec

                                                                                    minority_vote_percentages[_candidate[selfelec

                                                                                    CANDIDATE_INDEX]]

                                                                                    selfcandidates[candidate] -= 1

                                                                                    selfcandidates[_candidate[selfelec

                                                                                    CANDIDATE_INDEX]] += 1

                                                                                    break

                                                                                    break

                                                                                    break

                                                                                    73

                                                                                    APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                                                                    Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                                                                    self_account_for_coalitions()

                                                                                    for candidate in selfvotes

                                                                                    if candidate = selfwinner and candidate = selfsecond_place

                                                                                    for voter_index in selfvotes[candidate]

                                                                                    if voter_index in selfrankings_changed

                                                                                    ranking = selfrankings_changed[voter_index]

                                                                                    else

                                                                                    ranking = copydeepcopy(selfelecsorted_voters[

                                                                                    voter_index])

                                                                                    for index2 candidate in enumerate(reversed(ranking))

                                                                                    if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                                                                    selfcandidates[selfwinner] += 1

                                                                                    selfvotes[selfwinner]add(voter_index)

                                                                                    break

                                                                                    elif candidate[selfelecCANDIDATE_INDEX] == self

                                                                                    second_place

                                                                                    selfcandidates[selfsecond_place] += 1

                                                                                    selfvotes[selfsecond_place]add(voter_index)

                                                                                    break

                                                                                    selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                    winners = []

                                                                                    vacancies = selfelecN_VACANCIES

                                                                                    for candidate in reversed(selfsorted_candidates)

                                                                                    if vacancies == 0

                                                                                    break

                                                                                    winnersappend(candidate[0])

                                                                                    vacancies -= 1

                                                                                    mean chose_best = selfelecget_mean(winners = winners)

                                                                                    74

                                                                                    APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                                                                    Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                                                                    for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                    voter_dict = dict()

                                                                                    og_voter_dict = dict()

                                                                                    for tup in voter

                                                                                    voter_dict[tup[0]] = tup[1]

                                                                                    og_voter_dict[tup[0]] = tup[1]

                                                                                    for coalition in selfeleccoalitions

                                                                                    for candidate in coalition

                                                                                    add_to_score = 0

                                                                                    for candidate2 in coalition

                                                                                    if candidate == candidate2

                                                                                    continue

                                                                                    half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                                                                    if half lt 0

                                                                                    add_to_score += mathceil(half)

                                                                                    else

                                                                                    add_to_score += mathfloor(half)

                                                                                    if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                                                                    voter_dict[candidate[rsquovaluersquo]] = 10

                                                                                    elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                                                                    voter_dict[candidate[rsquovaluersquo]] = -10

                                                                                    else

                                                                                    voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                                                                    selfrankings_changed[voter_index] = []

                                                                                    for candidate in voter_dict

                                                                                    selfrankings_changed[voter_index]append((candidate voter_dict[

                                                                                    candidate]))

                                                                                    selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                                                                    voter_index] key=lambda x x[1])

                                                                                    75

                                                                                    APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                                                    Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                                                    selfelecroundsappend(selfsorted_candidates[_round])

                                                                                    if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                    N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                                                    N_VACANCIES - 1)

                                                                                    return 2

                                                                                    elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                    N_VOTERS gt 05)

                                                                                    return 1

                                                                                    else

                                                                                    selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                                                    CANDIDATE_INDEX])

                                                                                    for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                                                    elecCANDIDATE_INDEX]]

                                                                                    if voter_index in selfrankings_changed

                                                                                    for candidate in reversed(selfrankings_changed[voter_index

                                                                                    ])

                                                                                    if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                    excluded

                                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                    ]] += 1

                                                                                    selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                    add(voter_index)

                                                                                    break

                                                                                    else

                                                                                    continue

                                                                                    else

                                                                                    for candidate in reversed(selfelecsorted_voters[

                                                                                    voter_index])

                                                                                    if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                    excluded

                                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                    ]] += 1

                                                                                    selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                    add(voter_index)

                                                                                    break

                                                                                    else

                                                                                    continue

                                                                                    selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                    return 0

                                                                                    76

                                                                                    APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                                                    Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                                                    for index in range(selfelecN_CANDIDATES)

                                                                                    selfcandidates[index] = 0

                                                                                    for voter in selfelecsorted_voters

                                                                                    for candidate in reversed(voter)

                                                                                    if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                    else

                                                                                    break

                                                                                    APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                                                    Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                                                    for index in range(selfelecN_CANDIDATES)

                                                                                    selfcandidates[index] = 0

                                                                                    for voter in selfelecsorted_voters

                                                                                    if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                    elecCANDIDATE_INDEX]]

                                                                                    selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                                                    else

                                                                                    for candidate in reversed(voter)

                                                                                    if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                    else

                                                                                    break

                                                                                    77

                                                                                    APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                                                    Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                                                    pos = set()

                                                                                    for index perc in enumerate(selfelectactical_vote_percentages)

                                                                                    if perc gt 0

                                                                                    posadd(index)

                                                                                    for candidate in selfeleccandidates

                                                                                    if candidate not in selfleading_candidates

                                                                                    for voter_index in selfvotes[candidate]

                                                                                    raised = None

                                                                                    for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                                                    ])

                                                                                    if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                                                    leading_candidates

                                                                                    if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                                                    if randomrandom() lt selfelectactical_vote_percentages[

                                                                                    candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                                                    ranking = [None]selfelecN_CANDIDATES

                                                                                    ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                    selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                    CANDIDATE_INDEX]])

                                                                                    raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                    break

                                                                                    break

                                                                                    break

                                                                                    if raised = None

                                                                                    for _candidate in selfleading_candidates

                                                                                    if _candidate = ranking[-1][0]

                                                                                    ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                    _candidate])

                                                                                    buried = _candidate

                                                                                    break

                                                                                    i = 1

                                                                                    for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                    if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                                                    buried]

                                                                                    continue

                                                                                    else

                                                                                    ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                    selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                    CANDIDATE_INDEX]])

                                                                                    i += 1

                                                                                    selfrankings_changed[voter_index] = ranking

                                                                                    78

                                                                                    APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                                                    Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                                                    for voter_index in selfvotes[candidate]

                                                                                    if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                                                    ]

                                                                                    for _candidate in selfleading_candidates

                                                                                    if _candidate = candidate

                                                                                    ranking = [None]selfelecN_CANDIDATES

                                                                                    ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                    _candidate])

                                                                                    buried = _candidate

                                                                                    break

                                                                                    i = 1

                                                                                    for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                    if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                                                    continue

                                                                                    else

                                                                                    ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                    selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                    CANDIDATE_INDEX]])

                                                                                    i += 1

                                                                                    selfrankings_changed[voter_index] = ranking

                                                                                    79

                                                                                    APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                                                    Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                                                    for index in range(selfelecN_CANDIDATES)

                                                                                    selfcandidates[index] = 0

                                                                                    for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                    score = 0

                                                                                    if voter_index in selfrankings_changed

                                                                                    for candidate in selfrankings_changed[voter_index]

                                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                    score += 1

                                                                                    else

                                                                                    for candidate in voter

                                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                    score += 1

                                                                                    APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                                                    Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                                                    for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                    if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                    elecCANDIDATE_INDEX]]

                                                                                    selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                                                    sorted_voters[voter_index])

                                                                                    for candidate_index candidate in enumerate(reversed(voter))

                                                                                    if candidate_index == 0

                                                                                    selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                    voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                                                    else

                                                                                    selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                    voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                                                    80

                                                                                    APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                                                    Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                                                    for index in range(selfelecN_CANDIDATES)

                                                                                    selfcandidates[index] = 0

                                                                                    for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                    if voter_index in selfrankings_changed

                                                                                    for candidate in selfrankings_changed[voter_index]

                                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                    selfelecCANDIDATE_RANK]

                                                                                    else

                                                                                    for candidate in voter

                                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                    selfelecCANDIDATE_RANK]

                                                                                    APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                                                    Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                                                    for index in range(selfelecN_CANDIDATES)

                                                                                    selfcandidates[index] = 0

                                                                                    for voter in selfelecsorted_voters

                                                                                    votes = selfelecN_VACANCIES

                                                                                    for candidate in reversed(voter)

                                                                                    if votes == 0

                                                                                    break

                                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                    votes -= 1

                                                                                    • Folha de aprovaccedilatildeo
                                                                                    • Agradecimentos
                                                                                    • Epiacutegrafe
                                                                                    • Resumo
                                                                                    • Abstract
                                                                                    • Lista de ilustraccedilotildees
                                                                                    • Lista de Coacutedigos
                                                                                    • Lista de tabelas
                                                                                    • Lista de abreviaturas e siglas
                                                                                    • Sumaacuterio
                                                                                    • INTRODUCcedilAtildeO
                                                                                      • MOTIVACcedilAtildeO E OBJETIVO
                                                                                      • MEacuteTODO
                                                                                      • ESTRUTURA
                                                                                        • SISTEMAS ELEITORAIS
                                                                                          • FISRT PAST THE POST
                                                                                            • Exemplo
                                                                                            • Vantagens e Desvantagens do FPTP
                                                                                            • Voto Uacutetil no FPTP
                                                                                              • TWO-ROUND SYSTEM
                                                                                                • Exemplo
                                                                                                • Vantagens e Desvantagens do TRS
                                                                                                • Voto Uacutetil no TRS
                                                                                                  • INSTANT-RUNOFF VOTING
                                                                                                    • Exemplo
                                                                                                    • Vantagens e Desvantagens do IRV
                                                                                                    • Voto Uacutetil no IRV
                                                                                                      • APPROVAL VOTING SYSTEM
                                                                                                        • Exemplo
                                                                                                        • Vantagens e Desvantagens do AVS
                                                                                                        • Voto Uacutetil no AVS
                                                                                                          • THE BORDA COUNT
                                                                                                            • Exemplo
                                                                                                            • Vantagens e Desvantagens do BC
                                                                                                            • Voto Uacutetil no BC
                                                                                                              • SCORE VOTING SYSTEM
                                                                                                                • Exemplo
                                                                                                                • Vantagens e Desvantagens do SVS
                                                                                                                • Voto Uacutetil no SVS
                                                                                                                  • BLOC VOTE
                                                                                                                    • Exemplo
                                                                                                                    • Voto Uacutetil no BV
                                                                                                                        • O SIMULADOR
                                                                                                                        • CENAacuteRIOS PERTINENTES
                                                                                                                          • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                                          • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                                          • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                                          • CENAacuteRIO 4 COALIZOtildeES
                                                                                                                          • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                                          • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                                            • COMO FUNCIONA O SIMULADOR
                                                                                                                              • CLASSE Elections
                                                                                                                              • CLASSE FirstPastThePost
                                                                                                                              • CLASSE TwoRoundSystem
                                                                                                                              • CLASSE InstantRunoffVoting
                                                                                                                              • CLASSE ApprovalVoting
                                                                                                                              • CLASSE BordaCount
                                                                                                                              • CLASSE ScoreVoting
                                                                                                                              • CLASSE BlocVote
                                                                                                                              • TECNOLOGIAS UTILIZADAS
                                                                                                                                • CONCLUSAtildeO
                                                                                                                                • Referecircncias
                                                                                                                                • Meacutetodo create_voters
                                                                                                                                • Meacutetodo create_candidates
                                                                                                                                • Meacutetodo calculate_means
                                                                                                                                • Meacutetodo get_mean
                                                                                                                                • Meacutetodo calculate_mean
                                                                                                                                • Meacutetodo set_leading_candidates
                                                                                                                                • Meacutetodo irv_set_leading_candidates
                                                                                                                                • Meacutetodo sort_ranks
                                                                                                                                • Meacutetodo fptp_count_tactical_votes
                                                                                                                                • Meacutetodo fptp_count_minority_votes
                                                                                                                                • Meacutetodo trs_second_round
                                                                                                                                • Meacutetodo trs_account_for_coalitions
                                                                                                                                • Meacutetodo irv_count_votes
                                                                                                                                • Meacutetodo avs_count_votes
                                                                                                                                • Meacutetodo avs_count_votes_with_tactical
                                                                                                                                • Meacutetodo irv_apply_tactical_votes
                                                                                                                                • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                                                • Meacutetodo bc_sum_candidates_scores
                                                                                                                                • Meacutetodo svs_apply_tactical_votes
                                                                                                                                • Meacutetodo svs_sum_candidates_scores
                                                                                                                                • Meacutetodo bv_count_votes

                                                                                      43

                                                                                      Percebendo que a eleiccedilatildeo de Beto natildeo era provaacutevel seus eleitores conseguiram aomenos impedir a eleiccedilatildeo do pior candidato para eles Mas para isso foi necessaacuterio queeles tivessem a informaccedilatildeo de como os outros eleitores votariam Uma aproximaccedilatildeo dessasinformaccedilotildees poderia ser obtida em um cenaacuterio real com poucos candidatos atraveacutes depesquisas eleitorais poreacutem se o nuacutemero de candidatos eacute significativo uma noccedilatildeo completadas distribuiccedilotildees dos rankings dos eleitores se torna muito menos viaacutevel e dificulta aformulaccedilatildeo de estrateacutegias para alterar a ordem em que os candidatos satildeo eliminados

                                                                                      Esses resultados podem ser replicados acessando os linksSem voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana22

                                                                                      22Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                                                      Com voto taacuteticolthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana

                                                                                      2222Beto2222Carla22]-----42Voter20Profile2001020520028Voter20Profile2010201020528Voter20Profile202520020102Voter20Profile20302082010100gt

                                                                                      43 CENAacuteRIO 3 NAtildeO-MONOTONICIDADE

                                                                                      O interessante dos sistemas IRV e TRS eacute que os resultados do cenaacuterio anterior po-deriam ter sido obtidos ao inveacutes do voto taacutetico pela sua natildeo-monotonicidade Seriapossiacutevel que a Carla derrotasse a Ana no segundo turno atraveacutes do proacuteprio aumento depopularidade da Ana Assumindo que essa popularizaccedilatildeo ocorresse entre os candidatosdo perfil 2 onde 3 passasse a apoiar a Ana ao inveacutes do Beto as novas distribuiccedilotildeesseguiriam a tabela abaixo

                                                                                      Tabela 14 ndash Distribuiccedilatildeo de notas apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                                                      Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                                                      deeleitores

                                                                                      1 10 5 0 452 0 10 5 273 5 0 10 28

                                                                                      Dessa maneira Beto agora com uma porcentagem dos eleitores menor do que a deCarla seraacute eliminado na primeira rodada e como seus eleitores tecircm a Carla como segundaopccedilatildeo ela receberaacute todos os seus votos e seraacute eleita na segunda rodada As rodadas doIRV podem ser vistas nas figuras 29 e 30

                                                                                      44

                                                                                      Figura 29 ndash IRV primeiro turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                                                      Figura 30 ndash IRV segundo turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                                                      Tabela 15 ndash Resultados do Cenaacuterio 3Candidato

                                                                                      eleitoMeacutedia das

                                                                                      notasAntes da

                                                                                      popularizaccedilatildeode Ana

                                                                                      Ana 56

                                                                                      Apoacutespopularizaccedilatildeo

                                                                                      de AnaCarla 415

                                                                                      Os efeitos dessa caracteriacutestica se refletem na satisfaccedilatildeo meacutedia da populaccedilatildeo A Ana eacuteclaramente a melhor candidata e mesmo com o seu ganho de popularidade (ou devido aele) a Carla eacute eleita

                                                                                      Esses resultados podem ser replicados acessando os linksAntes da popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecom

                                                                                      direct_res0010000---[22Ana2222Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                                                      45

                                                                                      Apoacutes popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana2222Beto2222Carla22]-----45Voter20Profile2001020520027Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                                                      44 CENAacuteRIO 4 COALIZOtildeES

                                                                                      O TRS por ser organizado em dois turnos separados normalmente a semanas dedistacircncia um do outro acaba abrindo brecha agrave mudanccedila de opiniatildeo por parte dos eleitorese o desenvolvimento de novas estrateacutegias por parte dos candidatos tais como a coalizatildeocom candidatos jaacute eliminados Com isso em mente nesse cenaacuterio teremos novamenteos quatro candidatos Ana Beto Carla e Diego Os trecircs primeiros seratildeo gerados dadistribuiccedilatildeo Neutral e Diego da distribuiccedilatildeo Disliked

                                                                                      Figura 31 ndash TRS turno 1 - Cenaacuterio 4

                                                                                      No TRS normal Ana Beto e Carla possuem com essas distribuiccedilotildees quantidades devotos muito proacuteximas com Beto e Carla indo para o segundo turno Carla estaacute 10 votosatraacutes de Beto e decide aproveitar o espaccedilo de tempo entre os dois turnos para tentaragregar mais votos Com isso Carla se aproxima de Diego e juntos formam uma coalizatildeoNo entanto com sua baixa popularidade Diego acaba ferindo a reputaccedilatildeo de Carla etorna o segundo turno muito mais faacutecil para Beto (Figura 33) Se Carla tivesse buscado osuporte de Ana por outro lado ela se veria vitoriosa no segundo turno e com uma amplavantagem sobre o Beto (Figura 34) Ou ateacute mesmo sem buscar uma coalizatildeo mesmosendo uma corrida apertada Carla teria naturalmente sido eleita (Figura 32)

                                                                                      Esses resultados podem ser replicados acessando os linksSem coalizotildees lthttpelectionsimpythonanywherecomdirect_res0100000

                                                                                      --[0002][22Ana222022Beto2222Carla2222Diego22]------100gt

                                                                                      46

                                                                                      Figura 32 ndash TRS turno 2 - Cenaacuterio 4

                                                                                      Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4

                                                                                      Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4

                                                                                      47

                                                                                      Coalizatildeo Carla e Diego lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2203Carla20Diego-100gt

                                                                                      Coalizatildeo Carla e Ana lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2200Carla20Ana-100gt

                                                                                      45 CENAacuteRIO 5 DILEMA DO PRISIONEIRO

                                                                                      Neste cenaacuterio temos uma eleiccedilatildeo de uma vaga com trecircs candidatos concorrentes e trecircsperfis distintos de eleitores que seguiratildeo as seguintes distribuiccedilotildees

                                                                                      Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5

                                                                                      Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                                                      deeleitores

                                                                                      1 10 -10 5 362 -10 10 5 343 -10 -10 5 30

                                                                                      Esse contexto nos remete ao notaacutevel dilema do prisioneiro Nele dois prisioneiroscuacutemplices satildeo interrogados individualmente sem poder se comunicar um com o outro ecada um enfrenta o dilema de delatar ou natildeo o seu parceiro Se os dois prisioneirosdecidem se manter calados sobre o crime ambos satildeo sentenciados a um ano de prisatildeo Seapenas um deles dedurar o outro o traidor sai livre enquanto seu parceiro eacute condenadoa trecircs anos Se ambos dedurarem um ao outro eles satildeo condenados juntos a dois anosde prisatildeo Esse dilema eacute uma ideia claacutessica presente no estudo da teoria dos jogos sendooriginalmente elaborada por Merrill Flood e Melvin Dresher em 1950 e mais tarde sendonomeada de dilema dos prisioneiros por Albert W Tucker (POUNDSTONE 1992)

                                                                                      O que esse dilema nos mostra eacute a tentaccedilatildeo que o indiviacuteduo deteacutem se sua racionalizaccedilatildeoestiver voltada para seus proacuteprios interesses e somente eles em oposiccedilatildeo a pensar no bemdo grupo como um todo Neste cenaacuterio encontramos dois grupos de eleitores expressiva-mente opostos os perfis 1 e 2 Se qualquer uma das preferecircncias desses perfis fosse eleitaisso significaria uma alta rejeiccedilatildeo de maior parte da populaccedilatildeo No entanto eles possuema segunda opccedilatildeo em comum a Carla que por sua vez eacute a preferecircncia do terceiro perfilPortanto a eleiccedilatildeo da Carla seria logicamente o resultado oacutetimo

                                                                                      Mesmo assim a Ana eacute eleita nos dois sistemas acima o que natildeo parece justo poispela tabela 16 eacute evidente que apenas 36 da populaccedilatildeo a aprova enquanto que os outros64 a reprovam ao maacuteximo O sistema IRV se comporta de maneira idecircntica ao TRS

                                                                                      48

                                                                                      Figura 35 ndash FPTP - Cenaacuterio 5

                                                                                      Figura 36 ndash TRS segundo turno - Cenaacuterio 5

                                                                                      nesta situaccedilatildeo Com esse resultado a meacutedia das notas eacute -28 No entanto os trecircs sistemasseguintes nos apresentam resultados diferentes

                                                                                      Tabela 17 ndash Resultados do Cenaacuterio 5

                                                                                      Sistema Candidatoeleito

                                                                                      Meacutedia dasnotas

                                                                                      FPTP Ana -28TRS Ana -28IRV Ana -28AVS Carla 50BC Carla 50SVS Carla 50

                                                                                      49

                                                                                      Figura 37 ndash AVS - Cenaacuterio 5

                                                                                      Figura 38 ndash BC - Cenaacuterio 5

                                                                                      Tanto o AVS quanto o Borda Count e o SVS satildeo sistemas que consideram todasas opiniotildees de cada eleitor ao mesmo tempo e por isso satildeo capazes de eleger o melhorcandidato nesta situaccedilatildeo diferentemente do TRS que natildeo absorve completamente todosentimento do eleitor por todos os candidatos e o IRV que apesar de ser bem expressivoquebra esse processo em inuacutemeras rodadas o que permite a perda de informaccedilatildeo ao longodelas

                                                                                      Esses resultados podem ser replicados acessando o linklthttpelectionsimpythonanywherecomdirect_res1111110---[22Ana

                                                                                      222022Beto222022Carla22]-----36Voter20Profile2001020-1020534Voter20Profile201-10201020530Voter20Profile202-1020-10205100gt

                                                                                      50

                                                                                      Figura 39 ndash SVS - Cenaacuterio 5

                                                                                      46 CENAacuteRIO 6 VOTO DE MINORIA

                                                                                      Neste cenaacuterio temos uma eleiccedilatildeo com quatro candidatos e duas vagas A Ana seraacutea preferecircncia de uma extensa parte da populaccedilatildeo (distribuiccedilatildeo Loved Figura 53) Betoe Carla seratildeo candidatos razoavelmente populares (distribuiccedilatildeo Neutral Figura 47) eDiego seraacute a preferecircncia de apenas um pequeno grupo especiacutefico e rejeitado pela maioria(distribuiccedilatildeo Disliked Figura 51) Eacute intuitivo esperar que os dois candidatos eleitos seratildeoa Ana e ou o Beto ou a Carla e isso eacute exatamente o que ocorre na figura 40 no sistemaFPTP sem voto de minoria

                                                                                      Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria

                                                                                      Eacute evidente a discrepacircncia da quantidade de votos da Ana para os outros candidatose apesar de Beto e Carla serem mais populares que Diego os trecircs natildeo se encontrammuito afastados Poreacutem se a pequena fraccedilatildeo de candidatos que possuem a Ana como

                                                                                      51

                                                                                      Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego

                                                                                      preferecircncia e Diego como segunda opccedilatildeo optarem pelo voto de minoria a situaccedilatildeo mudacompletamente (Figura 41) Assim apesar de extensamente rejeitado Diego conquistaa segunda vaga e a meacutedia das notas despenca de 2929 para 0505 No entanto aindaexiste um cenaacuterio pior Se os outros grupos de eleitores pensarem da mesma forma eevitarem votar na Ana achando que sua eleiccedilatildeo jaacute estaacute assegurada apenas 80 de votode minoria para esses grupos jaacute eacute o suficiente para eliminaacute-la das eleiccedilotildees (Figura 42)Com a Ana eliminada a meacutedia das notas cai ainda mais para 0058

                                                                                      Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego

                                                                                      O sistema Bloc Vote eacute uma das soluccedilotildees para o voto de minoria Permitindo queos eleitores votem no mesmo nuacutemero de candidatos que de vagas a serem preenchidasnatildeo existe o iacutempeto a esse tipo de voto estrateacutegico O resultado desse sistema portantoretorna a meacutedia das notas a casa dos 29 (Figura 43) Os sistemas AVS Borda Count eSVS tambeacutem impedem a presenccedila do voto de minoria e atingem resultados semelhantes

                                                                                      52

                                                                                      Figura 43 ndash BV - Cenaacuterio 6

                                                                                      Tabela 18 ndash Resultados do Cenaacuterio 6

                                                                                      Sistema Candidatoseleitos

                                                                                      Meacutedia dasnotas

                                                                                      FPTP sem voto de minoriaAna eBeto 2929

                                                                                      FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

                                                                                      FPTP com 80 de voto de minoriaBeto eCarla 0058

                                                                                      Bloc VoteAna eCarla 2913

                                                                                      Esses resultados podem ser replicados acessando os links

                                                                                      Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

                                                                                      100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

                                                                                      80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

                                                                                      53

                                                                                      5 COMO FUNCIONA O SIMULADOR

                                                                                      O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

                                                                                      51 CLASSE ELECTIONS

                                                                                      Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

                                                                                      bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

                                                                                      Figura 44 ndash estrutura candidates

                                                                                      bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

                                                                                      bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

                                                                                      Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

                                                                                      Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

                                                                                      54

                                                                                      Figura 45 ndash estrutura voters

                                                                                      Figura 46 ndash estrutura votes

                                                                                      daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

                                                                                      Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

                                                                                      55

                                                                                      Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

                                                                                      Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

                                                                                      na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

                                                                                      56

                                                                                      Figura 49 ndash PDF - Distribuiccedilatildeo Liked

                                                                                      Figura 50 ndash CDF - Distribuiccedilatildeo Liked

                                                                                      (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

                                                                                      Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

                                                                                      57

                                                                                      Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

                                                                                      Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

                                                                                      candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

                                                                                      Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

                                                                                      58

                                                                                      Figura 53 ndash PDF - Distribuiccedilatildeo Loved

                                                                                      Figura 54 ndash CDF - Distribuiccedilatildeo Loved

                                                                                      funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

                                                                                      59

                                                                                      Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                                                                                      Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                                                                                      Meacutedia das Notas sumei

                                                                                      sumvj nij

                                                                                      etimes v

                                                                                      Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                                                                                      Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                                                                                      60

                                                                                      Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                                                                                      Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                                                                                      52 CLASSE FIRSTPASTTHEPOST

                                                                                      Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                                                                                      Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                                                                                      61

                                                                                      Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                                                                                      Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                                                                                      mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                                                                                      62

                                                                                      53 CLASSE TWOROUNDSYSTEM

                                                                                      A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                                                                                      54 CLASSE INSTANTRUNOFFVOTING

                                                                                      A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                                                                                      Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                                                                                      63

                                                                                      cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                                                                                      55 CLASSE APPROVALVOTING

                                                                                      Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                                                                                      56 CLASSE BORDACOUNT

                                                                                      Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                                                                                      57 CLASSE SCOREVOTING

                                                                                      De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                                                                                      64

                                                                                      58 CLASSE BLOCVOTE

                                                                                      O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                                                                                      59 TECNOLOGIAS UTILIZADAS

                                                                                      A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                                                                                      Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                                                                                      O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                                                                                      Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                                                                                      65

                                                                                      6 CONCLUSAtildeO

                                                                                      Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                                                                                      Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                                                                                      Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                                                                                      Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                                                                                      Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                                                                                      66

                                                                                      REFEREcircNCIAS

                                                                                      AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                                                                                      Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                                                                                      Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                                                                                      Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                                                                                      HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                                                                                      LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                                                                                      ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                                                                                      Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                                                                                      POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                                                                                      The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                                                                                      67

                                                                                      APEcircNDICES

                                                                                      APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                                                                      Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                                                                      if(not len(selfvoter_profiles))

                                                                                      for voter in range(selfN_VOTERS)

                                                                                      candidates_rank = dict()

                                                                                      for candidate in reversed(range(selfN_CANDIDATES))

                                                                                      if(selfBIAS_VECTOR[candidate]==4)

                                                                                      candidates_rank[candidate] = self_sortear(selfloved)

                                                                                      elif(selfBIAS_VECTOR[candidate]==3)

                                                                                      candidates_rank[candidate] = self_sortear(selfliked)

                                                                                      elif(selfBIAS_VECTOR[candidate]==2)

                                                                                      candidates_rank[candidate] = self_sortear(selfdisliked)

                                                                                      elif(selfBIAS_VECTOR[candidate]==1)

                                                                                      candidates_rank[candidate] = self_sortear(selfhated)

                                                                                      elif(selfBIAS_VECTOR[candidate]==-1)

                                                                                      candidates_rank[candidate] = self_sortear(selfpolarizer

                                                                                      )

                                                                                      elif(selfBIAS_VECTOR[candidate]==-2)

                                                                                      candidates_rank[candidate] = self_sortear(self

                                                                                      more_polarizer)

                                                                                      else

                                                                                      candidates_rank[candidate] = self_sortear(selfneutral)

                                                                                      selfvotersappend(candidates_rank)

                                                                                      else

                                                                                      ranges = []

                                                                                      ranks = []

                                                                                      for prof in selfvoter_profiles

                                                                                      rangesappend(int(prof[pop_percentage]))

                                                                                      rank =

                                                                                      for index score in enumerate(prof[scores])

                                                                                      rank[index] = score

                                                                                      ranksappend(rank)

                                                                                      for index _range in enumerate(ranges)

                                                                                      for _ in range(int(selfN_VOTERS(_range100)))

                                                                                      selfvotersappend(ranks[index])

                                                                                      68

                                                                                      APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                                                                      Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                                                                      for i in range(selfN_CANDIDATES)

                                                                                      selfcandidates[i] = 0

                                                                                      selfvotes[i] = set()

                                                                                      APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                                                                      Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                                                                      for candidate in range(selfN_CANDIDATES)

                                                                                      rating_sum = 0

                                                                                      for voter in selfvoters

                                                                                      rating_sum += voter[candidate]

                                                                                      selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                                                                      APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                                                                      Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                                                                      if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                                                                      return selfcalculate_mean(winners)

                                                                                      else

                                                                                      chose_best = True if winners[0] == selfbest_candidate else

                                                                                      False

                                                                                      return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                                                                      69

                                                                                      APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                                                                      Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                                                                      rating_sum = 0

                                                                                      for voter in selfvoters

                                                                                      for candidate in winners

                                                                                      rating_sum += voter[candidate]

                                                                                      return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                                                                      APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                                                                      Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                                                                      for i in range(1 selfN_VACANCIES + 2)

                                                                                      selfleading_candidatesappend(selfsorted_candidates[-i][self

                                                                                      CANDIDATE_INDEX])

                                                                                      APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                                                                      Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                                                                      for leader in selfelecrounds[-1]

                                                                                      selfleading_candidatesappend(leader[0])

                                                                                      70

                                                                                      APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                                                                      Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                                                                      self_account_for_coalitions()

                                                                                      for voter in selfvoters

                                                                                      selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                                                                      (1)))

                                                                                      temp = []

                                                                                      for voter in selfsorted_voters

                                                                                      new_dict = defaultdict(list)

                                                                                      for k in voter

                                                                                      new_dict[k[1]]append(k[0])

                                                                                      tempappend(new_dict)

                                                                                      selfsorted_voters = []

                                                                                      for voter_index current_voter in enumerate(temp)

                                                                                      new_voter = []

                                                                                      for rating candidate_indexes in current_voteritems()

                                                                                      if len(current_voter[rating]) gt 1

                                                                                      shuffle(current_voter[rating])

                                                                                      for e in candidate_indexes

                                                                                      new_voterappend((e rating))

                                                                                      else

                                                                                      new_voterappend((candidate_indexes[0] rating))

                                                                                      selfsorted_votersappend(new_voter)

                                                                                      selfcandidates[new_voter[-1][0]] += 1

                                                                                      selfvotes[new_voter[-1][0]]add(voter_index)

                                                                                      71

                                                                                      APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                                                                      Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                                                                      for candidate in selfvotes_copy

                                                                                      if candidate not in selfelecleading_candidates

                                                                                      for voter_index in selfvotes_copy[candidate]

                                                                                      for index _candidate in enumerate(reversed(selfelec

                                                                                      sorted_voters[voter_index]))

                                                                                      if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                                                                      leading_candidates

                                                                                      if randomrandom() lt selfelec

                                                                                      tactical_vote_percentages[_candidate[selfelec

                                                                                      CANDIDATE_INDEX]]

                                                                                      selfrankings_changed[voter_index] = copy

                                                                                      deepcopy(selfelecsorted_voters[voter_index])

                                                                                      selfrankings_changed[voter_index][-(index + 1)]

                                                                                      selfrankings_changed[voter_index][-1] = self

                                                                                      rankings_changed[voter_index][-1] self

                                                                                      rankings_changed[voter_index][-(index + 1)]

                                                                                      selfcandidates[candidate] -= 1

                                                                                      selfcandidates[_candidate[selfelec

                                                                                      CANDIDATE_INDEX]] += 1

                                                                                      selfvotes[candidate]remove(voter_index)

                                                                                      selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                                                                      ]]add(voter_index)

                                                                                      break

                                                                                      break

                                                                                      72

                                                                                      APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                                                                      Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                                                                      half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                                                                      for candidate in selfelecleading_candidates

                                                                                      if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                                                                      continue

                                                                                      for voter_index in selfvotes_copy[candidate]

                                                                                      if voter_index in selfrankings_changed

                                                                                      ranking = selfrankings_changed[voter_index]

                                                                                      else

                                                                                      ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                                                                      ])

                                                                                      for index _candidate in enumerate(reversed(ranking))

                                                                                      if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                      leading_candidates or (_candidate[selfelec

                                                                                      CANDIDATE_INDEX] in selfelecleading_candidates and

                                                                                      selfelecleading_candidatesindex(_candidate[selfelec

                                                                                      CANDIDATE_INDEX]) gt= half_vacancies)

                                                                                      if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                                                                      if randomrandom() lt selfelec

                                                                                      minority_vote_percentages[_candidate[selfelec

                                                                                      CANDIDATE_INDEX]]

                                                                                      selfcandidates[candidate] -= 1

                                                                                      selfcandidates[_candidate[selfelec

                                                                                      CANDIDATE_INDEX]] += 1

                                                                                      break

                                                                                      break

                                                                                      break

                                                                                      73

                                                                                      APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                                                                      Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                                                                      self_account_for_coalitions()

                                                                                      for candidate in selfvotes

                                                                                      if candidate = selfwinner and candidate = selfsecond_place

                                                                                      for voter_index in selfvotes[candidate]

                                                                                      if voter_index in selfrankings_changed

                                                                                      ranking = selfrankings_changed[voter_index]

                                                                                      else

                                                                                      ranking = copydeepcopy(selfelecsorted_voters[

                                                                                      voter_index])

                                                                                      for index2 candidate in enumerate(reversed(ranking))

                                                                                      if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                                                                      selfcandidates[selfwinner] += 1

                                                                                      selfvotes[selfwinner]add(voter_index)

                                                                                      break

                                                                                      elif candidate[selfelecCANDIDATE_INDEX] == self

                                                                                      second_place

                                                                                      selfcandidates[selfsecond_place] += 1

                                                                                      selfvotes[selfsecond_place]add(voter_index)

                                                                                      break

                                                                                      selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                      winners = []

                                                                                      vacancies = selfelecN_VACANCIES

                                                                                      for candidate in reversed(selfsorted_candidates)

                                                                                      if vacancies == 0

                                                                                      break

                                                                                      winnersappend(candidate[0])

                                                                                      vacancies -= 1

                                                                                      mean chose_best = selfelecget_mean(winners = winners)

                                                                                      74

                                                                                      APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                                                                      Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                                                                      for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                      voter_dict = dict()

                                                                                      og_voter_dict = dict()

                                                                                      for tup in voter

                                                                                      voter_dict[tup[0]] = tup[1]

                                                                                      og_voter_dict[tup[0]] = tup[1]

                                                                                      for coalition in selfeleccoalitions

                                                                                      for candidate in coalition

                                                                                      add_to_score = 0

                                                                                      for candidate2 in coalition

                                                                                      if candidate == candidate2

                                                                                      continue

                                                                                      half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                                                                      if half lt 0

                                                                                      add_to_score += mathceil(half)

                                                                                      else

                                                                                      add_to_score += mathfloor(half)

                                                                                      if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                                                                      voter_dict[candidate[rsquovaluersquo]] = 10

                                                                                      elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                                                                      voter_dict[candidate[rsquovaluersquo]] = -10

                                                                                      else

                                                                                      voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                                                                      selfrankings_changed[voter_index] = []

                                                                                      for candidate in voter_dict

                                                                                      selfrankings_changed[voter_index]append((candidate voter_dict[

                                                                                      candidate]))

                                                                                      selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                                                                      voter_index] key=lambda x x[1])

                                                                                      75

                                                                                      APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                                                      Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                                                      selfelecroundsappend(selfsorted_candidates[_round])

                                                                                      if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                      N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                                                      N_VACANCIES - 1)

                                                                                      return 2

                                                                                      elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                      N_VOTERS gt 05)

                                                                                      return 1

                                                                                      else

                                                                                      selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                                                      CANDIDATE_INDEX])

                                                                                      for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                                                      elecCANDIDATE_INDEX]]

                                                                                      if voter_index in selfrankings_changed

                                                                                      for candidate in reversed(selfrankings_changed[voter_index

                                                                                      ])

                                                                                      if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                      excluded

                                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                      ]] += 1

                                                                                      selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                      add(voter_index)

                                                                                      break

                                                                                      else

                                                                                      continue

                                                                                      else

                                                                                      for candidate in reversed(selfelecsorted_voters[

                                                                                      voter_index])

                                                                                      if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                      excluded

                                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                      ]] += 1

                                                                                      selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                      add(voter_index)

                                                                                      break

                                                                                      else

                                                                                      continue

                                                                                      selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                      return 0

                                                                                      76

                                                                                      APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                                                      Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                                                      for index in range(selfelecN_CANDIDATES)

                                                                                      selfcandidates[index] = 0

                                                                                      for voter in selfelecsorted_voters

                                                                                      for candidate in reversed(voter)

                                                                                      if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                      else

                                                                                      break

                                                                                      APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                                                      Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                                                      for index in range(selfelecN_CANDIDATES)

                                                                                      selfcandidates[index] = 0

                                                                                      for voter in selfelecsorted_voters

                                                                                      if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                      elecCANDIDATE_INDEX]]

                                                                                      selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                                                      else

                                                                                      for candidate in reversed(voter)

                                                                                      if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                      else

                                                                                      break

                                                                                      77

                                                                                      APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                                                      Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                                                      pos = set()

                                                                                      for index perc in enumerate(selfelectactical_vote_percentages)

                                                                                      if perc gt 0

                                                                                      posadd(index)

                                                                                      for candidate in selfeleccandidates

                                                                                      if candidate not in selfleading_candidates

                                                                                      for voter_index in selfvotes[candidate]

                                                                                      raised = None

                                                                                      for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                                                      ])

                                                                                      if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                                                      leading_candidates

                                                                                      if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                                                      if randomrandom() lt selfelectactical_vote_percentages[

                                                                                      candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                                                      ranking = [None]selfelecN_CANDIDATES

                                                                                      ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                      selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                      CANDIDATE_INDEX]])

                                                                                      raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                      break

                                                                                      break

                                                                                      break

                                                                                      if raised = None

                                                                                      for _candidate in selfleading_candidates

                                                                                      if _candidate = ranking[-1][0]

                                                                                      ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                      _candidate])

                                                                                      buried = _candidate

                                                                                      break

                                                                                      i = 1

                                                                                      for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                      if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                                                      buried]

                                                                                      continue

                                                                                      else

                                                                                      ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                      selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                      CANDIDATE_INDEX]])

                                                                                      i += 1

                                                                                      selfrankings_changed[voter_index] = ranking

                                                                                      78

                                                                                      APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                                                      Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                                                      for voter_index in selfvotes[candidate]

                                                                                      if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                                                      ]

                                                                                      for _candidate in selfleading_candidates

                                                                                      if _candidate = candidate

                                                                                      ranking = [None]selfelecN_CANDIDATES

                                                                                      ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                      _candidate])

                                                                                      buried = _candidate

                                                                                      break

                                                                                      i = 1

                                                                                      for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                      if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                                                      continue

                                                                                      else

                                                                                      ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                      selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                      CANDIDATE_INDEX]])

                                                                                      i += 1

                                                                                      selfrankings_changed[voter_index] = ranking

                                                                                      79

                                                                                      APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                                                      Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                                                      for index in range(selfelecN_CANDIDATES)

                                                                                      selfcandidates[index] = 0

                                                                                      for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                      score = 0

                                                                                      if voter_index in selfrankings_changed

                                                                                      for candidate in selfrankings_changed[voter_index]

                                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                      score += 1

                                                                                      else

                                                                                      for candidate in voter

                                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                      score += 1

                                                                                      APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                                                      Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                                                      for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                      if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                      elecCANDIDATE_INDEX]]

                                                                                      selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                                                      sorted_voters[voter_index])

                                                                                      for candidate_index candidate in enumerate(reversed(voter))

                                                                                      if candidate_index == 0

                                                                                      selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                      voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                                                      else

                                                                                      selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                      voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                                                      80

                                                                                      APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                                                      Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                                                      for index in range(selfelecN_CANDIDATES)

                                                                                      selfcandidates[index] = 0

                                                                                      for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                      if voter_index in selfrankings_changed

                                                                                      for candidate in selfrankings_changed[voter_index]

                                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                      selfelecCANDIDATE_RANK]

                                                                                      else

                                                                                      for candidate in voter

                                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                      selfelecCANDIDATE_RANK]

                                                                                      APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                                                      Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                                                      for index in range(selfelecN_CANDIDATES)

                                                                                      selfcandidates[index] = 0

                                                                                      for voter in selfelecsorted_voters

                                                                                      votes = selfelecN_VACANCIES

                                                                                      for candidate in reversed(voter)

                                                                                      if votes == 0

                                                                                      break

                                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                      votes -= 1

                                                                                      • Folha de aprovaccedilatildeo
                                                                                      • Agradecimentos
                                                                                      • Epiacutegrafe
                                                                                      • Resumo
                                                                                      • Abstract
                                                                                      • Lista de ilustraccedilotildees
                                                                                      • Lista de Coacutedigos
                                                                                      • Lista de tabelas
                                                                                      • Lista de abreviaturas e siglas
                                                                                      • Sumaacuterio
                                                                                      • INTRODUCcedilAtildeO
                                                                                        • MOTIVACcedilAtildeO E OBJETIVO
                                                                                        • MEacuteTODO
                                                                                        • ESTRUTURA
                                                                                          • SISTEMAS ELEITORAIS
                                                                                            • FISRT PAST THE POST
                                                                                              • Exemplo
                                                                                              • Vantagens e Desvantagens do FPTP
                                                                                              • Voto Uacutetil no FPTP
                                                                                                • TWO-ROUND SYSTEM
                                                                                                  • Exemplo
                                                                                                  • Vantagens e Desvantagens do TRS
                                                                                                  • Voto Uacutetil no TRS
                                                                                                    • INSTANT-RUNOFF VOTING
                                                                                                      • Exemplo
                                                                                                      • Vantagens e Desvantagens do IRV
                                                                                                      • Voto Uacutetil no IRV
                                                                                                        • APPROVAL VOTING SYSTEM
                                                                                                          • Exemplo
                                                                                                          • Vantagens e Desvantagens do AVS
                                                                                                          • Voto Uacutetil no AVS
                                                                                                            • THE BORDA COUNT
                                                                                                              • Exemplo
                                                                                                              • Vantagens e Desvantagens do BC
                                                                                                              • Voto Uacutetil no BC
                                                                                                                • SCORE VOTING SYSTEM
                                                                                                                  • Exemplo
                                                                                                                  • Vantagens e Desvantagens do SVS
                                                                                                                  • Voto Uacutetil no SVS
                                                                                                                    • BLOC VOTE
                                                                                                                      • Exemplo
                                                                                                                      • Voto Uacutetil no BV
                                                                                                                          • O SIMULADOR
                                                                                                                          • CENAacuteRIOS PERTINENTES
                                                                                                                            • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                                            • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                                            • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                                            • CENAacuteRIO 4 COALIZOtildeES
                                                                                                                            • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                                            • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                                              • COMO FUNCIONA O SIMULADOR
                                                                                                                                • CLASSE Elections
                                                                                                                                • CLASSE FirstPastThePost
                                                                                                                                • CLASSE TwoRoundSystem
                                                                                                                                • CLASSE InstantRunoffVoting
                                                                                                                                • CLASSE ApprovalVoting
                                                                                                                                • CLASSE BordaCount
                                                                                                                                • CLASSE ScoreVoting
                                                                                                                                • CLASSE BlocVote
                                                                                                                                • TECNOLOGIAS UTILIZADAS
                                                                                                                                  • CONCLUSAtildeO
                                                                                                                                  • Referecircncias
                                                                                                                                  • Meacutetodo create_voters
                                                                                                                                  • Meacutetodo create_candidates
                                                                                                                                  • Meacutetodo calculate_means
                                                                                                                                  • Meacutetodo get_mean
                                                                                                                                  • Meacutetodo calculate_mean
                                                                                                                                  • Meacutetodo set_leading_candidates
                                                                                                                                  • Meacutetodo irv_set_leading_candidates
                                                                                                                                  • Meacutetodo sort_ranks
                                                                                                                                  • Meacutetodo fptp_count_tactical_votes
                                                                                                                                  • Meacutetodo fptp_count_minority_votes
                                                                                                                                  • Meacutetodo trs_second_round
                                                                                                                                  • Meacutetodo trs_account_for_coalitions
                                                                                                                                  • Meacutetodo irv_count_votes
                                                                                                                                  • Meacutetodo avs_count_votes
                                                                                                                                  • Meacutetodo avs_count_votes_with_tactical
                                                                                                                                  • Meacutetodo irv_apply_tactical_votes
                                                                                                                                  • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                                                  • Meacutetodo bc_sum_candidates_scores
                                                                                                                                  • Meacutetodo svs_apply_tactical_votes
                                                                                                                                  • Meacutetodo svs_sum_candidates_scores
                                                                                                                                  • Meacutetodo bv_count_votes

                                                                                        44

                                                                                        Figura 29 ndash IRV primeiro turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                                                        Figura 30 ndash IRV segundo turno apoacutes popularizaccedilatildeo de Ana - Cenaacuterio 3

                                                                                        Tabela 15 ndash Resultados do Cenaacuterio 3Candidato

                                                                                        eleitoMeacutedia das

                                                                                        notasAntes da

                                                                                        popularizaccedilatildeode Ana

                                                                                        Ana 56

                                                                                        Apoacutespopularizaccedilatildeo

                                                                                        de AnaCarla 415

                                                                                        Os efeitos dessa caracteriacutestica se refletem na satisfaccedilatildeo meacutedia da populaccedilatildeo A Ana eacuteclaramente a melhor candidata e mesmo com o seu ganho de popularidade (ou devido aele) a Carla eacute eleita

                                                                                        Esses resultados podem ser replicados acessando os linksAntes da popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecom

                                                                                        direct_res0010000---[22Ana2222Beto2222Carla22]-----42Voter20Profile2001020520030Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                                                        45

                                                                                        Apoacutes popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana2222Beto2222Carla22]-----45Voter20Profile2001020520027Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                                                        44 CENAacuteRIO 4 COALIZOtildeES

                                                                                        O TRS por ser organizado em dois turnos separados normalmente a semanas dedistacircncia um do outro acaba abrindo brecha agrave mudanccedila de opiniatildeo por parte dos eleitorese o desenvolvimento de novas estrateacutegias por parte dos candidatos tais como a coalizatildeocom candidatos jaacute eliminados Com isso em mente nesse cenaacuterio teremos novamenteos quatro candidatos Ana Beto Carla e Diego Os trecircs primeiros seratildeo gerados dadistribuiccedilatildeo Neutral e Diego da distribuiccedilatildeo Disliked

                                                                                        Figura 31 ndash TRS turno 1 - Cenaacuterio 4

                                                                                        No TRS normal Ana Beto e Carla possuem com essas distribuiccedilotildees quantidades devotos muito proacuteximas com Beto e Carla indo para o segundo turno Carla estaacute 10 votosatraacutes de Beto e decide aproveitar o espaccedilo de tempo entre os dois turnos para tentaragregar mais votos Com isso Carla se aproxima de Diego e juntos formam uma coalizatildeoNo entanto com sua baixa popularidade Diego acaba ferindo a reputaccedilatildeo de Carla etorna o segundo turno muito mais faacutecil para Beto (Figura 33) Se Carla tivesse buscado osuporte de Ana por outro lado ela se veria vitoriosa no segundo turno e com uma amplavantagem sobre o Beto (Figura 34) Ou ateacute mesmo sem buscar uma coalizatildeo mesmosendo uma corrida apertada Carla teria naturalmente sido eleita (Figura 32)

                                                                                        Esses resultados podem ser replicados acessando os linksSem coalizotildees lthttpelectionsimpythonanywherecomdirect_res0100000

                                                                                        --[0002][22Ana222022Beto2222Carla2222Diego22]------100gt

                                                                                        46

                                                                                        Figura 32 ndash TRS turno 2 - Cenaacuterio 4

                                                                                        Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4

                                                                                        Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4

                                                                                        47

                                                                                        Coalizatildeo Carla e Diego lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2203Carla20Diego-100gt

                                                                                        Coalizatildeo Carla e Ana lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2200Carla20Ana-100gt

                                                                                        45 CENAacuteRIO 5 DILEMA DO PRISIONEIRO

                                                                                        Neste cenaacuterio temos uma eleiccedilatildeo de uma vaga com trecircs candidatos concorrentes e trecircsperfis distintos de eleitores que seguiratildeo as seguintes distribuiccedilotildees

                                                                                        Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5

                                                                                        Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                                                        deeleitores

                                                                                        1 10 -10 5 362 -10 10 5 343 -10 -10 5 30

                                                                                        Esse contexto nos remete ao notaacutevel dilema do prisioneiro Nele dois prisioneiroscuacutemplices satildeo interrogados individualmente sem poder se comunicar um com o outro ecada um enfrenta o dilema de delatar ou natildeo o seu parceiro Se os dois prisioneirosdecidem se manter calados sobre o crime ambos satildeo sentenciados a um ano de prisatildeo Seapenas um deles dedurar o outro o traidor sai livre enquanto seu parceiro eacute condenadoa trecircs anos Se ambos dedurarem um ao outro eles satildeo condenados juntos a dois anosde prisatildeo Esse dilema eacute uma ideia claacutessica presente no estudo da teoria dos jogos sendooriginalmente elaborada por Merrill Flood e Melvin Dresher em 1950 e mais tarde sendonomeada de dilema dos prisioneiros por Albert W Tucker (POUNDSTONE 1992)

                                                                                        O que esse dilema nos mostra eacute a tentaccedilatildeo que o indiviacuteduo deteacutem se sua racionalizaccedilatildeoestiver voltada para seus proacuteprios interesses e somente eles em oposiccedilatildeo a pensar no bemdo grupo como um todo Neste cenaacuterio encontramos dois grupos de eleitores expressiva-mente opostos os perfis 1 e 2 Se qualquer uma das preferecircncias desses perfis fosse eleitaisso significaria uma alta rejeiccedilatildeo de maior parte da populaccedilatildeo No entanto eles possuema segunda opccedilatildeo em comum a Carla que por sua vez eacute a preferecircncia do terceiro perfilPortanto a eleiccedilatildeo da Carla seria logicamente o resultado oacutetimo

                                                                                        Mesmo assim a Ana eacute eleita nos dois sistemas acima o que natildeo parece justo poispela tabela 16 eacute evidente que apenas 36 da populaccedilatildeo a aprova enquanto que os outros64 a reprovam ao maacuteximo O sistema IRV se comporta de maneira idecircntica ao TRS

                                                                                        48

                                                                                        Figura 35 ndash FPTP - Cenaacuterio 5

                                                                                        Figura 36 ndash TRS segundo turno - Cenaacuterio 5

                                                                                        nesta situaccedilatildeo Com esse resultado a meacutedia das notas eacute -28 No entanto os trecircs sistemasseguintes nos apresentam resultados diferentes

                                                                                        Tabela 17 ndash Resultados do Cenaacuterio 5

                                                                                        Sistema Candidatoeleito

                                                                                        Meacutedia dasnotas

                                                                                        FPTP Ana -28TRS Ana -28IRV Ana -28AVS Carla 50BC Carla 50SVS Carla 50

                                                                                        49

                                                                                        Figura 37 ndash AVS - Cenaacuterio 5

                                                                                        Figura 38 ndash BC - Cenaacuterio 5

                                                                                        Tanto o AVS quanto o Borda Count e o SVS satildeo sistemas que consideram todasas opiniotildees de cada eleitor ao mesmo tempo e por isso satildeo capazes de eleger o melhorcandidato nesta situaccedilatildeo diferentemente do TRS que natildeo absorve completamente todosentimento do eleitor por todos os candidatos e o IRV que apesar de ser bem expressivoquebra esse processo em inuacutemeras rodadas o que permite a perda de informaccedilatildeo ao longodelas

                                                                                        Esses resultados podem ser replicados acessando o linklthttpelectionsimpythonanywherecomdirect_res1111110---[22Ana

                                                                                        222022Beto222022Carla22]-----36Voter20Profile2001020-1020534Voter20Profile201-10201020530Voter20Profile202-1020-10205100gt

                                                                                        50

                                                                                        Figura 39 ndash SVS - Cenaacuterio 5

                                                                                        46 CENAacuteRIO 6 VOTO DE MINORIA

                                                                                        Neste cenaacuterio temos uma eleiccedilatildeo com quatro candidatos e duas vagas A Ana seraacutea preferecircncia de uma extensa parte da populaccedilatildeo (distribuiccedilatildeo Loved Figura 53) Betoe Carla seratildeo candidatos razoavelmente populares (distribuiccedilatildeo Neutral Figura 47) eDiego seraacute a preferecircncia de apenas um pequeno grupo especiacutefico e rejeitado pela maioria(distribuiccedilatildeo Disliked Figura 51) Eacute intuitivo esperar que os dois candidatos eleitos seratildeoa Ana e ou o Beto ou a Carla e isso eacute exatamente o que ocorre na figura 40 no sistemaFPTP sem voto de minoria

                                                                                        Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria

                                                                                        Eacute evidente a discrepacircncia da quantidade de votos da Ana para os outros candidatose apesar de Beto e Carla serem mais populares que Diego os trecircs natildeo se encontrammuito afastados Poreacutem se a pequena fraccedilatildeo de candidatos que possuem a Ana como

                                                                                        51

                                                                                        Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego

                                                                                        preferecircncia e Diego como segunda opccedilatildeo optarem pelo voto de minoria a situaccedilatildeo mudacompletamente (Figura 41) Assim apesar de extensamente rejeitado Diego conquistaa segunda vaga e a meacutedia das notas despenca de 2929 para 0505 No entanto aindaexiste um cenaacuterio pior Se os outros grupos de eleitores pensarem da mesma forma eevitarem votar na Ana achando que sua eleiccedilatildeo jaacute estaacute assegurada apenas 80 de votode minoria para esses grupos jaacute eacute o suficiente para eliminaacute-la das eleiccedilotildees (Figura 42)Com a Ana eliminada a meacutedia das notas cai ainda mais para 0058

                                                                                        Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego

                                                                                        O sistema Bloc Vote eacute uma das soluccedilotildees para o voto de minoria Permitindo queos eleitores votem no mesmo nuacutemero de candidatos que de vagas a serem preenchidasnatildeo existe o iacutempeto a esse tipo de voto estrateacutegico O resultado desse sistema portantoretorna a meacutedia das notas a casa dos 29 (Figura 43) Os sistemas AVS Borda Count eSVS tambeacutem impedem a presenccedila do voto de minoria e atingem resultados semelhantes

                                                                                        52

                                                                                        Figura 43 ndash BV - Cenaacuterio 6

                                                                                        Tabela 18 ndash Resultados do Cenaacuterio 6

                                                                                        Sistema Candidatoseleitos

                                                                                        Meacutedia dasnotas

                                                                                        FPTP sem voto de minoriaAna eBeto 2929

                                                                                        FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

                                                                                        FPTP com 80 de voto de minoriaBeto eCarla 0058

                                                                                        Bloc VoteAna eCarla 2913

                                                                                        Esses resultados podem ser replicados acessando os links

                                                                                        Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

                                                                                        100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

                                                                                        80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

                                                                                        53

                                                                                        5 COMO FUNCIONA O SIMULADOR

                                                                                        O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

                                                                                        51 CLASSE ELECTIONS

                                                                                        Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

                                                                                        bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

                                                                                        Figura 44 ndash estrutura candidates

                                                                                        bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

                                                                                        bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

                                                                                        Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

                                                                                        Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

                                                                                        54

                                                                                        Figura 45 ndash estrutura voters

                                                                                        Figura 46 ndash estrutura votes

                                                                                        daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

                                                                                        Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

                                                                                        55

                                                                                        Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

                                                                                        Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

                                                                                        na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

                                                                                        56

                                                                                        Figura 49 ndash PDF - Distribuiccedilatildeo Liked

                                                                                        Figura 50 ndash CDF - Distribuiccedilatildeo Liked

                                                                                        (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

                                                                                        Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

                                                                                        57

                                                                                        Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

                                                                                        Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

                                                                                        candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

                                                                                        Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

                                                                                        58

                                                                                        Figura 53 ndash PDF - Distribuiccedilatildeo Loved

                                                                                        Figura 54 ndash CDF - Distribuiccedilatildeo Loved

                                                                                        funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

                                                                                        59

                                                                                        Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                                                                                        Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                                                                                        Meacutedia das Notas sumei

                                                                                        sumvj nij

                                                                                        etimes v

                                                                                        Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                                                                                        Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                                                                                        60

                                                                                        Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                                                                                        Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                                                                                        52 CLASSE FIRSTPASTTHEPOST

                                                                                        Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                                                                                        Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                                                                                        61

                                                                                        Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                                                                                        Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                                                                                        mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                                                                                        62

                                                                                        53 CLASSE TWOROUNDSYSTEM

                                                                                        A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                                                                                        54 CLASSE INSTANTRUNOFFVOTING

                                                                                        A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                                                                                        Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                                                                                        63

                                                                                        cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                                                                                        55 CLASSE APPROVALVOTING

                                                                                        Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                                                                                        56 CLASSE BORDACOUNT

                                                                                        Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                                                                                        57 CLASSE SCOREVOTING

                                                                                        De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                                                                                        64

                                                                                        58 CLASSE BLOCVOTE

                                                                                        O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                                                                                        59 TECNOLOGIAS UTILIZADAS

                                                                                        A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                                                                                        Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                                                                                        O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                                                                                        Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                                                                                        65

                                                                                        6 CONCLUSAtildeO

                                                                                        Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                                                                                        Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                                                                                        Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                                                                                        Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                                                                                        Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                                                                                        66

                                                                                        REFEREcircNCIAS

                                                                                        AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                                                                                        Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                                                                                        Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                                                                                        Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                                                                                        HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                                                                                        LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                                                                                        ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                                                                                        Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                                                                                        POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                                                                                        The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                                                                                        67

                                                                                        APEcircNDICES

                                                                                        APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                                                                        Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                                                                        if(not len(selfvoter_profiles))

                                                                                        for voter in range(selfN_VOTERS)

                                                                                        candidates_rank = dict()

                                                                                        for candidate in reversed(range(selfN_CANDIDATES))

                                                                                        if(selfBIAS_VECTOR[candidate]==4)

                                                                                        candidates_rank[candidate] = self_sortear(selfloved)

                                                                                        elif(selfBIAS_VECTOR[candidate]==3)

                                                                                        candidates_rank[candidate] = self_sortear(selfliked)

                                                                                        elif(selfBIAS_VECTOR[candidate]==2)

                                                                                        candidates_rank[candidate] = self_sortear(selfdisliked)

                                                                                        elif(selfBIAS_VECTOR[candidate]==1)

                                                                                        candidates_rank[candidate] = self_sortear(selfhated)

                                                                                        elif(selfBIAS_VECTOR[candidate]==-1)

                                                                                        candidates_rank[candidate] = self_sortear(selfpolarizer

                                                                                        )

                                                                                        elif(selfBIAS_VECTOR[candidate]==-2)

                                                                                        candidates_rank[candidate] = self_sortear(self

                                                                                        more_polarizer)

                                                                                        else

                                                                                        candidates_rank[candidate] = self_sortear(selfneutral)

                                                                                        selfvotersappend(candidates_rank)

                                                                                        else

                                                                                        ranges = []

                                                                                        ranks = []

                                                                                        for prof in selfvoter_profiles

                                                                                        rangesappend(int(prof[pop_percentage]))

                                                                                        rank =

                                                                                        for index score in enumerate(prof[scores])

                                                                                        rank[index] = score

                                                                                        ranksappend(rank)

                                                                                        for index _range in enumerate(ranges)

                                                                                        for _ in range(int(selfN_VOTERS(_range100)))

                                                                                        selfvotersappend(ranks[index])

                                                                                        68

                                                                                        APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                                                                        Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                                                                        for i in range(selfN_CANDIDATES)

                                                                                        selfcandidates[i] = 0

                                                                                        selfvotes[i] = set()

                                                                                        APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                                                                        Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                                                                        for candidate in range(selfN_CANDIDATES)

                                                                                        rating_sum = 0

                                                                                        for voter in selfvoters

                                                                                        rating_sum += voter[candidate]

                                                                                        selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                                                                        APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                                                                        Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                                                                        if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                                                                        return selfcalculate_mean(winners)

                                                                                        else

                                                                                        chose_best = True if winners[0] == selfbest_candidate else

                                                                                        False

                                                                                        return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                                                                        69

                                                                                        APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                                                                        Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                                                                        rating_sum = 0

                                                                                        for voter in selfvoters

                                                                                        for candidate in winners

                                                                                        rating_sum += voter[candidate]

                                                                                        return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                                                                        APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                                                                        Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                                                                        for i in range(1 selfN_VACANCIES + 2)

                                                                                        selfleading_candidatesappend(selfsorted_candidates[-i][self

                                                                                        CANDIDATE_INDEX])

                                                                                        APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                                                                        Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                                                                        for leader in selfelecrounds[-1]

                                                                                        selfleading_candidatesappend(leader[0])

                                                                                        70

                                                                                        APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                                                                        Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                                                                        self_account_for_coalitions()

                                                                                        for voter in selfvoters

                                                                                        selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                                                                        (1)))

                                                                                        temp = []

                                                                                        for voter in selfsorted_voters

                                                                                        new_dict = defaultdict(list)

                                                                                        for k in voter

                                                                                        new_dict[k[1]]append(k[0])

                                                                                        tempappend(new_dict)

                                                                                        selfsorted_voters = []

                                                                                        for voter_index current_voter in enumerate(temp)

                                                                                        new_voter = []

                                                                                        for rating candidate_indexes in current_voteritems()

                                                                                        if len(current_voter[rating]) gt 1

                                                                                        shuffle(current_voter[rating])

                                                                                        for e in candidate_indexes

                                                                                        new_voterappend((e rating))

                                                                                        else

                                                                                        new_voterappend((candidate_indexes[0] rating))

                                                                                        selfsorted_votersappend(new_voter)

                                                                                        selfcandidates[new_voter[-1][0]] += 1

                                                                                        selfvotes[new_voter[-1][0]]add(voter_index)

                                                                                        71

                                                                                        APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                                                                        Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                                                                        for candidate in selfvotes_copy

                                                                                        if candidate not in selfelecleading_candidates

                                                                                        for voter_index in selfvotes_copy[candidate]

                                                                                        for index _candidate in enumerate(reversed(selfelec

                                                                                        sorted_voters[voter_index]))

                                                                                        if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                                                                        leading_candidates

                                                                                        if randomrandom() lt selfelec

                                                                                        tactical_vote_percentages[_candidate[selfelec

                                                                                        CANDIDATE_INDEX]]

                                                                                        selfrankings_changed[voter_index] = copy

                                                                                        deepcopy(selfelecsorted_voters[voter_index])

                                                                                        selfrankings_changed[voter_index][-(index + 1)]

                                                                                        selfrankings_changed[voter_index][-1] = self

                                                                                        rankings_changed[voter_index][-1] self

                                                                                        rankings_changed[voter_index][-(index + 1)]

                                                                                        selfcandidates[candidate] -= 1

                                                                                        selfcandidates[_candidate[selfelec

                                                                                        CANDIDATE_INDEX]] += 1

                                                                                        selfvotes[candidate]remove(voter_index)

                                                                                        selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                                                                        ]]add(voter_index)

                                                                                        break

                                                                                        break

                                                                                        72

                                                                                        APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                                                                        Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                                                                        half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                                                                        for candidate in selfelecleading_candidates

                                                                                        if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                                                                        continue

                                                                                        for voter_index in selfvotes_copy[candidate]

                                                                                        if voter_index in selfrankings_changed

                                                                                        ranking = selfrankings_changed[voter_index]

                                                                                        else

                                                                                        ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                                                                        ])

                                                                                        for index _candidate in enumerate(reversed(ranking))

                                                                                        if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                        leading_candidates or (_candidate[selfelec

                                                                                        CANDIDATE_INDEX] in selfelecleading_candidates and

                                                                                        selfelecleading_candidatesindex(_candidate[selfelec

                                                                                        CANDIDATE_INDEX]) gt= half_vacancies)

                                                                                        if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                                                                        if randomrandom() lt selfelec

                                                                                        minority_vote_percentages[_candidate[selfelec

                                                                                        CANDIDATE_INDEX]]

                                                                                        selfcandidates[candidate] -= 1

                                                                                        selfcandidates[_candidate[selfelec

                                                                                        CANDIDATE_INDEX]] += 1

                                                                                        break

                                                                                        break

                                                                                        break

                                                                                        73

                                                                                        APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                                                                        Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                                                                        self_account_for_coalitions()

                                                                                        for candidate in selfvotes

                                                                                        if candidate = selfwinner and candidate = selfsecond_place

                                                                                        for voter_index in selfvotes[candidate]

                                                                                        if voter_index in selfrankings_changed

                                                                                        ranking = selfrankings_changed[voter_index]

                                                                                        else

                                                                                        ranking = copydeepcopy(selfelecsorted_voters[

                                                                                        voter_index])

                                                                                        for index2 candidate in enumerate(reversed(ranking))

                                                                                        if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                                                                        selfcandidates[selfwinner] += 1

                                                                                        selfvotes[selfwinner]add(voter_index)

                                                                                        break

                                                                                        elif candidate[selfelecCANDIDATE_INDEX] == self

                                                                                        second_place

                                                                                        selfcandidates[selfsecond_place] += 1

                                                                                        selfvotes[selfsecond_place]add(voter_index)

                                                                                        break

                                                                                        selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                        winners = []

                                                                                        vacancies = selfelecN_VACANCIES

                                                                                        for candidate in reversed(selfsorted_candidates)

                                                                                        if vacancies == 0

                                                                                        break

                                                                                        winnersappend(candidate[0])

                                                                                        vacancies -= 1

                                                                                        mean chose_best = selfelecget_mean(winners = winners)

                                                                                        74

                                                                                        APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                                                                        Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                                                                        for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                        voter_dict = dict()

                                                                                        og_voter_dict = dict()

                                                                                        for tup in voter

                                                                                        voter_dict[tup[0]] = tup[1]

                                                                                        og_voter_dict[tup[0]] = tup[1]

                                                                                        for coalition in selfeleccoalitions

                                                                                        for candidate in coalition

                                                                                        add_to_score = 0

                                                                                        for candidate2 in coalition

                                                                                        if candidate == candidate2

                                                                                        continue

                                                                                        half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                                                                        if half lt 0

                                                                                        add_to_score += mathceil(half)

                                                                                        else

                                                                                        add_to_score += mathfloor(half)

                                                                                        if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                                                                        voter_dict[candidate[rsquovaluersquo]] = 10

                                                                                        elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                                                                        voter_dict[candidate[rsquovaluersquo]] = -10

                                                                                        else

                                                                                        voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                                                                        selfrankings_changed[voter_index] = []

                                                                                        for candidate in voter_dict

                                                                                        selfrankings_changed[voter_index]append((candidate voter_dict[

                                                                                        candidate]))

                                                                                        selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                                                                        voter_index] key=lambda x x[1])

                                                                                        75

                                                                                        APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                                                        Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                                                        selfelecroundsappend(selfsorted_candidates[_round])

                                                                                        if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                        N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                                                        N_VACANCIES - 1)

                                                                                        return 2

                                                                                        elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                        N_VOTERS gt 05)

                                                                                        return 1

                                                                                        else

                                                                                        selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                                                        CANDIDATE_INDEX])

                                                                                        for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                                                        elecCANDIDATE_INDEX]]

                                                                                        if voter_index in selfrankings_changed

                                                                                        for candidate in reversed(selfrankings_changed[voter_index

                                                                                        ])

                                                                                        if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                        excluded

                                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                        ]] += 1

                                                                                        selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                        add(voter_index)

                                                                                        break

                                                                                        else

                                                                                        continue

                                                                                        else

                                                                                        for candidate in reversed(selfelecsorted_voters[

                                                                                        voter_index])

                                                                                        if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                        excluded

                                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                        ]] += 1

                                                                                        selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                        add(voter_index)

                                                                                        break

                                                                                        else

                                                                                        continue

                                                                                        selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                        return 0

                                                                                        76

                                                                                        APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                                                        Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                                                        for index in range(selfelecN_CANDIDATES)

                                                                                        selfcandidates[index] = 0

                                                                                        for voter in selfelecsorted_voters

                                                                                        for candidate in reversed(voter)

                                                                                        if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                        else

                                                                                        break

                                                                                        APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                                                        Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                                                        for index in range(selfelecN_CANDIDATES)

                                                                                        selfcandidates[index] = 0

                                                                                        for voter in selfelecsorted_voters

                                                                                        if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                        elecCANDIDATE_INDEX]]

                                                                                        selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                                                        else

                                                                                        for candidate in reversed(voter)

                                                                                        if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                        else

                                                                                        break

                                                                                        77

                                                                                        APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                                                        Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                                                        pos = set()

                                                                                        for index perc in enumerate(selfelectactical_vote_percentages)

                                                                                        if perc gt 0

                                                                                        posadd(index)

                                                                                        for candidate in selfeleccandidates

                                                                                        if candidate not in selfleading_candidates

                                                                                        for voter_index in selfvotes[candidate]

                                                                                        raised = None

                                                                                        for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                                                        ])

                                                                                        if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                                                        leading_candidates

                                                                                        if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                                                        if randomrandom() lt selfelectactical_vote_percentages[

                                                                                        candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                                                        ranking = [None]selfelecN_CANDIDATES

                                                                                        ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                        selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                        CANDIDATE_INDEX]])

                                                                                        raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                        break

                                                                                        break

                                                                                        break

                                                                                        if raised = None

                                                                                        for _candidate in selfleading_candidates

                                                                                        if _candidate = ranking[-1][0]

                                                                                        ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                        _candidate])

                                                                                        buried = _candidate

                                                                                        break

                                                                                        i = 1

                                                                                        for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                        if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                                                        buried]

                                                                                        continue

                                                                                        else

                                                                                        ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                        selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                        CANDIDATE_INDEX]])

                                                                                        i += 1

                                                                                        selfrankings_changed[voter_index] = ranking

                                                                                        78

                                                                                        APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                                                        Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                                                        for voter_index in selfvotes[candidate]

                                                                                        if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                                                        ]

                                                                                        for _candidate in selfleading_candidates

                                                                                        if _candidate = candidate

                                                                                        ranking = [None]selfelecN_CANDIDATES

                                                                                        ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                        _candidate])

                                                                                        buried = _candidate

                                                                                        break

                                                                                        i = 1

                                                                                        for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                        if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                                                        continue

                                                                                        else

                                                                                        ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                        selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                        CANDIDATE_INDEX]])

                                                                                        i += 1

                                                                                        selfrankings_changed[voter_index] = ranking

                                                                                        79

                                                                                        APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                                                        Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                                                        for index in range(selfelecN_CANDIDATES)

                                                                                        selfcandidates[index] = 0

                                                                                        for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                        score = 0

                                                                                        if voter_index in selfrankings_changed

                                                                                        for candidate in selfrankings_changed[voter_index]

                                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                        score += 1

                                                                                        else

                                                                                        for candidate in voter

                                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                        score += 1

                                                                                        APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                                                        Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                                                        for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                        if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                        elecCANDIDATE_INDEX]]

                                                                                        selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                                                        sorted_voters[voter_index])

                                                                                        for candidate_index candidate in enumerate(reversed(voter))

                                                                                        if candidate_index == 0

                                                                                        selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                        voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                                                        else

                                                                                        selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                        voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                                                        80

                                                                                        APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                                                        Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                                                        for index in range(selfelecN_CANDIDATES)

                                                                                        selfcandidates[index] = 0

                                                                                        for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                        if voter_index in selfrankings_changed

                                                                                        for candidate in selfrankings_changed[voter_index]

                                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                        selfelecCANDIDATE_RANK]

                                                                                        else

                                                                                        for candidate in voter

                                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                        selfelecCANDIDATE_RANK]

                                                                                        APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                                                        Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                                                        for index in range(selfelecN_CANDIDATES)

                                                                                        selfcandidates[index] = 0

                                                                                        for voter in selfelecsorted_voters

                                                                                        votes = selfelecN_VACANCIES

                                                                                        for candidate in reversed(voter)

                                                                                        if votes == 0

                                                                                        break

                                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                        votes -= 1

                                                                                        • Folha de aprovaccedilatildeo
                                                                                        • Agradecimentos
                                                                                        • Epiacutegrafe
                                                                                        • Resumo
                                                                                        • Abstract
                                                                                        • Lista de ilustraccedilotildees
                                                                                        • Lista de Coacutedigos
                                                                                        • Lista de tabelas
                                                                                        • Lista de abreviaturas e siglas
                                                                                        • Sumaacuterio
                                                                                        • INTRODUCcedilAtildeO
                                                                                          • MOTIVACcedilAtildeO E OBJETIVO
                                                                                          • MEacuteTODO
                                                                                          • ESTRUTURA
                                                                                            • SISTEMAS ELEITORAIS
                                                                                              • FISRT PAST THE POST
                                                                                                • Exemplo
                                                                                                • Vantagens e Desvantagens do FPTP
                                                                                                • Voto Uacutetil no FPTP
                                                                                                  • TWO-ROUND SYSTEM
                                                                                                    • Exemplo
                                                                                                    • Vantagens e Desvantagens do TRS
                                                                                                    • Voto Uacutetil no TRS
                                                                                                      • INSTANT-RUNOFF VOTING
                                                                                                        • Exemplo
                                                                                                        • Vantagens e Desvantagens do IRV
                                                                                                        • Voto Uacutetil no IRV
                                                                                                          • APPROVAL VOTING SYSTEM
                                                                                                            • Exemplo
                                                                                                            • Vantagens e Desvantagens do AVS
                                                                                                            • Voto Uacutetil no AVS
                                                                                                              • THE BORDA COUNT
                                                                                                                • Exemplo
                                                                                                                • Vantagens e Desvantagens do BC
                                                                                                                • Voto Uacutetil no BC
                                                                                                                  • SCORE VOTING SYSTEM
                                                                                                                    • Exemplo
                                                                                                                    • Vantagens e Desvantagens do SVS
                                                                                                                    • Voto Uacutetil no SVS
                                                                                                                      • BLOC VOTE
                                                                                                                        • Exemplo
                                                                                                                        • Voto Uacutetil no BV
                                                                                                                            • O SIMULADOR
                                                                                                                            • CENAacuteRIOS PERTINENTES
                                                                                                                              • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                                              • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                                              • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                                              • CENAacuteRIO 4 COALIZOtildeES
                                                                                                                              • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                                              • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                                                • COMO FUNCIONA O SIMULADOR
                                                                                                                                  • CLASSE Elections
                                                                                                                                  • CLASSE FirstPastThePost
                                                                                                                                  • CLASSE TwoRoundSystem
                                                                                                                                  • CLASSE InstantRunoffVoting
                                                                                                                                  • CLASSE ApprovalVoting
                                                                                                                                  • CLASSE BordaCount
                                                                                                                                  • CLASSE ScoreVoting
                                                                                                                                  • CLASSE BlocVote
                                                                                                                                  • TECNOLOGIAS UTILIZADAS
                                                                                                                                    • CONCLUSAtildeO
                                                                                                                                    • Referecircncias
                                                                                                                                    • Meacutetodo create_voters
                                                                                                                                    • Meacutetodo create_candidates
                                                                                                                                    • Meacutetodo calculate_means
                                                                                                                                    • Meacutetodo get_mean
                                                                                                                                    • Meacutetodo calculate_mean
                                                                                                                                    • Meacutetodo set_leading_candidates
                                                                                                                                    • Meacutetodo irv_set_leading_candidates
                                                                                                                                    • Meacutetodo sort_ranks
                                                                                                                                    • Meacutetodo fptp_count_tactical_votes
                                                                                                                                    • Meacutetodo fptp_count_minority_votes
                                                                                                                                    • Meacutetodo trs_second_round
                                                                                                                                    • Meacutetodo trs_account_for_coalitions
                                                                                                                                    • Meacutetodo irv_count_votes
                                                                                                                                    • Meacutetodo avs_count_votes
                                                                                                                                    • Meacutetodo avs_count_votes_with_tactical
                                                                                                                                    • Meacutetodo irv_apply_tactical_votes
                                                                                                                                    • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                                                    • Meacutetodo bc_sum_candidates_scores
                                                                                                                                    • Meacutetodo svs_apply_tactical_votes
                                                                                                                                    • Meacutetodo svs_sum_candidates_scores
                                                                                                                                    • Meacutetodo bv_count_votes

                                                                                          45

                                                                                          Apoacutes popularizaccedilatildeo de Ana lthttpelectionsimpythonanywherecomdirect_res0010000---[22Ana2222Beto2222Carla22]-----45Voter20Profile2001020520027Voter20Profile2010201020528Voter20Profile20252002010100gt

                                                                                          44 CENAacuteRIO 4 COALIZOtildeES

                                                                                          O TRS por ser organizado em dois turnos separados normalmente a semanas dedistacircncia um do outro acaba abrindo brecha agrave mudanccedila de opiniatildeo por parte dos eleitorese o desenvolvimento de novas estrateacutegias por parte dos candidatos tais como a coalizatildeocom candidatos jaacute eliminados Com isso em mente nesse cenaacuterio teremos novamenteos quatro candidatos Ana Beto Carla e Diego Os trecircs primeiros seratildeo gerados dadistribuiccedilatildeo Neutral e Diego da distribuiccedilatildeo Disliked

                                                                                          Figura 31 ndash TRS turno 1 - Cenaacuterio 4

                                                                                          No TRS normal Ana Beto e Carla possuem com essas distribuiccedilotildees quantidades devotos muito proacuteximas com Beto e Carla indo para o segundo turno Carla estaacute 10 votosatraacutes de Beto e decide aproveitar o espaccedilo de tempo entre os dois turnos para tentaragregar mais votos Com isso Carla se aproxima de Diego e juntos formam uma coalizatildeoNo entanto com sua baixa popularidade Diego acaba ferindo a reputaccedilatildeo de Carla etorna o segundo turno muito mais faacutecil para Beto (Figura 33) Se Carla tivesse buscado osuporte de Ana por outro lado ela se veria vitoriosa no segundo turno e com uma amplavantagem sobre o Beto (Figura 34) Ou ateacute mesmo sem buscar uma coalizatildeo mesmosendo uma corrida apertada Carla teria naturalmente sido eleita (Figura 32)

                                                                                          Esses resultados podem ser replicados acessando os linksSem coalizotildees lthttpelectionsimpythonanywherecomdirect_res0100000

                                                                                          --[0002][22Ana222022Beto2222Carla2222Diego22]------100gt

                                                                                          46

                                                                                          Figura 32 ndash TRS turno 2 - Cenaacuterio 4

                                                                                          Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4

                                                                                          Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4

                                                                                          47

                                                                                          Coalizatildeo Carla e Diego lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2203Carla20Diego-100gt

                                                                                          Coalizatildeo Carla e Ana lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2200Carla20Ana-100gt

                                                                                          45 CENAacuteRIO 5 DILEMA DO PRISIONEIRO

                                                                                          Neste cenaacuterio temos uma eleiccedilatildeo de uma vaga com trecircs candidatos concorrentes e trecircsperfis distintos de eleitores que seguiratildeo as seguintes distribuiccedilotildees

                                                                                          Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5

                                                                                          Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                                                          deeleitores

                                                                                          1 10 -10 5 362 -10 10 5 343 -10 -10 5 30

                                                                                          Esse contexto nos remete ao notaacutevel dilema do prisioneiro Nele dois prisioneiroscuacutemplices satildeo interrogados individualmente sem poder se comunicar um com o outro ecada um enfrenta o dilema de delatar ou natildeo o seu parceiro Se os dois prisioneirosdecidem se manter calados sobre o crime ambos satildeo sentenciados a um ano de prisatildeo Seapenas um deles dedurar o outro o traidor sai livre enquanto seu parceiro eacute condenadoa trecircs anos Se ambos dedurarem um ao outro eles satildeo condenados juntos a dois anosde prisatildeo Esse dilema eacute uma ideia claacutessica presente no estudo da teoria dos jogos sendooriginalmente elaborada por Merrill Flood e Melvin Dresher em 1950 e mais tarde sendonomeada de dilema dos prisioneiros por Albert W Tucker (POUNDSTONE 1992)

                                                                                          O que esse dilema nos mostra eacute a tentaccedilatildeo que o indiviacuteduo deteacutem se sua racionalizaccedilatildeoestiver voltada para seus proacuteprios interesses e somente eles em oposiccedilatildeo a pensar no bemdo grupo como um todo Neste cenaacuterio encontramos dois grupos de eleitores expressiva-mente opostos os perfis 1 e 2 Se qualquer uma das preferecircncias desses perfis fosse eleitaisso significaria uma alta rejeiccedilatildeo de maior parte da populaccedilatildeo No entanto eles possuema segunda opccedilatildeo em comum a Carla que por sua vez eacute a preferecircncia do terceiro perfilPortanto a eleiccedilatildeo da Carla seria logicamente o resultado oacutetimo

                                                                                          Mesmo assim a Ana eacute eleita nos dois sistemas acima o que natildeo parece justo poispela tabela 16 eacute evidente que apenas 36 da populaccedilatildeo a aprova enquanto que os outros64 a reprovam ao maacuteximo O sistema IRV se comporta de maneira idecircntica ao TRS

                                                                                          48

                                                                                          Figura 35 ndash FPTP - Cenaacuterio 5

                                                                                          Figura 36 ndash TRS segundo turno - Cenaacuterio 5

                                                                                          nesta situaccedilatildeo Com esse resultado a meacutedia das notas eacute -28 No entanto os trecircs sistemasseguintes nos apresentam resultados diferentes

                                                                                          Tabela 17 ndash Resultados do Cenaacuterio 5

                                                                                          Sistema Candidatoeleito

                                                                                          Meacutedia dasnotas

                                                                                          FPTP Ana -28TRS Ana -28IRV Ana -28AVS Carla 50BC Carla 50SVS Carla 50

                                                                                          49

                                                                                          Figura 37 ndash AVS - Cenaacuterio 5

                                                                                          Figura 38 ndash BC - Cenaacuterio 5

                                                                                          Tanto o AVS quanto o Borda Count e o SVS satildeo sistemas que consideram todasas opiniotildees de cada eleitor ao mesmo tempo e por isso satildeo capazes de eleger o melhorcandidato nesta situaccedilatildeo diferentemente do TRS que natildeo absorve completamente todosentimento do eleitor por todos os candidatos e o IRV que apesar de ser bem expressivoquebra esse processo em inuacutemeras rodadas o que permite a perda de informaccedilatildeo ao longodelas

                                                                                          Esses resultados podem ser replicados acessando o linklthttpelectionsimpythonanywherecomdirect_res1111110---[22Ana

                                                                                          222022Beto222022Carla22]-----36Voter20Profile2001020-1020534Voter20Profile201-10201020530Voter20Profile202-1020-10205100gt

                                                                                          50

                                                                                          Figura 39 ndash SVS - Cenaacuterio 5

                                                                                          46 CENAacuteRIO 6 VOTO DE MINORIA

                                                                                          Neste cenaacuterio temos uma eleiccedilatildeo com quatro candidatos e duas vagas A Ana seraacutea preferecircncia de uma extensa parte da populaccedilatildeo (distribuiccedilatildeo Loved Figura 53) Betoe Carla seratildeo candidatos razoavelmente populares (distribuiccedilatildeo Neutral Figura 47) eDiego seraacute a preferecircncia de apenas um pequeno grupo especiacutefico e rejeitado pela maioria(distribuiccedilatildeo Disliked Figura 51) Eacute intuitivo esperar que os dois candidatos eleitos seratildeoa Ana e ou o Beto ou a Carla e isso eacute exatamente o que ocorre na figura 40 no sistemaFPTP sem voto de minoria

                                                                                          Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria

                                                                                          Eacute evidente a discrepacircncia da quantidade de votos da Ana para os outros candidatose apesar de Beto e Carla serem mais populares que Diego os trecircs natildeo se encontrammuito afastados Poreacutem se a pequena fraccedilatildeo de candidatos que possuem a Ana como

                                                                                          51

                                                                                          Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego

                                                                                          preferecircncia e Diego como segunda opccedilatildeo optarem pelo voto de minoria a situaccedilatildeo mudacompletamente (Figura 41) Assim apesar de extensamente rejeitado Diego conquistaa segunda vaga e a meacutedia das notas despenca de 2929 para 0505 No entanto aindaexiste um cenaacuterio pior Se os outros grupos de eleitores pensarem da mesma forma eevitarem votar na Ana achando que sua eleiccedilatildeo jaacute estaacute assegurada apenas 80 de votode minoria para esses grupos jaacute eacute o suficiente para eliminaacute-la das eleiccedilotildees (Figura 42)Com a Ana eliminada a meacutedia das notas cai ainda mais para 0058

                                                                                          Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego

                                                                                          O sistema Bloc Vote eacute uma das soluccedilotildees para o voto de minoria Permitindo queos eleitores votem no mesmo nuacutemero de candidatos que de vagas a serem preenchidasnatildeo existe o iacutempeto a esse tipo de voto estrateacutegico O resultado desse sistema portantoretorna a meacutedia das notas a casa dos 29 (Figura 43) Os sistemas AVS Borda Count eSVS tambeacutem impedem a presenccedila do voto de minoria e atingem resultados semelhantes

                                                                                          52

                                                                                          Figura 43 ndash BV - Cenaacuterio 6

                                                                                          Tabela 18 ndash Resultados do Cenaacuterio 6

                                                                                          Sistema Candidatoseleitos

                                                                                          Meacutedia dasnotas

                                                                                          FPTP sem voto de minoriaAna eBeto 2929

                                                                                          FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

                                                                                          FPTP com 80 de voto de minoriaBeto eCarla 0058

                                                                                          Bloc VoteAna eCarla 2913

                                                                                          Esses resultados podem ser replicados acessando os links

                                                                                          Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

                                                                                          100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

                                                                                          80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

                                                                                          53

                                                                                          5 COMO FUNCIONA O SIMULADOR

                                                                                          O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

                                                                                          51 CLASSE ELECTIONS

                                                                                          Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

                                                                                          bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

                                                                                          Figura 44 ndash estrutura candidates

                                                                                          bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

                                                                                          bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

                                                                                          Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

                                                                                          Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

                                                                                          54

                                                                                          Figura 45 ndash estrutura voters

                                                                                          Figura 46 ndash estrutura votes

                                                                                          daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

                                                                                          Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

                                                                                          55

                                                                                          Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

                                                                                          Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

                                                                                          na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

                                                                                          56

                                                                                          Figura 49 ndash PDF - Distribuiccedilatildeo Liked

                                                                                          Figura 50 ndash CDF - Distribuiccedilatildeo Liked

                                                                                          (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

                                                                                          Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

                                                                                          57

                                                                                          Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

                                                                                          Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

                                                                                          candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

                                                                                          Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

                                                                                          58

                                                                                          Figura 53 ndash PDF - Distribuiccedilatildeo Loved

                                                                                          Figura 54 ndash CDF - Distribuiccedilatildeo Loved

                                                                                          funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

                                                                                          59

                                                                                          Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                                                                                          Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                                                                                          Meacutedia das Notas sumei

                                                                                          sumvj nij

                                                                                          etimes v

                                                                                          Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                                                                                          Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                                                                                          60

                                                                                          Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                                                                                          Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                                                                                          52 CLASSE FIRSTPASTTHEPOST

                                                                                          Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                                                                                          Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                                                                                          61

                                                                                          Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                                                                                          Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                                                                                          mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                                                                                          62

                                                                                          53 CLASSE TWOROUNDSYSTEM

                                                                                          A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                                                                                          54 CLASSE INSTANTRUNOFFVOTING

                                                                                          A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                                                                                          Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                                                                                          63

                                                                                          cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                                                                                          55 CLASSE APPROVALVOTING

                                                                                          Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                                                                                          56 CLASSE BORDACOUNT

                                                                                          Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                                                                                          57 CLASSE SCOREVOTING

                                                                                          De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                                                                                          64

                                                                                          58 CLASSE BLOCVOTE

                                                                                          O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                                                                                          59 TECNOLOGIAS UTILIZADAS

                                                                                          A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                                                                                          Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                                                                                          O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                                                                                          Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                                                                                          65

                                                                                          6 CONCLUSAtildeO

                                                                                          Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                                                                                          Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                                                                                          Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                                                                                          Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                                                                                          Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                                                                                          66

                                                                                          REFEREcircNCIAS

                                                                                          AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                                                                                          Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                                                                                          Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                                                                                          Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                                                                                          HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                                                                                          LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                                                                                          ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                                                                                          Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                                                                                          POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                                                                                          The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                                                                                          67

                                                                                          APEcircNDICES

                                                                                          APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                                                                          Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                                                                          if(not len(selfvoter_profiles))

                                                                                          for voter in range(selfN_VOTERS)

                                                                                          candidates_rank = dict()

                                                                                          for candidate in reversed(range(selfN_CANDIDATES))

                                                                                          if(selfBIAS_VECTOR[candidate]==4)

                                                                                          candidates_rank[candidate] = self_sortear(selfloved)

                                                                                          elif(selfBIAS_VECTOR[candidate]==3)

                                                                                          candidates_rank[candidate] = self_sortear(selfliked)

                                                                                          elif(selfBIAS_VECTOR[candidate]==2)

                                                                                          candidates_rank[candidate] = self_sortear(selfdisliked)

                                                                                          elif(selfBIAS_VECTOR[candidate]==1)

                                                                                          candidates_rank[candidate] = self_sortear(selfhated)

                                                                                          elif(selfBIAS_VECTOR[candidate]==-1)

                                                                                          candidates_rank[candidate] = self_sortear(selfpolarizer

                                                                                          )

                                                                                          elif(selfBIAS_VECTOR[candidate]==-2)

                                                                                          candidates_rank[candidate] = self_sortear(self

                                                                                          more_polarizer)

                                                                                          else

                                                                                          candidates_rank[candidate] = self_sortear(selfneutral)

                                                                                          selfvotersappend(candidates_rank)

                                                                                          else

                                                                                          ranges = []

                                                                                          ranks = []

                                                                                          for prof in selfvoter_profiles

                                                                                          rangesappend(int(prof[pop_percentage]))

                                                                                          rank =

                                                                                          for index score in enumerate(prof[scores])

                                                                                          rank[index] = score

                                                                                          ranksappend(rank)

                                                                                          for index _range in enumerate(ranges)

                                                                                          for _ in range(int(selfN_VOTERS(_range100)))

                                                                                          selfvotersappend(ranks[index])

                                                                                          68

                                                                                          APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                                                                          Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                                                                          for i in range(selfN_CANDIDATES)

                                                                                          selfcandidates[i] = 0

                                                                                          selfvotes[i] = set()

                                                                                          APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                                                                          Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                                                                          for candidate in range(selfN_CANDIDATES)

                                                                                          rating_sum = 0

                                                                                          for voter in selfvoters

                                                                                          rating_sum += voter[candidate]

                                                                                          selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                                                                          APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                                                                          Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                                                                          if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                                                                          return selfcalculate_mean(winners)

                                                                                          else

                                                                                          chose_best = True if winners[0] == selfbest_candidate else

                                                                                          False

                                                                                          return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                                                                          69

                                                                                          APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                                                                          Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                                                                          rating_sum = 0

                                                                                          for voter in selfvoters

                                                                                          for candidate in winners

                                                                                          rating_sum += voter[candidate]

                                                                                          return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                                                                          APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                                                                          Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                                                                          for i in range(1 selfN_VACANCIES + 2)

                                                                                          selfleading_candidatesappend(selfsorted_candidates[-i][self

                                                                                          CANDIDATE_INDEX])

                                                                                          APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                                                                          Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                                                                          for leader in selfelecrounds[-1]

                                                                                          selfleading_candidatesappend(leader[0])

                                                                                          70

                                                                                          APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                                                                          Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                                                                          self_account_for_coalitions()

                                                                                          for voter in selfvoters

                                                                                          selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                                                                          (1)))

                                                                                          temp = []

                                                                                          for voter in selfsorted_voters

                                                                                          new_dict = defaultdict(list)

                                                                                          for k in voter

                                                                                          new_dict[k[1]]append(k[0])

                                                                                          tempappend(new_dict)

                                                                                          selfsorted_voters = []

                                                                                          for voter_index current_voter in enumerate(temp)

                                                                                          new_voter = []

                                                                                          for rating candidate_indexes in current_voteritems()

                                                                                          if len(current_voter[rating]) gt 1

                                                                                          shuffle(current_voter[rating])

                                                                                          for e in candidate_indexes

                                                                                          new_voterappend((e rating))

                                                                                          else

                                                                                          new_voterappend((candidate_indexes[0] rating))

                                                                                          selfsorted_votersappend(new_voter)

                                                                                          selfcandidates[new_voter[-1][0]] += 1

                                                                                          selfvotes[new_voter[-1][0]]add(voter_index)

                                                                                          71

                                                                                          APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                                                                          Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                                                                          for candidate in selfvotes_copy

                                                                                          if candidate not in selfelecleading_candidates

                                                                                          for voter_index in selfvotes_copy[candidate]

                                                                                          for index _candidate in enumerate(reversed(selfelec

                                                                                          sorted_voters[voter_index]))

                                                                                          if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                                                                          leading_candidates

                                                                                          if randomrandom() lt selfelec

                                                                                          tactical_vote_percentages[_candidate[selfelec

                                                                                          CANDIDATE_INDEX]]

                                                                                          selfrankings_changed[voter_index] = copy

                                                                                          deepcopy(selfelecsorted_voters[voter_index])

                                                                                          selfrankings_changed[voter_index][-(index + 1)]

                                                                                          selfrankings_changed[voter_index][-1] = self

                                                                                          rankings_changed[voter_index][-1] self

                                                                                          rankings_changed[voter_index][-(index + 1)]

                                                                                          selfcandidates[candidate] -= 1

                                                                                          selfcandidates[_candidate[selfelec

                                                                                          CANDIDATE_INDEX]] += 1

                                                                                          selfvotes[candidate]remove(voter_index)

                                                                                          selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                                                                          ]]add(voter_index)

                                                                                          break

                                                                                          break

                                                                                          72

                                                                                          APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                                                                          Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                                                                          half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                                                                          for candidate in selfelecleading_candidates

                                                                                          if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                                                                          continue

                                                                                          for voter_index in selfvotes_copy[candidate]

                                                                                          if voter_index in selfrankings_changed

                                                                                          ranking = selfrankings_changed[voter_index]

                                                                                          else

                                                                                          ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                                                                          ])

                                                                                          for index _candidate in enumerate(reversed(ranking))

                                                                                          if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                          leading_candidates or (_candidate[selfelec

                                                                                          CANDIDATE_INDEX] in selfelecleading_candidates and

                                                                                          selfelecleading_candidatesindex(_candidate[selfelec

                                                                                          CANDIDATE_INDEX]) gt= half_vacancies)

                                                                                          if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                                                                          if randomrandom() lt selfelec

                                                                                          minority_vote_percentages[_candidate[selfelec

                                                                                          CANDIDATE_INDEX]]

                                                                                          selfcandidates[candidate] -= 1

                                                                                          selfcandidates[_candidate[selfelec

                                                                                          CANDIDATE_INDEX]] += 1

                                                                                          break

                                                                                          break

                                                                                          break

                                                                                          73

                                                                                          APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                                                                          Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                                                                          self_account_for_coalitions()

                                                                                          for candidate in selfvotes

                                                                                          if candidate = selfwinner and candidate = selfsecond_place

                                                                                          for voter_index in selfvotes[candidate]

                                                                                          if voter_index in selfrankings_changed

                                                                                          ranking = selfrankings_changed[voter_index]

                                                                                          else

                                                                                          ranking = copydeepcopy(selfelecsorted_voters[

                                                                                          voter_index])

                                                                                          for index2 candidate in enumerate(reversed(ranking))

                                                                                          if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                                                                          selfcandidates[selfwinner] += 1

                                                                                          selfvotes[selfwinner]add(voter_index)

                                                                                          break

                                                                                          elif candidate[selfelecCANDIDATE_INDEX] == self

                                                                                          second_place

                                                                                          selfcandidates[selfsecond_place] += 1

                                                                                          selfvotes[selfsecond_place]add(voter_index)

                                                                                          break

                                                                                          selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                          winners = []

                                                                                          vacancies = selfelecN_VACANCIES

                                                                                          for candidate in reversed(selfsorted_candidates)

                                                                                          if vacancies == 0

                                                                                          break

                                                                                          winnersappend(candidate[0])

                                                                                          vacancies -= 1

                                                                                          mean chose_best = selfelecget_mean(winners = winners)

                                                                                          74

                                                                                          APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                                                                          Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                                                                          for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                          voter_dict = dict()

                                                                                          og_voter_dict = dict()

                                                                                          for tup in voter

                                                                                          voter_dict[tup[0]] = tup[1]

                                                                                          og_voter_dict[tup[0]] = tup[1]

                                                                                          for coalition in selfeleccoalitions

                                                                                          for candidate in coalition

                                                                                          add_to_score = 0

                                                                                          for candidate2 in coalition

                                                                                          if candidate == candidate2

                                                                                          continue

                                                                                          half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                                                                          if half lt 0

                                                                                          add_to_score += mathceil(half)

                                                                                          else

                                                                                          add_to_score += mathfloor(half)

                                                                                          if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                                                                          voter_dict[candidate[rsquovaluersquo]] = 10

                                                                                          elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                                                                          voter_dict[candidate[rsquovaluersquo]] = -10

                                                                                          else

                                                                                          voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                                                                          selfrankings_changed[voter_index] = []

                                                                                          for candidate in voter_dict

                                                                                          selfrankings_changed[voter_index]append((candidate voter_dict[

                                                                                          candidate]))

                                                                                          selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                                                                          voter_index] key=lambda x x[1])

                                                                                          75

                                                                                          APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                                                          Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                                                          selfelecroundsappend(selfsorted_candidates[_round])

                                                                                          if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                          N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                                                          N_VACANCIES - 1)

                                                                                          return 2

                                                                                          elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                          N_VOTERS gt 05)

                                                                                          return 1

                                                                                          else

                                                                                          selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                                                          CANDIDATE_INDEX])

                                                                                          for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                                                          elecCANDIDATE_INDEX]]

                                                                                          if voter_index in selfrankings_changed

                                                                                          for candidate in reversed(selfrankings_changed[voter_index

                                                                                          ])

                                                                                          if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                          excluded

                                                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                          ]] += 1

                                                                                          selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                          add(voter_index)

                                                                                          break

                                                                                          else

                                                                                          continue

                                                                                          else

                                                                                          for candidate in reversed(selfelecsorted_voters[

                                                                                          voter_index])

                                                                                          if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                          excluded

                                                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                          ]] += 1

                                                                                          selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                          add(voter_index)

                                                                                          break

                                                                                          else

                                                                                          continue

                                                                                          selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                          return 0

                                                                                          76

                                                                                          APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                                                          Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                                                          for index in range(selfelecN_CANDIDATES)

                                                                                          selfcandidates[index] = 0

                                                                                          for voter in selfelecsorted_voters

                                                                                          for candidate in reversed(voter)

                                                                                          if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                          else

                                                                                          break

                                                                                          APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                                                          Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                                                          for index in range(selfelecN_CANDIDATES)

                                                                                          selfcandidates[index] = 0

                                                                                          for voter in selfelecsorted_voters

                                                                                          if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                          elecCANDIDATE_INDEX]]

                                                                                          selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                                                          else

                                                                                          for candidate in reversed(voter)

                                                                                          if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                          else

                                                                                          break

                                                                                          77

                                                                                          APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                                                          Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                                                          pos = set()

                                                                                          for index perc in enumerate(selfelectactical_vote_percentages)

                                                                                          if perc gt 0

                                                                                          posadd(index)

                                                                                          for candidate in selfeleccandidates

                                                                                          if candidate not in selfleading_candidates

                                                                                          for voter_index in selfvotes[candidate]

                                                                                          raised = None

                                                                                          for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                                                          ])

                                                                                          if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                                                          leading_candidates

                                                                                          if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                                                          if randomrandom() lt selfelectactical_vote_percentages[

                                                                                          candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                                                          ranking = [None]selfelecN_CANDIDATES

                                                                                          ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                          selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                          CANDIDATE_INDEX]])

                                                                                          raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                          break

                                                                                          break

                                                                                          break

                                                                                          if raised = None

                                                                                          for _candidate in selfleading_candidates

                                                                                          if _candidate = ranking[-1][0]

                                                                                          ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                          _candidate])

                                                                                          buried = _candidate

                                                                                          break

                                                                                          i = 1

                                                                                          for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                          if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                                                          buried]

                                                                                          continue

                                                                                          else

                                                                                          ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                          selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                          CANDIDATE_INDEX]])

                                                                                          i += 1

                                                                                          selfrankings_changed[voter_index] = ranking

                                                                                          78

                                                                                          APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                                                          Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                                                          for voter_index in selfvotes[candidate]

                                                                                          if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                                                          ]

                                                                                          for _candidate in selfleading_candidates

                                                                                          if _candidate = candidate

                                                                                          ranking = [None]selfelecN_CANDIDATES

                                                                                          ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                          _candidate])

                                                                                          buried = _candidate

                                                                                          break

                                                                                          i = 1

                                                                                          for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                          if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                                                          continue

                                                                                          else

                                                                                          ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                          selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                          CANDIDATE_INDEX]])

                                                                                          i += 1

                                                                                          selfrankings_changed[voter_index] = ranking

                                                                                          79

                                                                                          APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                                                          Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                                                          for index in range(selfelecN_CANDIDATES)

                                                                                          selfcandidates[index] = 0

                                                                                          for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                          score = 0

                                                                                          if voter_index in selfrankings_changed

                                                                                          for candidate in selfrankings_changed[voter_index]

                                                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                          score += 1

                                                                                          else

                                                                                          for candidate in voter

                                                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                          score += 1

                                                                                          APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                                                          Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                                                          for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                          if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                          elecCANDIDATE_INDEX]]

                                                                                          selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                                                          sorted_voters[voter_index])

                                                                                          for candidate_index candidate in enumerate(reversed(voter))

                                                                                          if candidate_index == 0

                                                                                          selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                          voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                                                          else

                                                                                          selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                          voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                                                          80

                                                                                          APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                                                          Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                                                          for index in range(selfelecN_CANDIDATES)

                                                                                          selfcandidates[index] = 0

                                                                                          for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                          if voter_index in selfrankings_changed

                                                                                          for candidate in selfrankings_changed[voter_index]

                                                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                          selfelecCANDIDATE_RANK]

                                                                                          else

                                                                                          for candidate in voter

                                                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                          selfelecCANDIDATE_RANK]

                                                                                          APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                                                          Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                                                          for index in range(selfelecN_CANDIDATES)

                                                                                          selfcandidates[index] = 0

                                                                                          for voter in selfelecsorted_voters

                                                                                          votes = selfelecN_VACANCIES

                                                                                          for candidate in reversed(voter)

                                                                                          if votes == 0

                                                                                          break

                                                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                          votes -= 1

                                                                                          • Folha de aprovaccedilatildeo
                                                                                          • Agradecimentos
                                                                                          • Epiacutegrafe
                                                                                          • Resumo
                                                                                          • Abstract
                                                                                          • Lista de ilustraccedilotildees
                                                                                          • Lista de Coacutedigos
                                                                                          • Lista de tabelas
                                                                                          • Lista de abreviaturas e siglas
                                                                                          • Sumaacuterio
                                                                                          • INTRODUCcedilAtildeO
                                                                                            • MOTIVACcedilAtildeO E OBJETIVO
                                                                                            • MEacuteTODO
                                                                                            • ESTRUTURA
                                                                                              • SISTEMAS ELEITORAIS
                                                                                                • FISRT PAST THE POST
                                                                                                  • Exemplo
                                                                                                  • Vantagens e Desvantagens do FPTP
                                                                                                  • Voto Uacutetil no FPTP
                                                                                                    • TWO-ROUND SYSTEM
                                                                                                      • Exemplo
                                                                                                      • Vantagens e Desvantagens do TRS
                                                                                                      • Voto Uacutetil no TRS
                                                                                                        • INSTANT-RUNOFF VOTING
                                                                                                          • Exemplo
                                                                                                          • Vantagens e Desvantagens do IRV
                                                                                                          • Voto Uacutetil no IRV
                                                                                                            • APPROVAL VOTING SYSTEM
                                                                                                              • Exemplo
                                                                                                              • Vantagens e Desvantagens do AVS
                                                                                                              • Voto Uacutetil no AVS
                                                                                                                • THE BORDA COUNT
                                                                                                                  • Exemplo
                                                                                                                  • Vantagens e Desvantagens do BC
                                                                                                                  • Voto Uacutetil no BC
                                                                                                                    • SCORE VOTING SYSTEM
                                                                                                                      • Exemplo
                                                                                                                      • Vantagens e Desvantagens do SVS
                                                                                                                      • Voto Uacutetil no SVS
                                                                                                                        • BLOC VOTE
                                                                                                                          • Exemplo
                                                                                                                          • Voto Uacutetil no BV
                                                                                                                              • O SIMULADOR
                                                                                                                              • CENAacuteRIOS PERTINENTES
                                                                                                                                • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                                                • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                                                • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                                                • CENAacuteRIO 4 COALIZOtildeES
                                                                                                                                • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                                                • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                                                  • COMO FUNCIONA O SIMULADOR
                                                                                                                                    • CLASSE Elections
                                                                                                                                    • CLASSE FirstPastThePost
                                                                                                                                    • CLASSE TwoRoundSystem
                                                                                                                                    • CLASSE InstantRunoffVoting
                                                                                                                                    • CLASSE ApprovalVoting
                                                                                                                                    • CLASSE BordaCount
                                                                                                                                    • CLASSE ScoreVoting
                                                                                                                                    • CLASSE BlocVote
                                                                                                                                    • TECNOLOGIAS UTILIZADAS
                                                                                                                                      • CONCLUSAtildeO
                                                                                                                                      • Referecircncias
                                                                                                                                      • Meacutetodo create_voters
                                                                                                                                      • Meacutetodo create_candidates
                                                                                                                                      • Meacutetodo calculate_means
                                                                                                                                      • Meacutetodo get_mean
                                                                                                                                      • Meacutetodo calculate_mean
                                                                                                                                      • Meacutetodo set_leading_candidates
                                                                                                                                      • Meacutetodo irv_set_leading_candidates
                                                                                                                                      • Meacutetodo sort_ranks
                                                                                                                                      • Meacutetodo fptp_count_tactical_votes
                                                                                                                                      • Meacutetodo fptp_count_minority_votes
                                                                                                                                      • Meacutetodo trs_second_round
                                                                                                                                      • Meacutetodo trs_account_for_coalitions
                                                                                                                                      • Meacutetodo irv_count_votes
                                                                                                                                      • Meacutetodo avs_count_votes
                                                                                                                                      • Meacutetodo avs_count_votes_with_tactical
                                                                                                                                      • Meacutetodo irv_apply_tactical_votes
                                                                                                                                      • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                                                      • Meacutetodo bc_sum_candidates_scores
                                                                                                                                      • Meacutetodo svs_apply_tactical_votes
                                                                                                                                      • Meacutetodo svs_sum_candidates_scores
                                                                                                                                      • Meacutetodo bv_count_votes

                                                                                            46

                                                                                            Figura 32 ndash TRS turno 2 - Cenaacuterio 4

                                                                                            Figura 33 ndash TRS coalizatildeo de Carla e Diego - Cenaacuterio 4

                                                                                            Figura 34 ndash TRS coalizatildeo de Carla e Ana - Cenaacuterio 4

                                                                                            47

                                                                                            Coalizatildeo Carla e Diego lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2203Carla20Diego-100gt

                                                                                            Coalizatildeo Carla e Ana lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2200Carla20Ana-100gt

                                                                                            45 CENAacuteRIO 5 DILEMA DO PRISIONEIRO

                                                                                            Neste cenaacuterio temos uma eleiccedilatildeo de uma vaga com trecircs candidatos concorrentes e trecircsperfis distintos de eleitores que seguiratildeo as seguintes distribuiccedilotildees

                                                                                            Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5

                                                                                            Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                                                            deeleitores

                                                                                            1 10 -10 5 362 -10 10 5 343 -10 -10 5 30

                                                                                            Esse contexto nos remete ao notaacutevel dilema do prisioneiro Nele dois prisioneiroscuacutemplices satildeo interrogados individualmente sem poder se comunicar um com o outro ecada um enfrenta o dilema de delatar ou natildeo o seu parceiro Se os dois prisioneirosdecidem se manter calados sobre o crime ambos satildeo sentenciados a um ano de prisatildeo Seapenas um deles dedurar o outro o traidor sai livre enquanto seu parceiro eacute condenadoa trecircs anos Se ambos dedurarem um ao outro eles satildeo condenados juntos a dois anosde prisatildeo Esse dilema eacute uma ideia claacutessica presente no estudo da teoria dos jogos sendooriginalmente elaborada por Merrill Flood e Melvin Dresher em 1950 e mais tarde sendonomeada de dilema dos prisioneiros por Albert W Tucker (POUNDSTONE 1992)

                                                                                            O que esse dilema nos mostra eacute a tentaccedilatildeo que o indiviacuteduo deteacutem se sua racionalizaccedilatildeoestiver voltada para seus proacuteprios interesses e somente eles em oposiccedilatildeo a pensar no bemdo grupo como um todo Neste cenaacuterio encontramos dois grupos de eleitores expressiva-mente opostos os perfis 1 e 2 Se qualquer uma das preferecircncias desses perfis fosse eleitaisso significaria uma alta rejeiccedilatildeo de maior parte da populaccedilatildeo No entanto eles possuema segunda opccedilatildeo em comum a Carla que por sua vez eacute a preferecircncia do terceiro perfilPortanto a eleiccedilatildeo da Carla seria logicamente o resultado oacutetimo

                                                                                            Mesmo assim a Ana eacute eleita nos dois sistemas acima o que natildeo parece justo poispela tabela 16 eacute evidente que apenas 36 da populaccedilatildeo a aprova enquanto que os outros64 a reprovam ao maacuteximo O sistema IRV se comporta de maneira idecircntica ao TRS

                                                                                            48

                                                                                            Figura 35 ndash FPTP - Cenaacuterio 5

                                                                                            Figura 36 ndash TRS segundo turno - Cenaacuterio 5

                                                                                            nesta situaccedilatildeo Com esse resultado a meacutedia das notas eacute -28 No entanto os trecircs sistemasseguintes nos apresentam resultados diferentes

                                                                                            Tabela 17 ndash Resultados do Cenaacuterio 5

                                                                                            Sistema Candidatoeleito

                                                                                            Meacutedia dasnotas

                                                                                            FPTP Ana -28TRS Ana -28IRV Ana -28AVS Carla 50BC Carla 50SVS Carla 50

                                                                                            49

                                                                                            Figura 37 ndash AVS - Cenaacuterio 5

                                                                                            Figura 38 ndash BC - Cenaacuterio 5

                                                                                            Tanto o AVS quanto o Borda Count e o SVS satildeo sistemas que consideram todasas opiniotildees de cada eleitor ao mesmo tempo e por isso satildeo capazes de eleger o melhorcandidato nesta situaccedilatildeo diferentemente do TRS que natildeo absorve completamente todosentimento do eleitor por todos os candidatos e o IRV que apesar de ser bem expressivoquebra esse processo em inuacutemeras rodadas o que permite a perda de informaccedilatildeo ao longodelas

                                                                                            Esses resultados podem ser replicados acessando o linklthttpelectionsimpythonanywherecomdirect_res1111110---[22Ana

                                                                                            222022Beto222022Carla22]-----36Voter20Profile2001020-1020534Voter20Profile201-10201020530Voter20Profile202-1020-10205100gt

                                                                                            50

                                                                                            Figura 39 ndash SVS - Cenaacuterio 5

                                                                                            46 CENAacuteRIO 6 VOTO DE MINORIA

                                                                                            Neste cenaacuterio temos uma eleiccedilatildeo com quatro candidatos e duas vagas A Ana seraacutea preferecircncia de uma extensa parte da populaccedilatildeo (distribuiccedilatildeo Loved Figura 53) Betoe Carla seratildeo candidatos razoavelmente populares (distribuiccedilatildeo Neutral Figura 47) eDiego seraacute a preferecircncia de apenas um pequeno grupo especiacutefico e rejeitado pela maioria(distribuiccedilatildeo Disliked Figura 51) Eacute intuitivo esperar que os dois candidatos eleitos seratildeoa Ana e ou o Beto ou a Carla e isso eacute exatamente o que ocorre na figura 40 no sistemaFPTP sem voto de minoria

                                                                                            Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria

                                                                                            Eacute evidente a discrepacircncia da quantidade de votos da Ana para os outros candidatose apesar de Beto e Carla serem mais populares que Diego os trecircs natildeo se encontrammuito afastados Poreacutem se a pequena fraccedilatildeo de candidatos que possuem a Ana como

                                                                                            51

                                                                                            Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego

                                                                                            preferecircncia e Diego como segunda opccedilatildeo optarem pelo voto de minoria a situaccedilatildeo mudacompletamente (Figura 41) Assim apesar de extensamente rejeitado Diego conquistaa segunda vaga e a meacutedia das notas despenca de 2929 para 0505 No entanto aindaexiste um cenaacuterio pior Se os outros grupos de eleitores pensarem da mesma forma eevitarem votar na Ana achando que sua eleiccedilatildeo jaacute estaacute assegurada apenas 80 de votode minoria para esses grupos jaacute eacute o suficiente para eliminaacute-la das eleiccedilotildees (Figura 42)Com a Ana eliminada a meacutedia das notas cai ainda mais para 0058

                                                                                            Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego

                                                                                            O sistema Bloc Vote eacute uma das soluccedilotildees para o voto de minoria Permitindo queos eleitores votem no mesmo nuacutemero de candidatos que de vagas a serem preenchidasnatildeo existe o iacutempeto a esse tipo de voto estrateacutegico O resultado desse sistema portantoretorna a meacutedia das notas a casa dos 29 (Figura 43) Os sistemas AVS Borda Count eSVS tambeacutem impedem a presenccedila do voto de minoria e atingem resultados semelhantes

                                                                                            52

                                                                                            Figura 43 ndash BV - Cenaacuterio 6

                                                                                            Tabela 18 ndash Resultados do Cenaacuterio 6

                                                                                            Sistema Candidatoseleitos

                                                                                            Meacutedia dasnotas

                                                                                            FPTP sem voto de minoriaAna eBeto 2929

                                                                                            FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

                                                                                            FPTP com 80 de voto de minoriaBeto eCarla 0058

                                                                                            Bloc VoteAna eCarla 2913

                                                                                            Esses resultados podem ser replicados acessando os links

                                                                                            Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

                                                                                            100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

                                                                                            80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

                                                                                            53

                                                                                            5 COMO FUNCIONA O SIMULADOR

                                                                                            O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

                                                                                            51 CLASSE ELECTIONS

                                                                                            Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

                                                                                            bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

                                                                                            Figura 44 ndash estrutura candidates

                                                                                            bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

                                                                                            bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

                                                                                            Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

                                                                                            Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

                                                                                            54

                                                                                            Figura 45 ndash estrutura voters

                                                                                            Figura 46 ndash estrutura votes

                                                                                            daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

                                                                                            Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

                                                                                            55

                                                                                            Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

                                                                                            Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

                                                                                            na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

                                                                                            56

                                                                                            Figura 49 ndash PDF - Distribuiccedilatildeo Liked

                                                                                            Figura 50 ndash CDF - Distribuiccedilatildeo Liked

                                                                                            (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

                                                                                            Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

                                                                                            57

                                                                                            Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

                                                                                            Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

                                                                                            candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

                                                                                            Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

                                                                                            58

                                                                                            Figura 53 ndash PDF - Distribuiccedilatildeo Loved

                                                                                            Figura 54 ndash CDF - Distribuiccedilatildeo Loved

                                                                                            funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

                                                                                            59

                                                                                            Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                                                                                            Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                                                                                            Meacutedia das Notas sumei

                                                                                            sumvj nij

                                                                                            etimes v

                                                                                            Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                                                                                            Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                                                                                            60

                                                                                            Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                                                                                            Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                                                                                            52 CLASSE FIRSTPASTTHEPOST

                                                                                            Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                                                                                            Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                                                                                            61

                                                                                            Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                                                                                            Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                                                                                            mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                                                                                            62

                                                                                            53 CLASSE TWOROUNDSYSTEM

                                                                                            A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                                                                                            54 CLASSE INSTANTRUNOFFVOTING

                                                                                            A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                                                                                            Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                                                                                            63

                                                                                            cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                                                                                            55 CLASSE APPROVALVOTING

                                                                                            Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                                                                                            56 CLASSE BORDACOUNT

                                                                                            Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                                                                                            57 CLASSE SCOREVOTING

                                                                                            De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                                                                                            64

                                                                                            58 CLASSE BLOCVOTE

                                                                                            O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                                                                                            59 TECNOLOGIAS UTILIZADAS

                                                                                            A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                                                                                            Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                                                                                            O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                                                                                            Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                                                                                            65

                                                                                            6 CONCLUSAtildeO

                                                                                            Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                                                                                            Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                                                                                            Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                                                                                            Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                                                                                            Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                                                                                            66

                                                                                            REFEREcircNCIAS

                                                                                            AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                                                                                            Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                                                                                            Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                                                                                            Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                                                                                            HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                                                                                            LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                                                                                            ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                                                                                            Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                                                                                            POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                                                                                            The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                                                                                            67

                                                                                            APEcircNDICES

                                                                                            APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                                                                            Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                                                                            if(not len(selfvoter_profiles))

                                                                                            for voter in range(selfN_VOTERS)

                                                                                            candidates_rank = dict()

                                                                                            for candidate in reversed(range(selfN_CANDIDATES))

                                                                                            if(selfBIAS_VECTOR[candidate]==4)

                                                                                            candidates_rank[candidate] = self_sortear(selfloved)

                                                                                            elif(selfBIAS_VECTOR[candidate]==3)

                                                                                            candidates_rank[candidate] = self_sortear(selfliked)

                                                                                            elif(selfBIAS_VECTOR[candidate]==2)

                                                                                            candidates_rank[candidate] = self_sortear(selfdisliked)

                                                                                            elif(selfBIAS_VECTOR[candidate]==1)

                                                                                            candidates_rank[candidate] = self_sortear(selfhated)

                                                                                            elif(selfBIAS_VECTOR[candidate]==-1)

                                                                                            candidates_rank[candidate] = self_sortear(selfpolarizer

                                                                                            )

                                                                                            elif(selfBIAS_VECTOR[candidate]==-2)

                                                                                            candidates_rank[candidate] = self_sortear(self

                                                                                            more_polarizer)

                                                                                            else

                                                                                            candidates_rank[candidate] = self_sortear(selfneutral)

                                                                                            selfvotersappend(candidates_rank)

                                                                                            else

                                                                                            ranges = []

                                                                                            ranks = []

                                                                                            for prof in selfvoter_profiles

                                                                                            rangesappend(int(prof[pop_percentage]))

                                                                                            rank =

                                                                                            for index score in enumerate(prof[scores])

                                                                                            rank[index] = score

                                                                                            ranksappend(rank)

                                                                                            for index _range in enumerate(ranges)

                                                                                            for _ in range(int(selfN_VOTERS(_range100)))

                                                                                            selfvotersappend(ranks[index])

                                                                                            68

                                                                                            APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                                                                            Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                                                                            for i in range(selfN_CANDIDATES)

                                                                                            selfcandidates[i] = 0

                                                                                            selfvotes[i] = set()

                                                                                            APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                                                                            Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                                                                            for candidate in range(selfN_CANDIDATES)

                                                                                            rating_sum = 0

                                                                                            for voter in selfvoters

                                                                                            rating_sum += voter[candidate]

                                                                                            selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                                                                            APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                                                                            Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                                                                            if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                                                                            return selfcalculate_mean(winners)

                                                                                            else

                                                                                            chose_best = True if winners[0] == selfbest_candidate else

                                                                                            False

                                                                                            return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                                                                            69

                                                                                            APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                                                                            Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                                                                            rating_sum = 0

                                                                                            for voter in selfvoters

                                                                                            for candidate in winners

                                                                                            rating_sum += voter[candidate]

                                                                                            return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                                                                            APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                                                                            Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                                                                            for i in range(1 selfN_VACANCIES + 2)

                                                                                            selfleading_candidatesappend(selfsorted_candidates[-i][self

                                                                                            CANDIDATE_INDEX])

                                                                                            APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                                                                            Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                                                                            for leader in selfelecrounds[-1]

                                                                                            selfleading_candidatesappend(leader[0])

                                                                                            70

                                                                                            APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                                                                            Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                                                                            self_account_for_coalitions()

                                                                                            for voter in selfvoters

                                                                                            selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                                                                            (1)))

                                                                                            temp = []

                                                                                            for voter in selfsorted_voters

                                                                                            new_dict = defaultdict(list)

                                                                                            for k in voter

                                                                                            new_dict[k[1]]append(k[0])

                                                                                            tempappend(new_dict)

                                                                                            selfsorted_voters = []

                                                                                            for voter_index current_voter in enumerate(temp)

                                                                                            new_voter = []

                                                                                            for rating candidate_indexes in current_voteritems()

                                                                                            if len(current_voter[rating]) gt 1

                                                                                            shuffle(current_voter[rating])

                                                                                            for e in candidate_indexes

                                                                                            new_voterappend((e rating))

                                                                                            else

                                                                                            new_voterappend((candidate_indexes[0] rating))

                                                                                            selfsorted_votersappend(new_voter)

                                                                                            selfcandidates[new_voter[-1][0]] += 1

                                                                                            selfvotes[new_voter[-1][0]]add(voter_index)

                                                                                            71

                                                                                            APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                                                                            Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                                                                            for candidate in selfvotes_copy

                                                                                            if candidate not in selfelecleading_candidates

                                                                                            for voter_index in selfvotes_copy[candidate]

                                                                                            for index _candidate in enumerate(reversed(selfelec

                                                                                            sorted_voters[voter_index]))

                                                                                            if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                                                                            leading_candidates

                                                                                            if randomrandom() lt selfelec

                                                                                            tactical_vote_percentages[_candidate[selfelec

                                                                                            CANDIDATE_INDEX]]

                                                                                            selfrankings_changed[voter_index] = copy

                                                                                            deepcopy(selfelecsorted_voters[voter_index])

                                                                                            selfrankings_changed[voter_index][-(index + 1)]

                                                                                            selfrankings_changed[voter_index][-1] = self

                                                                                            rankings_changed[voter_index][-1] self

                                                                                            rankings_changed[voter_index][-(index + 1)]

                                                                                            selfcandidates[candidate] -= 1

                                                                                            selfcandidates[_candidate[selfelec

                                                                                            CANDIDATE_INDEX]] += 1

                                                                                            selfvotes[candidate]remove(voter_index)

                                                                                            selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                                                                            ]]add(voter_index)

                                                                                            break

                                                                                            break

                                                                                            72

                                                                                            APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                                                                            Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                                                                            half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                                                                            for candidate in selfelecleading_candidates

                                                                                            if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                                                                            continue

                                                                                            for voter_index in selfvotes_copy[candidate]

                                                                                            if voter_index in selfrankings_changed

                                                                                            ranking = selfrankings_changed[voter_index]

                                                                                            else

                                                                                            ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                                                                            ])

                                                                                            for index _candidate in enumerate(reversed(ranking))

                                                                                            if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                            leading_candidates or (_candidate[selfelec

                                                                                            CANDIDATE_INDEX] in selfelecleading_candidates and

                                                                                            selfelecleading_candidatesindex(_candidate[selfelec

                                                                                            CANDIDATE_INDEX]) gt= half_vacancies)

                                                                                            if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                                                                            if randomrandom() lt selfelec

                                                                                            minority_vote_percentages[_candidate[selfelec

                                                                                            CANDIDATE_INDEX]]

                                                                                            selfcandidates[candidate] -= 1

                                                                                            selfcandidates[_candidate[selfelec

                                                                                            CANDIDATE_INDEX]] += 1

                                                                                            break

                                                                                            break

                                                                                            break

                                                                                            73

                                                                                            APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                                                                            Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                                                                            self_account_for_coalitions()

                                                                                            for candidate in selfvotes

                                                                                            if candidate = selfwinner and candidate = selfsecond_place

                                                                                            for voter_index in selfvotes[candidate]

                                                                                            if voter_index in selfrankings_changed

                                                                                            ranking = selfrankings_changed[voter_index]

                                                                                            else

                                                                                            ranking = copydeepcopy(selfelecsorted_voters[

                                                                                            voter_index])

                                                                                            for index2 candidate in enumerate(reversed(ranking))

                                                                                            if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                                                                            selfcandidates[selfwinner] += 1

                                                                                            selfvotes[selfwinner]add(voter_index)

                                                                                            break

                                                                                            elif candidate[selfelecCANDIDATE_INDEX] == self

                                                                                            second_place

                                                                                            selfcandidates[selfsecond_place] += 1

                                                                                            selfvotes[selfsecond_place]add(voter_index)

                                                                                            break

                                                                                            selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                            winners = []

                                                                                            vacancies = selfelecN_VACANCIES

                                                                                            for candidate in reversed(selfsorted_candidates)

                                                                                            if vacancies == 0

                                                                                            break

                                                                                            winnersappend(candidate[0])

                                                                                            vacancies -= 1

                                                                                            mean chose_best = selfelecget_mean(winners = winners)

                                                                                            74

                                                                                            APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                                                                            Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                                                                            for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                            voter_dict = dict()

                                                                                            og_voter_dict = dict()

                                                                                            for tup in voter

                                                                                            voter_dict[tup[0]] = tup[1]

                                                                                            og_voter_dict[tup[0]] = tup[1]

                                                                                            for coalition in selfeleccoalitions

                                                                                            for candidate in coalition

                                                                                            add_to_score = 0

                                                                                            for candidate2 in coalition

                                                                                            if candidate == candidate2

                                                                                            continue

                                                                                            half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                                                                            if half lt 0

                                                                                            add_to_score += mathceil(half)

                                                                                            else

                                                                                            add_to_score += mathfloor(half)

                                                                                            if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                                                                            voter_dict[candidate[rsquovaluersquo]] = 10

                                                                                            elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                                                                            voter_dict[candidate[rsquovaluersquo]] = -10

                                                                                            else

                                                                                            voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                                                                            selfrankings_changed[voter_index] = []

                                                                                            for candidate in voter_dict

                                                                                            selfrankings_changed[voter_index]append((candidate voter_dict[

                                                                                            candidate]))

                                                                                            selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                                                                            voter_index] key=lambda x x[1])

                                                                                            75

                                                                                            APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                                                            Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                                                            selfelecroundsappend(selfsorted_candidates[_round])

                                                                                            if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                            N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                                                            N_VACANCIES - 1)

                                                                                            return 2

                                                                                            elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                            N_VOTERS gt 05)

                                                                                            return 1

                                                                                            else

                                                                                            selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                                                            CANDIDATE_INDEX])

                                                                                            for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                                                            elecCANDIDATE_INDEX]]

                                                                                            if voter_index in selfrankings_changed

                                                                                            for candidate in reversed(selfrankings_changed[voter_index

                                                                                            ])

                                                                                            if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                            excluded

                                                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                            ]] += 1

                                                                                            selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                            add(voter_index)

                                                                                            break

                                                                                            else

                                                                                            continue

                                                                                            else

                                                                                            for candidate in reversed(selfelecsorted_voters[

                                                                                            voter_index])

                                                                                            if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                            excluded

                                                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                            ]] += 1

                                                                                            selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                            add(voter_index)

                                                                                            break

                                                                                            else

                                                                                            continue

                                                                                            selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                            return 0

                                                                                            76

                                                                                            APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                                                            Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                                                            for index in range(selfelecN_CANDIDATES)

                                                                                            selfcandidates[index] = 0

                                                                                            for voter in selfelecsorted_voters

                                                                                            for candidate in reversed(voter)

                                                                                            if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                            else

                                                                                            break

                                                                                            APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                                                            Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                                                            for index in range(selfelecN_CANDIDATES)

                                                                                            selfcandidates[index] = 0

                                                                                            for voter in selfelecsorted_voters

                                                                                            if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                            elecCANDIDATE_INDEX]]

                                                                                            selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                                                            else

                                                                                            for candidate in reversed(voter)

                                                                                            if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                            else

                                                                                            break

                                                                                            77

                                                                                            APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                                                            Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                                                            pos = set()

                                                                                            for index perc in enumerate(selfelectactical_vote_percentages)

                                                                                            if perc gt 0

                                                                                            posadd(index)

                                                                                            for candidate in selfeleccandidates

                                                                                            if candidate not in selfleading_candidates

                                                                                            for voter_index in selfvotes[candidate]

                                                                                            raised = None

                                                                                            for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                                                            ])

                                                                                            if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                                                            leading_candidates

                                                                                            if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                                                            if randomrandom() lt selfelectactical_vote_percentages[

                                                                                            candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                                                            ranking = [None]selfelecN_CANDIDATES

                                                                                            ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                            selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                            CANDIDATE_INDEX]])

                                                                                            raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                            break

                                                                                            break

                                                                                            break

                                                                                            if raised = None

                                                                                            for _candidate in selfleading_candidates

                                                                                            if _candidate = ranking[-1][0]

                                                                                            ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                            _candidate])

                                                                                            buried = _candidate

                                                                                            break

                                                                                            i = 1

                                                                                            for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                            if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                                                            buried]

                                                                                            continue

                                                                                            else

                                                                                            ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                            selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                            CANDIDATE_INDEX]])

                                                                                            i += 1

                                                                                            selfrankings_changed[voter_index] = ranking

                                                                                            78

                                                                                            APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                                                            Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                                                            for voter_index in selfvotes[candidate]

                                                                                            if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                                                            ]

                                                                                            for _candidate in selfleading_candidates

                                                                                            if _candidate = candidate

                                                                                            ranking = [None]selfelecN_CANDIDATES

                                                                                            ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                            _candidate])

                                                                                            buried = _candidate

                                                                                            break

                                                                                            i = 1

                                                                                            for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                            if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                                                            continue

                                                                                            else

                                                                                            ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                            selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                            CANDIDATE_INDEX]])

                                                                                            i += 1

                                                                                            selfrankings_changed[voter_index] = ranking

                                                                                            79

                                                                                            APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                                                            Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                                                            for index in range(selfelecN_CANDIDATES)

                                                                                            selfcandidates[index] = 0

                                                                                            for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                            score = 0

                                                                                            if voter_index in selfrankings_changed

                                                                                            for candidate in selfrankings_changed[voter_index]

                                                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                            score += 1

                                                                                            else

                                                                                            for candidate in voter

                                                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                            score += 1

                                                                                            APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                                                            Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                                                            for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                            if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                            elecCANDIDATE_INDEX]]

                                                                                            selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                                                            sorted_voters[voter_index])

                                                                                            for candidate_index candidate in enumerate(reversed(voter))

                                                                                            if candidate_index == 0

                                                                                            selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                            voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                                                            else

                                                                                            selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                            voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                                                            80

                                                                                            APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                                                            Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                                                            for index in range(selfelecN_CANDIDATES)

                                                                                            selfcandidates[index] = 0

                                                                                            for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                            if voter_index in selfrankings_changed

                                                                                            for candidate in selfrankings_changed[voter_index]

                                                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                            selfelecCANDIDATE_RANK]

                                                                                            else

                                                                                            for candidate in voter

                                                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                            selfelecCANDIDATE_RANK]

                                                                                            APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                                                            Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                                                            for index in range(selfelecN_CANDIDATES)

                                                                                            selfcandidates[index] = 0

                                                                                            for voter in selfelecsorted_voters

                                                                                            votes = selfelecN_VACANCIES

                                                                                            for candidate in reversed(voter)

                                                                                            if votes == 0

                                                                                            break

                                                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                            votes -= 1

                                                                                            • Folha de aprovaccedilatildeo
                                                                                            • Agradecimentos
                                                                                            • Epiacutegrafe
                                                                                            • Resumo
                                                                                            • Abstract
                                                                                            • Lista de ilustraccedilotildees
                                                                                            • Lista de Coacutedigos
                                                                                            • Lista de tabelas
                                                                                            • Lista de abreviaturas e siglas
                                                                                            • Sumaacuterio
                                                                                            • INTRODUCcedilAtildeO
                                                                                              • MOTIVACcedilAtildeO E OBJETIVO
                                                                                              • MEacuteTODO
                                                                                              • ESTRUTURA
                                                                                                • SISTEMAS ELEITORAIS
                                                                                                  • FISRT PAST THE POST
                                                                                                    • Exemplo
                                                                                                    • Vantagens e Desvantagens do FPTP
                                                                                                    • Voto Uacutetil no FPTP
                                                                                                      • TWO-ROUND SYSTEM
                                                                                                        • Exemplo
                                                                                                        • Vantagens e Desvantagens do TRS
                                                                                                        • Voto Uacutetil no TRS
                                                                                                          • INSTANT-RUNOFF VOTING
                                                                                                            • Exemplo
                                                                                                            • Vantagens e Desvantagens do IRV
                                                                                                            • Voto Uacutetil no IRV
                                                                                                              • APPROVAL VOTING SYSTEM
                                                                                                                • Exemplo
                                                                                                                • Vantagens e Desvantagens do AVS
                                                                                                                • Voto Uacutetil no AVS
                                                                                                                  • THE BORDA COUNT
                                                                                                                    • Exemplo
                                                                                                                    • Vantagens e Desvantagens do BC
                                                                                                                    • Voto Uacutetil no BC
                                                                                                                      • SCORE VOTING SYSTEM
                                                                                                                        • Exemplo
                                                                                                                        • Vantagens e Desvantagens do SVS
                                                                                                                        • Voto Uacutetil no SVS
                                                                                                                          • BLOC VOTE
                                                                                                                            • Exemplo
                                                                                                                            • Voto Uacutetil no BV
                                                                                                                                • O SIMULADOR
                                                                                                                                • CENAacuteRIOS PERTINENTES
                                                                                                                                  • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                                                  • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                                                  • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                                                  • CENAacuteRIO 4 COALIZOtildeES
                                                                                                                                  • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                                                  • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                                                    • COMO FUNCIONA O SIMULADOR
                                                                                                                                      • CLASSE Elections
                                                                                                                                      • CLASSE FirstPastThePost
                                                                                                                                      • CLASSE TwoRoundSystem
                                                                                                                                      • CLASSE InstantRunoffVoting
                                                                                                                                      • CLASSE ApprovalVoting
                                                                                                                                      • CLASSE BordaCount
                                                                                                                                      • CLASSE ScoreVoting
                                                                                                                                      • CLASSE BlocVote
                                                                                                                                      • TECNOLOGIAS UTILIZADAS
                                                                                                                                        • CONCLUSAtildeO
                                                                                                                                        • Referecircncias
                                                                                                                                        • Meacutetodo create_voters
                                                                                                                                        • Meacutetodo create_candidates
                                                                                                                                        • Meacutetodo calculate_means
                                                                                                                                        • Meacutetodo get_mean
                                                                                                                                        • Meacutetodo calculate_mean
                                                                                                                                        • Meacutetodo set_leading_candidates
                                                                                                                                        • Meacutetodo irv_set_leading_candidates
                                                                                                                                        • Meacutetodo sort_ranks
                                                                                                                                        • Meacutetodo fptp_count_tactical_votes
                                                                                                                                        • Meacutetodo fptp_count_minority_votes
                                                                                                                                        • Meacutetodo trs_second_round
                                                                                                                                        • Meacutetodo trs_account_for_coalitions
                                                                                                                                        • Meacutetodo irv_count_votes
                                                                                                                                        • Meacutetodo avs_count_votes
                                                                                                                                        • Meacutetodo avs_count_votes_with_tactical
                                                                                                                                        • Meacutetodo irv_apply_tactical_votes
                                                                                                                                        • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                                                        • Meacutetodo bc_sum_candidates_scores
                                                                                                                                        • Meacutetodo svs_apply_tactical_votes
                                                                                                                                        • Meacutetodo svs_sum_candidates_scores
                                                                                                                                        • Meacutetodo bv_count_votes

                                                                                              47

                                                                                              Coalizatildeo Carla e Diego lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2203Carla20Diego-100gt

                                                                                              Coalizatildeo Carla e Ana lthttpelectionsimpythonanywherecomdirect_res0100000--[0002][22Ana2222Beto2222Carla2222Diego22]----2200Carla20Ana-100gt

                                                                                              45 CENAacuteRIO 5 DILEMA DO PRISIONEIRO

                                                                                              Neste cenaacuterio temos uma eleiccedilatildeo de uma vaga com trecircs candidatos concorrentes e trecircsperfis distintos de eleitores que seguiratildeo as seguintes distribuiccedilotildees

                                                                                              Tabela 16 ndash Distribuiccedilatildeo de notas - Cenaacuterio 5

                                                                                              Perfil Nota da Ana Nota do Beto Nota da CarlaPorcentagem

                                                                                              deeleitores

                                                                                              1 10 -10 5 362 -10 10 5 343 -10 -10 5 30

                                                                                              Esse contexto nos remete ao notaacutevel dilema do prisioneiro Nele dois prisioneiroscuacutemplices satildeo interrogados individualmente sem poder se comunicar um com o outro ecada um enfrenta o dilema de delatar ou natildeo o seu parceiro Se os dois prisioneirosdecidem se manter calados sobre o crime ambos satildeo sentenciados a um ano de prisatildeo Seapenas um deles dedurar o outro o traidor sai livre enquanto seu parceiro eacute condenadoa trecircs anos Se ambos dedurarem um ao outro eles satildeo condenados juntos a dois anosde prisatildeo Esse dilema eacute uma ideia claacutessica presente no estudo da teoria dos jogos sendooriginalmente elaborada por Merrill Flood e Melvin Dresher em 1950 e mais tarde sendonomeada de dilema dos prisioneiros por Albert W Tucker (POUNDSTONE 1992)

                                                                                              O que esse dilema nos mostra eacute a tentaccedilatildeo que o indiviacuteduo deteacutem se sua racionalizaccedilatildeoestiver voltada para seus proacuteprios interesses e somente eles em oposiccedilatildeo a pensar no bemdo grupo como um todo Neste cenaacuterio encontramos dois grupos de eleitores expressiva-mente opostos os perfis 1 e 2 Se qualquer uma das preferecircncias desses perfis fosse eleitaisso significaria uma alta rejeiccedilatildeo de maior parte da populaccedilatildeo No entanto eles possuema segunda opccedilatildeo em comum a Carla que por sua vez eacute a preferecircncia do terceiro perfilPortanto a eleiccedilatildeo da Carla seria logicamente o resultado oacutetimo

                                                                                              Mesmo assim a Ana eacute eleita nos dois sistemas acima o que natildeo parece justo poispela tabela 16 eacute evidente que apenas 36 da populaccedilatildeo a aprova enquanto que os outros64 a reprovam ao maacuteximo O sistema IRV se comporta de maneira idecircntica ao TRS

                                                                                              48

                                                                                              Figura 35 ndash FPTP - Cenaacuterio 5

                                                                                              Figura 36 ndash TRS segundo turno - Cenaacuterio 5

                                                                                              nesta situaccedilatildeo Com esse resultado a meacutedia das notas eacute -28 No entanto os trecircs sistemasseguintes nos apresentam resultados diferentes

                                                                                              Tabela 17 ndash Resultados do Cenaacuterio 5

                                                                                              Sistema Candidatoeleito

                                                                                              Meacutedia dasnotas

                                                                                              FPTP Ana -28TRS Ana -28IRV Ana -28AVS Carla 50BC Carla 50SVS Carla 50

                                                                                              49

                                                                                              Figura 37 ndash AVS - Cenaacuterio 5

                                                                                              Figura 38 ndash BC - Cenaacuterio 5

                                                                                              Tanto o AVS quanto o Borda Count e o SVS satildeo sistemas que consideram todasas opiniotildees de cada eleitor ao mesmo tempo e por isso satildeo capazes de eleger o melhorcandidato nesta situaccedilatildeo diferentemente do TRS que natildeo absorve completamente todosentimento do eleitor por todos os candidatos e o IRV que apesar de ser bem expressivoquebra esse processo em inuacutemeras rodadas o que permite a perda de informaccedilatildeo ao longodelas

                                                                                              Esses resultados podem ser replicados acessando o linklthttpelectionsimpythonanywherecomdirect_res1111110---[22Ana

                                                                                              222022Beto222022Carla22]-----36Voter20Profile2001020-1020534Voter20Profile201-10201020530Voter20Profile202-1020-10205100gt

                                                                                              50

                                                                                              Figura 39 ndash SVS - Cenaacuterio 5

                                                                                              46 CENAacuteRIO 6 VOTO DE MINORIA

                                                                                              Neste cenaacuterio temos uma eleiccedilatildeo com quatro candidatos e duas vagas A Ana seraacutea preferecircncia de uma extensa parte da populaccedilatildeo (distribuiccedilatildeo Loved Figura 53) Betoe Carla seratildeo candidatos razoavelmente populares (distribuiccedilatildeo Neutral Figura 47) eDiego seraacute a preferecircncia de apenas um pequeno grupo especiacutefico e rejeitado pela maioria(distribuiccedilatildeo Disliked Figura 51) Eacute intuitivo esperar que os dois candidatos eleitos seratildeoa Ana e ou o Beto ou a Carla e isso eacute exatamente o que ocorre na figura 40 no sistemaFPTP sem voto de minoria

                                                                                              Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria

                                                                                              Eacute evidente a discrepacircncia da quantidade de votos da Ana para os outros candidatose apesar de Beto e Carla serem mais populares que Diego os trecircs natildeo se encontrammuito afastados Poreacutem se a pequena fraccedilatildeo de candidatos que possuem a Ana como

                                                                                              51

                                                                                              Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego

                                                                                              preferecircncia e Diego como segunda opccedilatildeo optarem pelo voto de minoria a situaccedilatildeo mudacompletamente (Figura 41) Assim apesar de extensamente rejeitado Diego conquistaa segunda vaga e a meacutedia das notas despenca de 2929 para 0505 No entanto aindaexiste um cenaacuterio pior Se os outros grupos de eleitores pensarem da mesma forma eevitarem votar na Ana achando que sua eleiccedilatildeo jaacute estaacute assegurada apenas 80 de votode minoria para esses grupos jaacute eacute o suficiente para eliminaacute-la das eleiccedilotildees (Figura 42)Com a Ana eliminada a meacutedia das notas cai ainda mais para 0058

                                                                                              Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego

                                                                                              O sistema Bloc Vote eacute uma das soluccedilotildees para o voto de minoria Permitindo queos eleitores votem no mesmo nuacutemero de candidatos que de vagas a serem preenchidasnatildeo existe o iacutempeto a esse tipo de voto estrateacutegico O resultado desse sistema portantoretorna a meacutedia das notas a casa dos 29 (Figura 43) Os sistemas AVS Borda Count eSVS tambeacutem impedem a presenccedila do voto de minoria e atingem resultados semelhantes

                                                                                              52

                                                                                              Figura 43 ndash BV - Cenaacuterio 6

                                                                                              Tabela 18 ndash Resultados do Cenaacuterio 6

                                                                                              Sistema Candidatoseleitos

                                                                                              Meacutedia dasnotas

                                                                                              FPTP sem voto de minoriaAna eBeto 2929

                                                                                              FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

                                                                                              FPTP com 80 de voto de minoriaBeto eCarla 0058

                                                                                              Bloc VoteAna eCarla 2913

                                                                                              Esses resultados podem ser replicados acessando os links

                                                                                              Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

                                                                                              100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

                                                                                              80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

                                                                                              53

                                                                                              5 COMO FUNCIONA O SIMULADOR

                                                                                              O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

                                                                                              51 CLASSE ELECTIONS

                                                                                              Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

                                                                                              bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

                                                                                              Figura 44 ndash estrutura candidates

                                                                                              bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

                                                                                              bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

                                                                                              Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

                                                                                              Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

                                                                                              54

                                                                                              Figura 45 ndash estrutura voters

                                                                                              Figura 46 ndash estrutura votes

                                                                                              daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

                                                                                              Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

                                                                                              55

                                                                                              Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

                                                                                              Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

                                                                                              na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

                                                                                              56

                                                                                              Figura 49 ndash PDF - Distribuiccedilatildeo Liked

                                                                                              Figura 50 ndash CDF - Distribuiccedilatildeo Liked

                                                                                              (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

                                                                                              Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

                                                                                              57

                                                                                              Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

                                                                                              Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

                                                                                              candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

                                                                                              Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

                                                                                              58

                                                                                              Figura 53 ndash PDF - Distribuiccedilatildeo Loved

                                                                                              Figura 54 ndash CDF - Distribuiccedilatildeo Loved

                                                                                              funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

                                                                                              59

                                                                                              Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                                                                                              Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                                                                                              Meacutedia das Notas sumei

                                                                                              sumvj nij

                                                                                              etimes v

                                                                                              Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                                                                                              Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                                                                                              60

                                                                                              Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                                                                                              Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                                                                                              52 CLASSE FIRSTPASTTHEPOST

                                                                                              Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                                                                                              Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                                                                                              61

                                                                                              Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                                                                                              Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                                                                                              mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                                                                                              62

                                                                                              53 CLASSE TWOROUNDSYSTEM

                                                                                              A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                                                                                              54 CLASSE INSTANTRUNOFFVOTING

                                                                                              A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                                                                                              Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                                                                                              63

                                                                                              cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                                                                                              55 CLASSE APPROVALVOTING

                                                                                              Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                                                                                              56 CLASSE BORDACOUNT

                                                                                              Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                                                                                              57 CLASSE SCOREVOTING

                                                                                              De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                                                                                              64

                                                                                              58 CLASSE BLOCVOTE

                                                                                              O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                                                                                              59 TECNOLOGIAS UTILIZADAS

                                                                                              A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                                                                                              Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                                                                                              O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                                                                                              Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                                                                                              65

                                                                                              6 CONCLUSAtildeO

                                                                                              Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                                                                                              Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                                                                                              Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                                                                                              Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                                                                                              Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                                                                                              66

                                                                                              REFEREcircNCIAS

                                                                                              AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                                                                                              Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                                                                                              Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                                                                                              Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                                                                                              HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                                                                                              LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                                                                                              ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                                                                                              Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                                                                                              POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                                                                                              The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                                                                                              67

                                                                                              APEcircNDICES

                                                                                              APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                                                                              Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                                                                              if(not len(selfvoter_profiles))

                                                                                              for voter in range(selfN_VOTERS)

                                                                                              candidates_rank = dict()

                                                                                              for candidate in reversed(range(selfN_CANDIDATES))

                                                                                              if(selfBIAS_VECTOR[candidate]==4)

                                                                                              candidates_rank[candidate] = self_sortear(selfloved)

                                                                                              elif(selfBIAS_VECTOR[candidate]==3)

                                                                                              candidates_rank[candidate] = self_sortear(selfliked)

                                                                                              elif(selfBIAS_VECTOR[candidate]==2)

                                                                                              candidates_rank[candidate] = self_sortear(selfdisliked)

                                                                                              elif(selfBIAS_VECTOR[candidate]==1)

                                                                                              candidates_rank[candidate] = self_sortear(selfhated)

                                                                                              elif(selfBIAS_VECTOR[candidate]==-1)

                                                                                              candidates_rank[candidate] = self_sortear(selfpolarizer

                                                                                              )

                                                                                              elif(selfBIAS_VECTOR[candidate]==-2)

                                                                                              candidates_rank[candidate] = self_sortear(self

                                                                                              more_polarizer)

                                                                                              else

                                                                                              candidates_rank[candidate] = self_sortear(selfneutral)

                                                                                              selfvotersappend(candidates_rank)

                                                                                              else

                                                                                              ranges = []

                                                                                              ranks = []

                                                                                              for prof in selfvoter_profiles

                                                                                              rangesappend(int(prof[pop_percentage]))

                                                                                              rank =

                                                                                              for index score in enumerate(prof[scores])

                                                                                              rank[index] = score

                                                                                              ranksappend(rank)

                                                                                              for index _range in enumerate(ranges)

                                                                                              for _ in range(int(selfN_VOTERS(_range100)))

                                                                                              selfvotersappend(ranks[index])

                                                                                              68

                                                                                              APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                                                                              Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                                                                              for i in range(selfN_CANDIDATES)

                                                                                              selfcandidates[i] = 0

                                                                                              selfvotes[i] = set()

                                                                                              APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                                                                              Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                                                                              for candidate in range(selfN_CANDIDATES)

                                                                                              rating_sum = 0

                                                                                              for voter in selfvoters

                                                                                              rating_sum += voter[candidate]

                                                                                              selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                                                                              APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                                                                              Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                                                                              if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                                                                              return selfcalculate_mean(winners)

                                                                                              else

                                                                                              chose_best = True if winners[0] == selfbest_candidate else

                                                                                              False

                                                                                              return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                                                                              69

                                                                                              APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                                                                              Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                                                                              rating_sum = 0

                                                                                              for voter in selfvoters

                                                                                              for candidate in winners

                                                                                              rating_sum += voter[candidate]

                                                                                              return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                                                                              APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                                                                              Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                                                                              for i in range(1 selfN_VACANCIES + 2)

                                                                                              selfleading_candidatesappend(selfsorted_candidates[-i][self

                                                                                              CANDIDATE_INDEX])

                                                                                              APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                                                                              Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                                                                              for leader in selfelecrounds[-1]

                                                                                              selfleading_candidatesappend(leader[0])

                                                                                              70

                                                                                              APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                                                                              Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                                                                              self_account_for_coalitions()

                                                                                              for voter in selfvoters

                                                                                              selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                                                                              (1)))

                                                                                              temp = []

                                                                                              for voter in selfsorted_voters

                                                                                              new_dict = defaultdict(list)

                                                                                              for k in voter

                                                                                              new_dict[k[1]]append(k[0])

                                                                                              tempappend(new_dict)

                                                                                              selfsorted_voters = []

                                                                                              for voter_index current_voter in enumerate(temp)

                                                                                              new_voter = []

                                                                                              for rating candidate_indexes in current_voteritems()

                                                                                              if len(current_voter[rating]) gt 1

                                                                                              shuffle(current_voter[rating])

                                                                                              for e in candidate_indexes

                                                                                              new_voterappend((e rating))

                                                                                              else

                                                                                              new_voterappend((candidate_indexes[0] rating))

                                                                                              selfsorted_votersappend(new_voter)

                                                                                              selfcandidates[new_voter[-1][0]] += 1

                                                                                              selfvotes[new_voter[-1][0]]add(voter_index)

                                                                                              71

                                                                                              APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                                                                              Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                                                                              for candidate in selfvotes_copy

                                                                                              if candidate not in selfelecleading_candidates

                                                                                              for voter_index in selfvotes_copy[candidate]

                                                                                              for index _candidate in enumerate(reversed(selfelec

                                                                                              sorted_voters[voter_index]))

                                                                                              if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                                                                              leading_candidates

                                                                                              if randomrandom() lt selfelec

                                                                                              tactical_vote_percentages[_candidate[selfelec

                                                                                              CANDIDATE_INDEX]]

                                                                                              selfrankings_changed[voter_index] = copy

                                                                                              deepcopy(selfelecsorted_voters[voter_index])

                                                                                              selfrankings_changed[voter_index][-(index + 1)]

                                                                                              selfrankings_changed[voter_index][-1] = self

                                                                                              rankings_changed[voter_index][-1] self

                                                                                              rankings_changed[voter_index][-(index + 1)]

                                                                                              selfcandidates[candidate] -= 1

                                                                                              selfcandidates[_candidate[selfelec

                                                                                              CANDIDATE_INDEX]] += 1

                                                                                              selfvotes[candidate]remove(voter_index)

                                                                                              selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                                                                              ]]add(voter_index)

                                                                                              break

                                                                                              break

                                                                                              72

                                                                                              APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                                                                              Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                                                                              half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                                                                              for candidate in selfelecleading_candidates

                                                                                              if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                                                                              continue

                                                                                              for voter_index in selfvotes_copy[candidate]

                                                                                              if voter_index in selfrankings_changed

                                                                                              ranking = selfrankings_changed[voter_index]

                                                                                              else

                                                                                              ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                                                                              ])

                                                                                              for index _candidate in enumerate(reversed(ranking))

                                                                                              if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                              leading_candidates or (_candidate[selfelec

                                                                                              CANDIDATE_INDEX] in selfelecleading_candidates and

                                                                                              selfelecleading_candidatesindex(_candidate[selfelec

                                                                                              CANDIDATE_INDEX]) gt= half_vacancies)

                                                                                              if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                                                                              if randomrandom() lt selfelec

                                                                                              minority_vote_percentages[_candidate[selfelec

                                                                                              CANDIDATE_INDEX]]

                                                                                              selfcandidates[candidate] -= 1

                                                                                              selfcandidates[_candidate[selfelec

                                                                                              CANDIDATE_INDEX]] += 1

                                                                                              break

                                                                                              break

                                                                                              break

                                                                                              73

                                                                                              APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                                                                              Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                                                                              self_account_for_coalitions()

                                                                                              for candidate in selfvotes

                                                                                              if candidate = selfwinner and candidate = selfsecond_place

                                                                                              for voter_index in selfvotes[candidate]

                                                                                              if voter_index in selfrankings_changed

                                                                                              ranking = selfrankings_changed[voter_index]

                                                                                              else

                                                                                              ranking = copydeepcopy(selfelecsorted_voters[

                                                                                              voter_index])

                                                                                              for index2 candidate in enumerate(reversed(ranking))

                                                                                              if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                                                                              selfcandidates[selfwinner] += 1

                                                                                              selfvotes[selfwinner]add(voter_index)

                                                                                              break

                                                                                              elif candidate[selfelecCANDIDATE_INDEX] == self

                                                                                              second_place

                                                                                              selfcandidates[selfsecond_place] += 1

                                                                                              selfvotes[selfsecond_place]add(voter_index)

                                                                                              break

                                                                                              selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                              winners = []

                                                                                              vacancies = selfelecN_VACANCIES

                                                                                              for candidate in reversed(selfsorted_candidates)

                                                                                              if vacancies == 0

                                                                                              break

                                                                                              winnersappend(candidate[0])

                                                                                              vacancies -= 1

                                                                                              mean chose_best = selfelecget_mean(winners = winners)

                                                                                              74

                                                                                              APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                                                                              Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                                                                              for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                              voter_dict = dict()

                                                                                              og_voter_dict = dict()

                                                                                              for tup in voter

                                                                                              voter_dict[tup[0]] = tup[1]

                                                                                              og_voter_dict[tup[0]] = tup[1]

                                                                                              for coalition in selfeleccoalitions

                                                                                              for candidate in coalition

                                                                                              add_to_score = 0

                                                                                              for candidate2 in coalition

                                                                                              if candidate == candidate2

                                                                                              continue

                                                                                              half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                                                                              if half lt 0

                                                                                              add_to_score += mathceil(half)

                                                                                              else

                                                                                              add_to_score += mathfloor(half)

                                                                                              if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                                                                              voter_dict[candidate[rsquovaluersquo]] = 10

                                                                                              elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                                                                              voter_dict[candidate[rsquovaluersquo]] = -10

                                                                                              else

                                                                                              voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                                                                              selfrankings_changed[voter_index] = []

                                                                                              for candidate in voter_dict

                                                                                              selfrankings_changed[voter_index]append((candidate voter_dict[

                                                                                              candidate]))

                                                                                              selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                                                                              voter_index] key=lambda x x[1])

                                                                                              75

                                                                                              APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                                                              Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                                                              selfelecroundsappend(selfsorted_candidates[_round])

                                                                                              if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                              N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                                                              N_VACANCIES - 1)

                                                                                              return 2

                                                                                              elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                              N_VOTERS gt 05)

                                                                                              return 1

                                                                                              else

                                                                                              selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                                                              CANDIDATE_INDEX])

                                                                                              for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                                                              elecCANDIDATE_INDEX]]

                                                                                              if voter_index in selfrankings_changed

                                                                                              for candidate in reversed(selfrankings_changed[voter_index

                                                                                              ])

                                                                                              if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                              excluded

                                                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                              ]] += 1

                                                                                              selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                              add(voter_index)

                                                                                              break

                                                                                              else

                                                                                              continue

                                                                                              else

                                                                                              for candidate in reversed(selfelecsorted_voters[

                                                                                              voter_index])

                                                                                              if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                              excluded

                                                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                              ]] += 1

                                                                                              selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                              add(voter_index)

                                                                                              break

                                                                                              else

                                                                                              continue

                                                                                              selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                              return 0

                                                                                              76

                                                                                              APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                                                              Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                                                              for index in range(selfelecN_CANDIDATES)

                                                                                              selfcandidates[index] = 0

                                                                                              for voter in selfelecsorted_voters

                                                                                              for candidate in reversed(voter)

                                                                                              if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                              else

                                                                                              break

                                                                                              APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                                                              Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                                                              for index in range(selfelecN_CANDIDATES)

                                                                                              selfcandidates[index] = 0

                                                                                              for voter in selfelecsorted_voters

                                                                                              if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                              elecCANDIDATE_INDEX]]

                                                                                              selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                                                              else

                                                                                              for candidate in reversed(voter)

                                                                                              if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                              else

                                                                                              break

                                                                                              77

                                                                                              APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                                                              Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                                                              pos = set()

                                                                                              for index perc in enumerate(selfelectactical_vote_percentages)

                                                                                              if perc gt 0

                                                                                              posadd(index)

                                                                                              for candidate in selfeleccandidates

                                                                                              if candidate not in selfleading_candidates

                                                                                              for voter_index in selfvotes[candidate]

                                                                                              raised = None

                                                                                              for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                                                              ])

                                                                                              if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                                                              leading_candidates

                                                                                              if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                                                              if randomrandom() lt selfelectactical_vote_percentages[

                                                                                              candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                                                              ranking = [None]selfelecN_CANDIDATES

                                                                                              ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                              selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                              CANDIDATE_INDEX]])

                                                                                              raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                              break

                                                                                              break

                                                                                              break

                                                                                              if raised = None

                                                                                              for _candidate in selfleading_candidates

                                                                                              if _candidate = ranking[-1][0]

                                                                                              ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                              _candidate])

                                                                                              buried = _candidate

                                                                                              break

                                                                                              i = 1

                                                                                              for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                              if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                                                              buried]

                                                                                              continue

                                                                                              else

                                                                                              ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                              selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                              CANDIDATE_INDEX]])

                                                                                              i += 1

                                                                                              selfrankings_changed[voter_index] = ranking

                                                                                              78

                                                                                              APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                                                              Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                                                              for voter_index in selfvotes[candidate]

                                                                                              if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                                                              ]

                                                                                              for _candidate in selfleading_candidates

                                                                                              if _candidate = candidate

                                                                                              ranking = [None]selfelecN_CANDIDATES

                                                                                              ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                              _candidate])

                                                                                              buried = _candidate

                                                                                              break

                                                                                              i = 1

                                                                                              for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                              if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                                                              continue

                                                                                              else

                                                                                              ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                              selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                              CANDIDATE_INDEX]])

                                                                                              i += 1

                                                                                              selfrankings_changed[voter_index] = ranking

                                                                                              79

                                                                                              APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                                                              Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                                                              for index in range(selfelecN_CANDIDATES)

                                                                                              selfcandidates[index] = 0

                                                                                              for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                              score = 0

                                                                                              if voter_index in selfrankings_changed

                                                                                              for candidate in selfrankings_changed[voter_index]

                                                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                              score += 1

                                                                                              else

                                                                                              for candidate in voter

                                                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                              score += 1

                                                                                              APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                                                              Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                                                              for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                              if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                              elecCANDIDATE_INDEX]]

                                                                                              selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                                                              sorted_voters[voter_index])

                                                                                              for candidate_index candidate in enumerate(reversed(voter))

                                                                                              if candidate_index == 0

                                                                                              selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                              voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                                                              else

                                                                                              selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                              voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                                                              80

                                                                                              APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                                                              Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                                                              for index in range(selfelecN_CANDIDATES)

                                                                                              selfcandidates[index] = 0

                                                                                              for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                              if voter_index in selfrankings_changed

                                                                                              for candidate in selfrankings_changed[voter_index]

                                                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                              selfelecCANDIDATE_RANK]

                                                                                              else

                                                                                              for candidate in voter

                                                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                              selfelecCANDIDATE_RANK]

                                                                                              APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                                                              Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                                                              for index in range(selfelecN_CANDIDATES)

                                                                                              selfcandidates[index] = 0

                                                                                              for voter in selfelecsorted_voters

                                                                                              votes = selfelecN_VACANCIES

                                                                                              for candidate in reversed(voter)

                                                                                              if votes == 0

                                                                                              break

                                                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                              votes -= 1

                                                                                              • Folha de aprovaccedilatildeo
                                                                                              • Agradecimentos
                                                                                              • Epiacutegrafe
                                                                                              • Resumo
                                                                                              • Abstract
                                                                                              • Lista de ilustraccedilotildees
                                                                                              • Lista de Coacutedigos
                                                                                              • Lista de tabelas
                                                                                              • Lista de abreviaturas e siglas
                                                                                              • Sumaacuterio
                                                                                              • INTRODUCcedilAtildeO
                                                                                                • MOTIVACcedilAtildeO E OBJETIVO
                                                                                                • MEacuteTODO
                                                                                                • ESTRUTURA
                                                                                                  • SISTEMAS ELEITORAIS
                                                                                                    • FISRT PAST THE POST
                                                                                                      • Exemplo
                                                                                                      • Vantagens e Desvantagens do FPTP
                                                                                                      • Voto Uacutetil no FPTP
                                                                                                        • TWO-ROUND SYSTEM
                                                                                                          • Exemplo
                                                                                                          • Vantagens e Desvantagens do TRS
                                                                                                          • Voto Uacutetil no TRS
                                                                                                            • INSTANT-RUNOFF VOTING
                                                                                                              • Exemplo
                                                                                                              • Vantagens e Desvantagens do IRV
                                                                                                              • Voto Uacutetil no IRV
                                                                                                                • APPROVAL VOTING SYSTEM
                                                                                                                  • Exemplo
                                                                                                                  • Vantagens e Desvantagens do AVS
                                                                                                                  • Voto Uacutetil no AVS
                                                                                                                    • THE BORDA COUNT
                                                                                                                      • Exemplo
                                                                                                                      • Vantagens e Desvantagens do BC
                                                                                                                      • Voto Uacutetil no BC
                                                                                                                        • SCORE VOTING SYSTEM
                                                                                                                          • Exemplo
                                                                                                                          • Vantagens e Desvantagens do SVS
                                                                                                                          • Voto Uacutetil no SVS
                                                                                                                            • BLOC VOTE
                                                                                                                              • Exemplo
                                                                                                                              • Voto Uacutetil no BV
                                                                                                                                  • O SIMULADOR
                                                                                                                                  • CENAacuteRIOS PERTINENTES
                                                                                                                                    • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                                                    • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                                                    • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                                                    • CENAacuteRIO 4 COALIZOtildeES
                                                                                                                                    • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                                                    • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                                                      • COMO FUNCIONA O SIMULADOR
                                                                                                                                        • CLASSE Elections
                                                                                                                                        • CLASSE FirstPastThePost
                                                                                                                                        • CLASSE TwoRoundSystem
                                                                                                                                        • CLASSE InstantRunoffVoting
                                                                                                                                        • CLASSE ApprovalVoting
                                                                                                                                        • CLASSE BordaCount
                                                                                                                                        • CLASSE ScoreVoting
                                                                                                                                        • CLASSE BlocVote
                                                                                                                                        • TECNOLOGIAS UTILIZADAS
                                                                                                                                          • CONCLUSAtildeO
                                                                                                                                          • Referecircncias
                                                                                                                                          • Meacutetodo create_voters
                                                                                                                                          • Meacutetodo create_candidates
                                                                                                                                          • Meacutetodo calculate_means
                                                                                                                                          • Meacutetodo get_mean
                                                                                                                                          • Meacutetodo calculate_mean
                                                                                                                                          • Meacutetodo set_leading_candidates
                                                                                                                                          • Meacutetodo irv_set_leading_candidates
                                                                                                                                          • Meacutetodo sort_ranks
                                                                                                                                          • Meacutetodo fptp_count_tactical_votes
                                                                                                                                          • Meacutetodo fptp_count_minority_votes
                                                                                                                                          • Meacutetodo trs_second_round
                                                                                                                                          • Meacutetodo trs_account_for_coalitions
                                                                                                                                          • Meacutetodo irv_count_votes
                                                                                                                                          • Meacutetodo avs_count_votes
                                                                                                                                          • Meacutetodo avs_count_votes_with_tactical
                                                                                                                                          • Meacutetodo irv_apply_tactical_votes
                                                                                                                                          • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                                                          • Meacutetodo bc_sum_candidates_scores
                                                                                                                                          • Meacutetodo svs_apply_tactical_votes
                                                                                                                                          • Meacutetodo svs_sum_candidates_scores
                                                                                                                                          • Meacutetodo bv_count_votes

                                                                                                48

                                                                                                Figura 35 ndash FPTP - Cenaacuterio 5

                                                                                                Figura 36 ndash TRS segundo turno - Cenaacuterio 5

                                                                                                nesta situaccedilatildeo Com esse resultado a meacutedia das notas eacute -28 No entanto os trecircs sistemasseguintes nos apresentam resultados diferentes

                                                                                                Tabela 17 ndash Resultados do Cenaacuterio 5

                                                                                                Sistema Candidatoeleito

                                                                                                Meacutedia dasnotas

                                                                                                FPTP Ana -28TRS Ana -28IRV Ana -28AVS Carla 50BC Carla 50SVS Carla 50

                                                                                                49

                                                                                                Figura 37 ndash AVS - Cenaacuterio 5

                                                                                                Figura 38 ndash BC - Cenaacuterio 5

                                                                                                Tanto o AVS quanto o Borda Count e o SVS satildeo sistemas que consideram todasas opiniotildees de cada eleitor ao mesmo tempo e por isso satildeo capazes de eleger o melhorcandidato nesta situaccedilatildeo diferentemente do TRS que natildeo absorve completamente todosentimento do eleitor por todos os candidatos e o IRV que apesar de ser bem expressivoquebra esse processo em inuacutemeras rodadas o que permite a perda de informaccedilatildeo ao longodelas

                                                                                                Esses resultados podem ser replicados acessando o linklthttpelectionsimpythonanywherecomdirect_res1111110---[22Ana

                                                                                                222022Beto222022Carla22]-----36Voter20Profile2001020-1020534Voter20Profile201-10201020530Voter20Profile202-1020-10205100gt

                                                                                                50

                                                                                                Figura 39 ndash SVS - Cenaacuterio 5

                                                                                                46 CENAacuteRIO 6 VOTO DE MINORIA

                                                                                                Neste cenaacuterio temos uma eleiccedilatildeo com quatro candidatos e duas vagas A Ana seraacutea preferecircncia de uma extensa parte da populaccedilatildeo (distribuiccedilatildeo Loved Figura 53) Betoe Carla seratildeo candidatos razoavelmente populares (distribuiccedilatildeo Neutral Figura 47) eDiego seraacute a preferecircncia de apenas um pequeno grupo especiacutefico e rejeitado pela maioria(distribuiccedilatildeo Disliked Figura 51) Eacute intuitivo esperar que os dois candidatos eleitos seratildeoa Ana e ou o Beto ou a Carla e isso eacute exatamente o que ocorre na figura 40 no sistemaFPTP sem voto de minoria

                                                                                                Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria

                                                                                                Eacute evidente a discrepacircncia da quantidade de votos da Ana para os outros candidatose apesar de Beto e Carla serem mais populares que Diego os trecircs natildeo se encontrammuito afastados Poreacutem se a pequena fraccedilatildeo de candidatos que possuem a Ana como

                                                                                                51

                                                                                                Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego

                                                                                                preferecircncia e Diego como segunda opccedilatildeo optarem pelo voto de minoria a situaccedilatildeo mudacompletamente (Figura 41) Assim apesar de extensamente rejeitado Diego conquistaa segunda vaga e a meacutedia das notas despenca de 2929 para 0505 No entanto aindaexiste um cenaacuterio pior Se os outros grupos de eleitores pensarem da mesma forma eevitarem votar na Ana achando que sua eleiccedilatildeo jaacute estaacute assegurada apenas 80 de votode minoria para esses grupos jaacute eacute o suficiente para eliminaacute-la das eleiccedilotildees (Figura 42)Com a Ana eliminada a meacutedia das notas cai ainda mais para 0058

                                                                                                Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego

                                                                                                O sistema Bloc Vote eacute uma das soluccedilotildees para o voto de minoria Permitindo queos eleitores votem no mesmo nuacutemero de candidatos que de vagas a serem preenchidasnatildeo existe o iacutempeto a esse tipo de voto estrateacutegico O resultado desse sistema portantoretorna a meacutedia das notas a casa dos 29 (Figura 43) Os sistemas AVS Borda Count eSVS tambeacutem impedem a presenccedila do voto de minoria e atingem resultados semelhantes

                                                                                                52

                                                                                                Figura 43 ndash BV - Cenaacuterio 6

                                                                                                Tabela 18 ndash Resultados do Cenaacuterio 6

                                                                                                Sistema Candidatoseleitos

                                                                                                Meacutedia dasnotas

                                                                                                FPTP sem voto de minoriaAna eBeto 2929

                                                                                                FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

                                                                                                FPTP com 80 de voto de minoriaBeto eCarla 0058

                                                                                                Bloc VoteAna eCarla 2913

                                                                                                Esses resultados podem ser replicados acessando os links

                                                                                                Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

                                                                                                100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

                                                                                                80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

                                                                                                53

                                                                                                5 COMO FUNCIONA O SIMULADOR

                                                                                                O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

                                                                                                51 CLASSE ELECTIONS

                                                                                                Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

                                                                                                bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

                                                                                                Figura 44 ndash estrutura candidates

                                                                                                bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

                                                                                                bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

                                                                                                Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

                                                                                                Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

                                                                                                54

                                                                                                Figura 45 ndash estrutura voters

                                                                                                Figura 46 ndash estrutura votes

                                                                                                daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

                                                                                                Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

                                                                                                55

                                                                                                Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

                                                                                                Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

                                                                                                na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

                                                                                                56

                                                                                                Figura 49 ndash PDF - Distribuiccedilatildeo Liked

                                                                                                Figura 50 ndash CDF - Distribuiccedilatildeo Liked

                                                                                                (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

                                                                                                Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

                                                                                                57

                                                                                                Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

                                                                                                Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

                                                                                                candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

                                                                                                Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

                                                                                                58

                                                                                                Figura 53 ndash PDF - Distribuiccedilatildeo Loved

                                                                                                Figura 54 ndash CDF - Distribuiccedilatildeo Loved

                                                                                                funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

                                                                                                59

                                                                                                Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                                                                                                Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                                                                                                Meacutedia das Notas sumei

                                                                                                sumvj nij

                                                                                                etimes v

                                                                                                Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                                                                                                Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                                                                                                60

                                                                                                Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                                                                                                Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                                                                                                52 CLASSE FIRSTPASTTHEPOST

                                                                                                Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                                                                                                Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                                                                                                61

                                                                                                Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                                                                                                Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                                                                                                mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                                                                                                62

                                                                                                53 CLASSE TWOROUNDSYSTEM

                                                                                                A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                                                                                                54 CLASSE INSTANTRUNOFFVOTING

                                                                                                A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                                                                                                Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                                                                                                63

                                                                                                cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                                                                                                55 CLASSE APPROVALVOTING

                                                                                                Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                                                                                                56 CLASSE BORDACOUNT

                                                                                                Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                                                                                                57 CLASSE SCOREVOTING

                                                                                                De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                                                                                                64

                                                                                                58 CLASSE BLOCVOTE

                                                                                                O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                                                                                                59 TECNOLOGIAS UTILIZADAS

                                                                                                A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                                                                                                Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                                                                                                O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                                                                                                Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                                                                                                65

                                                                                                6 CONCLUSAtildeO

                                                                                                Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                                                                                                Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                                                                                                Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                                                                                                Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                                                                                                Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                                                                                                66

                                                                                                REFEREcircNCIAS

                                                                                                AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                                                                                                Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                                                                                                Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                                                                                                Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                                                                                                HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                                                                                                LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                                                                                                ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                                                                                                Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                                                                                                POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                                                                                                The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                                                                                                67

                                                                                                APEcircNDICES

                                                                                                APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                                                                                Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                                                                                if(not len(selfvoter_profiles))

                                                                                                for voter in range(selfN_VOTERS)

                                                                                                candidates_rank = dict()

                                                                                                for candidate in reversed(range(selfN_CANDIDATES))

                                                                                                if(selfBIAS_VECTOR[candidate]==4)

                                                                                                candidates_rank[candidate] = self_sortear(selfloved)

                                                                                                elif(selfBIAS_VECTOR[candidate]==3)

                                                                                                candidates_rank[candidate] = self_sortear(selfliked)

                                                                                                elif(selfBIAS_VECTOR[candidate]==2)

                                                                                                candidates_rank[candidate] = self_sortear(selfdisliked)

                                                                                                elif(selfBIAS_VECTOR[candidate]==1)

                                                                                                candidates_rank[candidate] = self_sortear(selfhated)

                                                                                                elif(selfBIAS_VECTOR[candidate]==-1)

                                                                                                candidates_rank[candidate] = self_sortear(selfpolarizer

                                                                                                )

                                                                                                elif(selfBIAS_VECTOR[candidate]==-2)

                                                                                                candidates_rank[candidate] = self_sortear(self

                                                                                                more_polarizer)

                                                                                                else

                                                                                                candidates_rank[candidate] = self_sortear(selfneutral)

                                                                                                selfvotersappend(candidates_rank)

                                                                                                else

                                                                                                ranges = []

                                                                                                ranks = []

                                                                                                for prof in selfvoter_profiles

                                                                                                rangesappend(int(prof[pop_percentage]))

                                                                                                rank =

                                                                                                for index score in enumerate(prof[scores])

                                                                                                rank[index] = score

                                                                                                ranksappend(rank)

                                                                                                for index _range in enumerate(ranges)

                                                                                                for _ in range(int(selfN_VOTERS(_range100)))

                                                                                                selfvotersappend(ranks[index])

                                                                                                68

                                                                                                APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                                                                                Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                                                                                for i in range(selfN_CANDIDATES)

                                                                                                selfcandidates[i] = 0

                                                                                                selfvotes[i] = set()

                                                                                                APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                                                                                Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                                                                                for candidate in range(selfN_CANDIDATES)

                                                                                                rating_sum = 0

                                                                                                for voter in selfvoters

                                                                                                rating_sum += voter[candidate]

                                                                                                selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                                                                                APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                                                                                Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                                                                                if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                                                                                return selfcalculate_mean(winners)

                                                                                                else

                                                                                                chose_best = True if winners[0] == selfbest_candidate else

                                                                                                False

                                                                                                return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                                                                                69

                                                                                                APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                                                                                Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                                                                                rating_sum = 0

                                                                                                for voter in selfvoters

                                                                                                for candidate in winners

                                                                                                rating_sum += voter[candidate]

                                                                                                return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                                                                                APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                                                                                Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                                                                                for i in range(1 selfN_VACANCIES + 2)

                                                                                                selfleading_candidatesappend(selfsorted_candidates[-i][self

                                                                                                CANDIDATE_INDEX])

                                                                                                APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                                                                                Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                                                                                for leader in selfelecrounds[-1]

                                                                                                selfleading_candidatesappend(leader[0])

                                                                                                70

                                                                                                APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                                                                                Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                                                                                self_account_for_coalitions()

                                                                                                for voter in selfvoters

                                                                                                selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                                                                                (1)))

                                                                                                temp = []

                                                                                                for voter in selfsorted_voters

                                                                                                new_dict = defaultdict(list)

                                                                                                for k in voter

                                                                                                new_dict[k[1]]append(k[0])

                                                                                                tempappend(new_dict)

                                                                                                selfsorted_voters = []

                                                                                                for voter_index current_voter in enumerate(temp)

                                                                                                new_voter = []

                                                                                                for rating candidate_indexes in current_voteritems()

                                                                                                if len(current_voter[rating]) gt 1

                                                                                                shuffle(current_voter[rating])

                                                                                                for e in candidate_indexes

                                                                                                new_voterappend((e rating))

                                                                                                else

                                                                                                new_voterappend((candidate_indexes[0] rating))

                                                                                                selfsorted_votersappend(new_voter)

                                                                                                selfcandidates[new_voter[-1][0]] += 1

                                                                                                selfvotes[new_voter[-1][0]]add(voter_index)

                                                                                                71

                                                                                                APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                                                                                Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                                                                                for candidate in selfvotes_copy

                                                                                                if candidate not in selfelecleading_candidates

                                                                                                for voter_index in selfvotes_copy[candidate]

                                                                                                for index _candidate in enumerate(reversed(selfelec

                                                                                                sorted_voters[voter_index]))

                                                                                                if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                                                                                leading_candidates

                                                                                                if randomrandom() lt selfelec

                                                                                                tactical_vote_percentages[_candidate[selfelec

                                                                                                CANDIDATE_INDEX]]

                                                                                                selfrankings_changed[voter_index] = copy

                                                                                                deepcopy(selfelecsorted_voters[voter_index])

                                                                                                selfrankings_changed[voter_index][-(index + 1)]

                                                                                                selfrankings_changed[voter_index][-1] = self

                                                                                                rankings_changed[voter_index][-1] self

                                                                                                rankings_changed[voter_index][-(index + 1)]

                                                                                                selfcandidates[candidate] -= 1

                                                                                                selfcandidates[_candidate[selfelec

                                                                                                CANDIDATE_INDEX]] += 1

                                                                                                selfvotes[candidate]remove(voter_index)

                                                                                                selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                                                                                ]]add(voter_index)

                                                                                                break

                                                                                                break

                                                                                                72

                                                                                                APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                                                                                Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                                                                                half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                                                                                for candidate in selfelecleading_candidates

                                                                                                if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                                                                                continue

                                                                                                for voter_index in selfvotes_copy[candidate]

                                                                                                if voter_index in selfrankings_changed

                                                                                                ranking = selfrankings_changed[voter_index]

                                                                                                else

                                                                                                ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                                                                                ])

                                                                                                for index _candidate in enumerate(reversed(ranking))

                                                                                                if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                leading_candidates or (_candidate[selfelec

                                                                                                CANDIDATE_INDEX] in selfelecleading_candidates and

                                                                                                selfelecleading_candidatesindex(_candidate[selfelec

                                                                                                CANDIDATE_INDEX]) gt= half_vacancies)

                                                                                                if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                                                                                if randomrandom() lt selfelec

                                                                                                minority_vote_percentages[_candidate[selfelec

                                                                                                CANDIDATE_INDEX]]

                                                                                                selfcandidates[candidate] -= 1

                                                                                                selfcandidates[_candidate[selfelec

                                                                                                CANDIDATE_INDEX]] += 1

                                                                                                break

                                                                                                break

                                                                                                break

                                                                                                73

                                                                                                APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                                                                                Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                                                                                self_account_for_coalitions()

                                                                                                for candidate in selfvotes

                                                                                                if candidate = selfwinner and candidate = selfsecond_place

                                                                                                for voter_index in selfvotes[candidate]

                                                                                                if voter_index in selfrankings_changed

                                                                                                ranking = selfrankings_changed[voter_index]

                                                                                                else

                                                                                                ranking = copydeepcopy(selfelecsorted_voters[

                                                                                                voter_index])

                                                                                                for index2 candidate in enumerate(reversed(ranking))

                                                                                                if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                                                                                selfcandidates[selfwinner] += 1

                                                                                                selfvotes[selfwinner]add(voter_index)

                                                                                                break

                                                                                                elif candidate[selfelecCANDIDATE_INDEX] == self

                                                                                                second_place

                                                                                                selfcandidates[selfsecond_place] += 1

                                                                                                selfvotes[selfsecond_place]add(voter_index)

                                                                                                break

                                                                                                selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                winners = []

                                                                                                vacancies = selfelecN_VACANCIES

                                                                                                for candidate in reversed(selfsorted_candidates)

                                                                                                if vacancies == 0

                                                                                                break

                                                                                                winnersappend(candidate[0])

                                                                                                vacancies -= 1

                                                                                                mean chose_best = selfelecget_mean(winners = winners)

                                                                                                74

                                                                                                APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                                                                                Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                                                                                for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                voter_dict = dict()

                                                                                                og_voter_dict = dict()

                                                                                                for tup in voter

                                                                                                voter_dict[tup[0]] = tup[1]

                                                                                                og_voter_dict[tup[0]] = tup[1]

                                                                                                for coalition in selfeleccoalitions

                                                                                                for candidate in coalition

                                                                                                add_to_score = 0

                                                                                                for candidate2 in coalition

                                                                                                if candidate == candidate2

                                                                                                continue

                                                                                                half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                                                                                if half lt 0

                                                                                                add_to_score += mathceil(half)

                                                                                                else

                                                                                                add_to_score += mathfloor(half)

                                                                                                if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                                                                                voter_dict[candidate[rsquovaluersquo]] = 10

                                                                                                elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                                                                                voter_dict[candidate[rsquovaluersquo]] = -10

                                                                                                else

                                                                                                voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                                                                                selfrankings_changed[voter_index] = []

                                                                                                for candidate in voter_dict

                                                                                                selfrankings_changed[voter_index]append((candidate voter_dict[

                                                                                                candidate]))

                                                                                                selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                                                                                voter_index] key=lambda x x[1])

                                                                                                75

                                                                                                APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                                                                Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                                                                selfelecroundsappend(selfsorted_candidates[_round])

                                                                                                if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                                                                N_VACANCIES - 1)

                                                                                                return 2

                                                                                                elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                N_VOTERS gt 05)

                                                                                                return 1

                                                                                                else

                                                                                                selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                                                                CANDIDATE_INDEX])

                                                                                                for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                                                                elecCANDIDATE_INDEX]]

                                                                                                if voter_index in selfrankings_changed

                                                                                                for candidate in reversed(selfrankings_changed[voter_index

                                                                                                ])

                                                                                                if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                excluded

                                                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                ]] += 1

                                                                                                selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                add(voter_index)

                                                                                                break

                                                                                                else

                                                                                                continue

                                                                                                else

                                                                                                for candidate in reversed(selfelecsorted_voters[

                                                                                                voter_index])

                                                                                                if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                excluded

                                                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                ]] += 1

                                                                                                selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                add(voter_index)

                                                                                                break

                                                                                                else

                                                                                                continue

                                                                                                selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                return 0

                                                                                                76

                                                                                                APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                                                                Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                                                                for index in range(selfelecN_CANDIDATES)

                                                                                                selfcandidates[index] = 0

                                                                                                for voter in selfelecsorted_voters

                                                                                                for candidate in reversed(voter)

                                                                                                if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                else

                                                                                                break

                                                                                                APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                                                                Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                                                                for index in range(selfelecN_CANDIDATES)

                                                                                                selfcandidates[index] = 0

                                                                                                for voter in selfelecsorted_voters

                                                                                                if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                elecCANDIDATE_INDEX]]

                                                                                                selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                                                                else

                                                                                                for candidate in reversed(voter)

                                                                                                if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                else

                                                                                                break

                                                                                                77

                                                                                                APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                                                                Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                                                                pos = set()

                                                                                                for index perc in enumerate(selfelectactical_vote_percentages)

                                                                                                if perc gt 0

                                                                                                posadd(index)

                                                                                                for candidate in selfeleccandidates

                                                                                                if candidate not in selfleading_candidates

                                                                                                for voter_index in selfvotes[candidate]

                                                                                                raised = None

                                                                                                for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                                                                ])

                                                                                                if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                                                                leading_candidates

                                                                                                if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                                                                if randomrandom() lt selfelectactical_vote_percentages[

                                                                                                candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                                                                ranking = [None]selfelecN_CANDIDATES

                                                                                                ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                CANDIDATE_INDEX]])

                                                                                                raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                break

                                                                                                break

                                                                                                break

                                                                                                if raised = None

                                                                                                for _candidate in selfleading_candidates

                                                                                                if _candidate = ranking[-1][0]

                                                                                                ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                _candidate])

                                                                                                buried = _candidate

                                                                                                break

                                                                                                i = 1

                                                                                                for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                                                                buried]

                                                                                                continue

                                                                                                else

                                                                                                ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                CANDIDATE_INDEX]])

                                                                                                i += 1

                                                                                                selfrankings_changed[voter_index] = ranking

                                                                                                78

                                                                                                APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                                                                Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                                                                for voter_index in selfvotes[candidate]

                                                                                                if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                                                                ]

                                                                                                for _candidate in selfleading_candidates

                                                                                                if _candidate = candidate

                                                                                                ranking = [None]selfelecN_CANDIDATES

                                                                                                ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                _candidate])

                                                                                                buried = _candidate

                                                                                                break

                                                                                                i = 1

                                                                                                for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                                                                continue

                                                                                                else

                                                                                                ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                CANDIDATE_INDEX]])

                                                                                                i += 1

                                                                                                selfrankings_changed[voter_index] = ranking

                                                                                                79

                                                                                                APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                                                                Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                                                                for index in range(selfelecN_CANDIDATES)

                                                                                                selfcandidates[index] = 0

                                                                                                for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                score = 0

                                                                                                if voter_index in selfrankings_changed

                                                                                                for candidate in selfrankings_changed[voter_index]

                                                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                score += 1

                                                                                                else

                                                                                                for candidate in voter

                                                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                score += 1

                                                                                                APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                                                                Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                                                                for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                elecCANDIDATE_INDEX]]

                                                                                                selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                                                                sorted_voters[voter_index])

                                                                                                for candidate_index candidate in enumerate(reversed(voter))

                                                                                                if candidate_index == 0

                                                                                                selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                                                                else

                                                                                                selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                                                                80

                                                                                                APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                                                                Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                                                                for index in range(selfelecN_CANDIDATES)

                                                                                                selfcandidates[index] = 0

                                                                                                for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                if voter_index in selfrankings_changed

                                                                                                for candidate in selfrankings_changed[voter_index]

                                                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                selfelecCANDIDATE_RANK]

                                                                                                else

                                                                                                for candidate in voter

                                                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                selfelecCANDIDATE_RANK]

                                                                                                APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                                                                Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                                                                for index in range(selfelecN_CANDIDATES)

                                                                                                selfcandidates[index] = 0

                                                                                                for voter in selfelecsorted_voters

                                                                                                votes = selfelecN_VACANCIES

                                                                                                for candidate in reversed(voter)

                                                                                                if votes == 0

                                                                                                break

                                                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                votes -= 1

                                                                                                • Folha de aprovaccedilatildeo
                                                                                                • Agradecimentos
                                                                                                • Epiacutegrafe
                                                                                                • Resumo
                                                                                                • Abstract
                                                                                                • Lista de ilustraccedilotildees
                                                                                                • Lista de Coacutedigos
                                                                                                • Lista de tabelas
                                                                                                • Lista de abreviaturas e siglas
                                                                                                • Sumaacuterio
                                                                                                • INTRODUCcedilAtildeO
                                                                                                  • MOTIVACcedilAtildeO E OBJETIVO
                                                                                                  • MEacuteTODO
                                                                                                  • ESTRUTURA
                                                                                                    • SISTEMAS ELEITORAIS
                                                                                                      • FISRT PAST THE POST
                                                                                                        • Exemplo
                                                                                                        • Vantagens e Desvantagens do FPTP
                                                                                                        • Voto Uacutetil no FPTP
                                                                                                          • TWO-ROUND SYSTEM
                                                                                                            • Exemplo
                                                                                                            • Vantagens e Desvantagens do TRS
                                                                                                            • Voto Uacutetil no TRS
                                                                                                              • INSTANT-RUNOFF VOTING
                                                                                                                • Exemplo
                                                                                                                • Vantagens e Desvantagens do IRV
                                                                                                                • Voto Uacutetil no IRV
                                                                                                                  • APPROVAL VOTING SYSTEM
                                                                                                                    • Exemplo
                                                                                                                    • Vantagens e Desvantagens do AVS
                                                                                                                    • Voto Uacutetil no AVS
                                                                                                                      • THE BORDA COUNT
                                                                                                                        • Exemplo
                                                                                                                        • Vantagens e Desvantagens do BC
                                                                                                                        • Voto Uacutetil no BC
                                                                                                                          • SCORE VOTING SYSTEM
                                                                                                                            • Exemplo
                                                                                                                            • Vantagens e Desvantagens do SVS
                                                                                                                            • Voto Uacutetil no SVS
                                                                                                                              • BLOC VOTE
                                                                                                                                • Exemplo
                                                                                                                                • Voto Uacutetil no BV
                                                                                                                                    • O SIMULADOR
                                                                                                                                    • CENAacuteRIOS PERTINENTES
                                                                                                                                      • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                                                      • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                                                      • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                                                      • CENAacuteRIO 4 COALIZOtildeES
                                                                                                                                      • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                                                      • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                                                        • COMO FUNCIONA O SIMULADOR
                                                                                                                                          • CLASSE Elections
                                                                                                                                          • CLASSE FirstPastThePost
                                                                                                                                          • CLASSE TwoRoundSystem
                                                                                                                                          • CLASSE InstantRunoffVoting
                                                                                                                                          • CLASSE ApprovalVoting
                                                                                                                                          • CLASSE BordaCount
                                                                                                                                          • CLASSE ScoreVoting
                                                                                                                                          • CLASSE BlocVote
                                                                                                                                          • TECNOLOGIAS UTILIZADAS
                                                                                                                                            • CONCLUSAtildeO
                                                                                                                                            • Referecircncias
                                                                                                                                            • Meacutetodo create_voters
                                                                                                                                            • Meacutetodo create_candidates
                                                                                                                                            • Meacutetodo calculate_means
                                                                                                                                            • Meacutetodo get_mean
                                                                                                                                            • Meacutetodo calculate_mean
                                                                                                                                            • Meacutetodo set_leading_candidates
                                                                                                                                            • Meacutetodo irv_set_leading_candidates
                                                                                                                                            • Meacutetodo sort_ranks
                                                                                                                                            • Meacutetodo fptp_count_tactical_votes
                                                                                                                                            • Meacutetodo fptp_count_minority_votes
                                                                                                                                            • Meacutetodo trs_second_round
                                                                                                                                            • Meacutetodo trs_account_for_coalitions
                                                                                                                                            • Meacutetodo irv_count_votes
                                                                                                                                            • Meacutetodo avs_count_votes
                                                                                                                                            • Meacutetodo avs_count_votes_with_tactical
                                                                                                                                            • Meacutetodo irv_apply_tactical_votes
                                                                                                                                            • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                                                            • Meacutetodo bc_sum_candidates_scores
                                                                                                                                            • Meacutetodo svs_apply_tactical_votes
                                                                                                                                            • Meacutetodo svs_sum_candidates_scores
                                                                                                                                            • Meacutetodo bv_count_votes

                                                                                                  49

                                                                                                  Figura 37 ndash AVS - Cenaacuterio 5

                                                                                                  Figura 38 ndash BC - Cenaacuterio 5

                                                                                                  Tanto o AVS quanto o Borda Count e o SVS satildeo sistemas que consideram todasas opiniotildees de cada eleitor ao mesmo tempo e por isso satildeo capazes de eleger o melhorcandidato nesta situaccedilatildeo diferentemente do TRS que natildeo absorve completamente todosentimento do eleitor por todos os candidatos e o IRV que apesar de ser bem expressivoquebra esse processo em inuacutemeras rodadas o que permite a perda de informaccedilatildeo ao longodelas

                                                                                                  Esses resultados podem ser replicados acessando o linklthttpelectionsimpythonanywherecomdirect_res1111110---[22Ana

                                                                                                  222022Beto222022Carla22]-----36Voter20Profile2001020-1020534Voter20Profile201-10201020530Voter20Profile202-1020-10205100gt

                                                                                                  50

                                                                                                  Figura 39 ndash SVS - Cenaacuterio 5

                                                                                                  46 CENAacuteRIO 6 VOTO DE MINORIA

                                                                                                  Neste cenaacuterio temos uma eleiccedilatildeo com quatro candidatos e duas vagas A Ana seraacutea preferecircncia de uma extensa parte da populaccedilatildeo (distribuiccedilatildeo Loved Figura 53) Betoe Carla seratildeo candidatos razoavelmente populares (distribuiccedilatildeo Neutral Figura 47) eDiego seraacute a preferecircncia de apenas um pequeno grupo especiacutefico e rejeitado pela maioria(distribuiccedilatildeo Disliked Figura 51) Eacute intuitivo esperar que os dois candidatos eleitos seratildeoa Ana e ou o Beto ou a Carla e isso eacute exatamente o que ocorre na figura 40 no sistemaFPTP sem voto de minoria

                                                                                                  Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria

                                                                                                  Eacute evidente a discrepacircncia da quantidade de votos da Ana para os outros candidatose apesar de Beto e Carla serem mais populares que Diego os trecircs natildeo se encontrammuito afastados Poreacutem se a pequena fraccedilatildeo de candidatos que possuem a Ana como

                                                                                                  51

                                                                                                  Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego

                                                                                                  preferecircncia e Diego como segunda opccedilatildeo optarem pelo voto de minoria a situaccedilatildeo mudacompletamente (Figura 41) Assim apesar de extensamente rejeitado Diego conquistaa segunda vaga e a meacutedia das notas despenca de 2929 para 0505 No entanto aindaexiste um cenaacuterio pior Se os outros grupos de eleitores pensarem da mesma forma eevitarem votar na Ana achando que sua eleiccedilatildeo jaacute estaacute assegurada apenas 80 de votode minoria para esses grupos jaacute eacute o suficiente para eliminaacute-la das eleiccedilotildees (Figura 42)Com a Ana eliminada a meacutedia das notas cai ainda mais para 0058

                                                                                                  Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego

                                                                                                  O sistema Bloc Vote eacute uma das soluccedilotildees para o voto de minoria Permitindo queos eleitores votem no mesmo nuacutemero de candidatos que de vagas a serem preenchidasnatildeo existe o iacutempeto a esse tipo de voto estrateacutegico O resultado desse sistema portantoretorna a meacutedia das notas a casa dos 29 (Figura 43) Os sistemas AVS Borda Count eSVS tambeacutem impedem a presenccedila do voto de minoria e atingem resultados semelhantes

                                                                                                  52

                                                                                                  Figura 43 ndash BV - Cenaacuterio 6

                                                                                                  Tabela 18 ndash Resultados do Cenaacuterio 6

                                                                                                  Sistema Candidatoseleitos

                                                                                                  Meacutedia dasnotas

                                                                                                  FPTP sem voto de minoriaAna eBeto 2929

                                                                                                  FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

                                                                                                  FPTP com 80 de voto de minoriaBeto eCarla 0058

                                                                                                  Bloc VoteAna eCarla 2913

                                                                                                  Esses resultados podem ser replicados acessando os links

                                                                                                  Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

                                                                                                  100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

                                                                                                  80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

                                                                                                  53

                                                                                                  5 COMO FUNCIONA O SIMULADOR

                                                                                                  O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

                                                                                                  51 CLASSE ELECTIONS

                                                                                                  Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

                                                                                                  bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

                                                                                                  Figura 44 ndash estrutura candidates

                                                                                                  bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

                                                                                                  bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

                                                                                                  Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

                                                                                                  Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

                                                                                                  54

                                                                                                  Figura 45 ndash estrutura voters

                                                                                                  Figura 46 ndash estrutura votes

                                                                                                  daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

                                                                                                  Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

                                                                                                  55

                                                                                                  Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

                                                                                                  Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

                                                                                                  na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

                                                                                                  56

                                                                                                  Figura 49 ndash PDF - Distribuiccedilatildeo Liked

                                                                                                  Figura 50 ndash CDF - Distribuiccedilatildeo Liked

                                                                                                  (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

                                                                                                  Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

                                                                                                  57

                                                                                                  Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

                                                                                                  Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

                                                                                                  candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

                                                                                                  Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

                                                                                                  58

                                                                                                  Figura 53 ndash PDF - Distribuiccedilatildeo Loved

                                                                                                  Figura 54 ndash CDF - Distribuiccedilatildeo Loved

                                                                                                  funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

                                                                                                  59

                                                                                                  Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                                                                                                  Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                                                                                                  Meacutedia das Notas sumei

                                                                                                  sumvj nij

                                                                                                  etimes v

                                                                                                  Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                                                                                                  Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                                                                                                  60

                                                                                                  Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                                                                                                  Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                                                                                                  52 CLASSE FIRSTPASTTHEPOST

                                                                                                  Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                                                                                                  Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                                                                                                  61

                                                                                                  Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                                                                                                  Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                                                                                                  mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                                                                                                  62

                                                                                                  53 CLASSE TWOROUNDSYSTEM

                                                                                                  A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                                                                                                  54 CLASSE INSTANTRUNOFFVOTING

                                                                                                  A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                                                                                                  Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                                                                                                  63

                                                                                                  cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                                                                                                  55 CLASSE APPROVALVOTING

                                                                                                  Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                                                                                                  56 CLASSE BORDACOUNT

                                                                                                  Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                                                                                                  57 CLASSE SCOREVOTING

                                                                                                  De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                                                                                                  64

                                                                                                  58 CLASSE BLOCVOTE

                                                                                                  O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                                                                                                  59 TECNOLOGIAS UTILIZADAS

                                                                                                  A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                                                                                                  Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                                                                                                  O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                                                                                                  Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                                                                                                  65

                                                                                                  6 CONCLUSAtildeO

                                                                                                  Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                                                                                                  Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                                                                                                  Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                                                                                                  Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                                                                                                  Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                                                                                                  66

                                                                                                  REFEREcircNCIAS

                                                                                                  AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                                                                                                  Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                                                                                                  Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                                                                                                  Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                                                                                                  HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                                                                                                  LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                                                                                                  ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                                                                                                  Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                                                                                                  POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                                                                                                  The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                                                                                                  67

                                                                                                  APEcircNDICES

                                                                                                  APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                                                                                  Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                                                                                  if(not len(selfvoter_profiles))

                                                                                                  for voter in range(selfN_VOTERS)

                                                                                                  candidates_rank = dict()

                                                                                                  for candidate in reversed(range(selfN_CANDIDATES))

                                                                                                  if(selfBIAS_VECTOR[candidate]==4)

                                                                                                  candidates_rank[candidate] = self_sortear(selfloved)

                                                                                                  elif(selfBIAS_VECTOR[candidate]==3)

                                                                                                  candidates_rank[candidate] = self_sortear(selfliked)

                                                                                                  elif(selfBIAS_VECTOR[candidate]==2)

                                                                                                  candidates_rank[candidate] = self_sortear(selfdisliked)

                                                                                                  elif(selfBIAS_VECTOR[candidate]==1)

                                                                                                  candidates_rank[candidate] = self_sortear(selfhated)

                                                                                                  elif(selfBIAS_VECTOR[candidate]==-1)

                                                                                                  candidates_rank[candidate] = self_sortear(selfpolarizer

                                                                                                  )

                                                                                                  elif(selfBIAS_VECTOR[candidate]==-2)

                                                                                                  candidates_rank[candidate] = self_sortear(self

                                                                                                  more_polarizer)

                                                                                                  else

                                                                                                  candidates_rank[candidate] = self_sortear(selfneutral)

                                                                                                  selfvotersappend(candidates_rank)

                                                                                                  else

                                                                                                  ranges = []

                                                                                                  ranks = []

                                                                                                  for prof in selfvoter_profiles

                                                                                                  rangesappend(int(prof[pop_percentage]))

                                                                                                  rank =

                                                                                                  for index score in enumerate(prof[scores])

                                                                                                  rank[index] = score

                                                                                                  ranksappend(rank)

                                                                                                  for index _range in enumerate(ranges)

                                                                                                  for _ in range(int(selfN_VOTERS(_range100)))

                                                                                                  selfvotersappend(ranks[index])

                                                                                                  68

                                                                                                  APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                                                                                  Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                                                                                  for i in range(selfN_CANDIDATES)

                                                                                                  selfcandidates[i] = 0

                                                                                                  selfvotes[i] = set()

                                                                                                  APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                                                                                  Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                                                                                  for candidate in range(selfN_CANDIDATES)

                                                                                                  rating_sum = 0

                                                                                                  for voter in selfvoters

                                                                                                  rating_sum += voter[candidate]

                                                                                                  selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                                                                                  APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                                                                                  Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                                                                                  if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                                                                                  return selfcalculate_mean(winners)

                                                                                                  else

                                                                                                  chose_best = True if winners[0] == selfbest_candidate else

                                                                                                  False

                                                                                                  return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                                                                                  69

                                                                                                  APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                                                                                  Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                                                                                  rating_sum = 0

                                                                                                  for voter in selfvoters

                                                                                                  for candidate in winners

                                                                                                  rating_sum += voter[candidate]

                                                                                                  return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                                                                                  APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                                                                                  Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                                                                                  for i in range(1 selfN_VACANCIES + 2)

                                                                                                  selfleading_candidatesappend(selfsorted_candidates[-i][self

                                                                                                  CANDIDATE_INDEX])

                                                                                                  APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                                                                                  Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                                                                                  for leader in selfelecrounds[-1]

                                                                                                  selfleading_candidatesappend(leader[0])

                                                                                                  70

                                                                                                  APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                                                                                  Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                                                                                  self_account_for_coalitions()

                                                                                                  for voter in selfvoters

                                                                                                  selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                                                                                  (1)))

                                                                                                  temp = []

                                                                                                  for voter in selfsorted_voters

                                                                                                  new_dict = defaultdict(list)

                                                                                                  for k in voter

                                                                                                  new_dict[k[1]]append(k[0])

                                                                                                  tempappend(new_dict)

                                                                                                  selfsorted_voters = []

                                                                                                  for voter_index current_voter in enumerate(temp)

                                                                                                  new_voter = []

                                                                                                  for rating candidate_indexes in current_voteritems()

                                                                                                  if len(current_voter[rating]) gt 1

                                                                                                  shuffle(current_voter[rating])

                                                                                                  for e in candidate_indexes

                                                                                                  new_voterappend((e rating))

                                                                                                  else

                                                                                                  new_voterappend((candidate_indexes[0] rating))

                                                                                                  selfsorted_votersappend(new_voter)

                                                                                                  selfcandidates[new_voter[-1][0]] += 1

                                                                                                  selfvotes[new_voter[-1][0]]add(voter_index)

                                                                                                  71

                                                                                                  APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                                                                                  Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                                                                                  for candidate in selfvotes_copy

                                                                                                  if candidate not in selfelecleading_candidates

                                                                                                  for voter_index in selfvotes_copy[candidate]

                                                                                                  for index _candidate in enumerate(reversed(selfelec

                                                                                                  sorted_voters[voter_index]))

                                                                                                  if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                                                                                  leading_candidates

                                                                                                  if randomrandom() lt selfelec

                                                                                                  tactical_vote_percentages[_candidate[selfelec

                                                                                                  CANDIDATE_INDEX]]

                                                                                                  selfrankings_changed[voter_index] = copy

                                                                                                  deepcopy(selfelecsorted_voters[voter_index])

                                                                                                  selfrankings_changed[voter_index][-(index + 1)]

                                                                                                  selfrankings_changed[voter_index][-1] = self

                                                                                                  rankings_changed[voter_index][-1] self

                                                                                                  rankings_changed[voter_index][-(index + 1)]

                                                                                                  selfcandidates[candidate] -= 1

                                                                                                  selfcandidates[_candidate[selfelec

                                                                                                  CANDIDATE_INDEX]] += 1

                                                                                                  selfvotes[candidate]remove(voter_index)

                                                                                                  selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                                                                                  ]]add(voter_index)

                                                                                                  break

                                                                                                  break

                                                                                                  72

                                                                                                  APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                                                                                  Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                                                                                  half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                                                                                  for candidate in selfelecleading_candidates

                                                                                                  if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                                                                                  continue

                                                                                                  for voter_index in selfvotes_copy[candidate]

                                                                                                  if voter_index in selfrankings_changed

                                                                                                  ranking = selfrankings_changed[voter_index]

                                                                                                  else

                                                                                                  ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                                                                                  ])

                                                                                                  for index _candidate in enumerate(reversed(ranking))

                                                                                                  if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                  leading_candidates or (_candidate[selfelec

                                                                                                  CANDIDATE_INDEX] in selfelecleading_candidates and

                                                                                                  selfelecleading_candidatesindex(_candidate[selfelec

                                                                                                  CANDIDATE_INDEX]) gt= half_vacancies)

                                                                                                  if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                                                                                  if randomrandom() lt selfelec

                                                                                                  minority_vote_percentages[_candidate[selfelec

                                                                                                  CANDIDATE_INDEX]]

                                                                                                  selfcandidates[candidate] -= 1

                                                                                                  selfcandidates[_candidate[selfelec

                                                                                                  CANDIDATE_INDEX]] += 1

                                                                                                  break

                                                                                                  break

                                                                                                  break

                                                                                                  73

                                                                                                  APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                                                                                  Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                                                                                  self_account_for_coalitions()

                                                                                                  for candidate in selfvotes

                                                                                                  if candidate = selfwinner and candidate = selfsecond_place

                                                                                                  for voter_index in selfvotes[candidate]

                                                                                                  if voter_index in selfrankings_changed

                                                                                                  ranking = selfrankings_changed[voter_index]

                                                                                                  else

                                                                                                  ranking = copydeepcopy(selfelecsorted_voters[

                                                                                                  voter_index])

                                                                                                  for index2 candidate in enumerate(reversed(ranking))

                                                                                                  if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                                                                                  selfcandidates[selfwinner] += 1

                                                                                                  selfvotes[selfwinner]add(voter_index)

                                                                                                  break

                                                                                                  elif candidate[selfelecCANDIDATE_INDEX] == self

                                                                                                  second_place

                                                                                                  selfcandidates[selfsecond_place] += 1

                                                                                                  selfvotes[selfsecond_place]add(voter_index)

                                                                                                  break

                                                                                                  selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                  winners = []

                                                                                                  vacancies = selfelecN_VACANCIES

                                                                                                  for candidate in reversed(selfsorted_candidates)

                                                                                                  if vacancies == 0

                                                                                                  break

                                                                                                  winnersappend(candidate[0])

                                                                                                  vacancies -= 1

                                                                                                  mean chose_best = selfelecget_mean(winners = winners)

                                                                                                  74

                                                                                                  APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                                                                                  Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                                                                                  for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                  voter_dict = dict()

                                                                                                  og_voter_dict = dict()

                                                                                                  for tup in voter

                                                                                                  voter_dict[tup[0]] = tup[1]

                                                                                                  og_voter_dict[tup[0]] = tup[1]

                                                                                                  for coalition in selfeleccoalitions

                                                                                                  for candidate in coalition

                                                                                                  add_to_score = 0

                                                                                                  for candidate2 in coalition

                                                                                                  if candidate == candidate2

                                                                                                  continue

                                                                                                  half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                                                                                  if half lt 0

                                                                                                  add_to_score += mathceil(half)

                                                                                                  else

                                                                                                  add_to_score += mathfloor(half)

                                                                                                  if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                                                                                  voter_dict[candidate[rsquovaluersquo]] = 10

                                                                                                  elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                                                                                  voter_dict[candidate[rsquovaluersquo]] = -10

                                                                                                  else

                                                                                                  voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                                                                                  selfrankings_changed[voter_index] = []

                                                                                                  for candidate in voter_dict

                                                                                                  selfrankings_changed[voter_index]append((candidate voter_dict[

                                                                                                  candidate]))

                                                                                                  selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                                                                                  voter_index] key=lambda x x[1])

                                                                                                  75

                                                                                                  APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                                                                  Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                                                                  selfelecroundsappend(selfsorted_candidates[_round])

                                                                                                  if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                  N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                                                                  N_VACANCIES - 1)

                                                                                                  return 2

                                                                                                  elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                  N_VOTERS gt 05)

                                                                                                  return 1

                                                                                                  else

                                                                                                  selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                                                                  CANDIDATE_INDEX])

                                                                                                  for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                                                                  elecCANDIDATE_INDEX]]

                                                                                                  if voter_index in selfrankings_changed

                                                                                                  for candidate in reversed(selfrankings_changed[voter_index

                                                                                                  ])

                                                                                                  if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                  excluded

                                                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                  ]] += 1

                                                                                                  selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                  add(voter_index)

                                                                                                  break

                                                                                                  else

                                                                                                  continue

                                                                                                  else

                                                                                                  for candidate in reversed(selfelecsorted_voters[

                                                                                                  voter_index])

                                                                                                  if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                  excluded

                                                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                  ]] += 1

                                                                                                  selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                  add(voter_index)

                                                                                                  break

                                                                                                  else

                                                                                                  continue

                                                                                                  selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                  return 0

                                                                                                  76

                                                                                                  APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                                                                  Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                                                                  for index in range(selfelecN_CANDIDATES)

                                                                                                  selfcandidates[index] = 0

                                                                                                  for voter in selfelecsorted_voters

                                                                                                  for candidate in reversed(voter)

                                                                                                  if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                  else

                                                                                                  break

                                                                                                  APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                                                                  Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                                                                  for index in range(selfelecN_CANDIDATES)

                                                                                                  selfcandidates[index] = 0

                                                                                                  for voter in selfelecsorted_voters

                                                                                                  if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                  elecCANDIDATE_INDEX]]

                                                                                                  selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                                                                  else

                                                                                                  for candidate in reversed(voter)

                                                                                                  if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                  else

                                                                                                  break

                                                                                                  77

                                                                                                  APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                                                                  Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                                                                  pos = set()

                                                                                                  for index perc in enumerate(selfelectactical_vote_percentages)

                                                                                                  if perc gt 0

                                                                                                  posadd(index)

                                                                                                  for candidate in selfeleccandidates

                                                                                                  if candidate not in selfleading_candidates

                                                                                                  for voter_index in selfvotes[candidate]

                                                                                                  raised = None

                                                                                                  for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                                                                  ])

                                                                                                  if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                                                                  leading_candidates

                                                                                                  if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                                                                  if randomrandom() lt selfelectactical_vote_percentages[

                                                                                                  candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                                                                  ranking = [None]selfelecN_CANDIDATES

                                                                                                  ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                  selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                  CANDIDATE_INDEX]])

                                                                                                  raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                  break

                                                                                                  break

                                                                                                  break

                                                                                                  if raised = None

                                                                                                  for _candidate in selfleading_candidates

                                                                                                  if _candidate = ranking[-1][0]

                                                                                                  ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                  _candidate])

                                                                                                  buried = _candidate

                                                                                                  break

                                                                                                  i = 1

                                                                                                  for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                  if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                                                                  buried]

                                                                                                  continue

                                                                                                  else

                                                                                                  ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                  selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                  CANDIDATE_INDEX]])

                                                                                                  i += 1

                                                                                                  selfrankings_changed[voter_index] = ranking

                                                                                                  78

                                                                                                  APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                                                                  Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                                                                  for voter_index in selfvotes[candidate]

                                                                                                  if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                                                                  ]

                                                                                                  for _candidate in selfleading_candidates

                                                                                                  if _candidate = candidate

                                                                                                  ranking = [None]selfelecN_CANDIDATES

                                                                                                  ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                  _candidate])

                                                                                                  buried = _candidate

                                                                                                  break

                                                                                                  i = 1

                                                                                                  for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                  if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                                                                  continue

                                                                                                  else

                                                                                                  ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                  selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                  CANDIDATE_INDEX]])

                                                                                                  i += 1

                                                                                                  selfrankings_changed[voter_index] = ranking

                                                                                                  79

                                                                                                  APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                                                                  Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                                                                  for index in range(selfelecN_CANDIDATES)

                                                                                                  selfcandidates[index] = 0

                                                                                                  for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                  score = 0

                                                                                                  if voter_index in selfrankings_changed

                                                                                                  for candidate in selfrankings_changed[voter_index]

                                                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                  score += 1

                                                                                                  else

                                                                                                  for candidate in voter

                                                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                  score += 1

                                                                                                  APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                                                                  Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                                                                  for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                  if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                  elecCANDIDATE_INDEX]]

                                                                                                  selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                                                                  sorted_voters[voter_index])

                                                                                                  for candidate_index candidate in enumerate(reversed(voter))

                                                                                                  if candidate_index == 0

                                                                                                  selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                  voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                                                                  else

                                                                                                  selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                  voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                                                                  80

                                                                                                  APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                                                                  Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                                                                  for index in range(selfelecN_CANDIDATES)

                                                                                                  selfcandidates[index] = 0

                                                                                                  for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                  if voter_index in selfrankings_changed

                                                                                                  for candidate in selfrankings_changed[voter_index]

                                                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                  selfelecCANDIDATE_RANK]

                                                                                                  else

                                                                                                  for candidate in voter

                                                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                  selfelecCANDIDATE_RANK]

                                                                                                  APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                                                                  Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                                                                  for index in range(selfelecN_CANDIDATES)

                                                                                                  selfcandidates[index] = 0

                                                                                                  for voter in selfelecsorted_voters

                                                                                                  votes = selfelecN_VACANCIES

                                                                                                  for candidate in reversed(voter)

                                                                                                  if votes == 0

                                                                                                  break

                                                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                  votes -= 1

                                                                                                  • Folha de aprovaccedilatildeo
                                                                                                  • Agradecimentos
                                                                                                  • Epiacutegrafe
                                                                                                  • Resumo
                                                                                                  • Abstract
                                                                                                  • Lista de ilustraccedilotildees
                                                                                                  • Lista de Coacutedigos
                                                                                                  • Lista de tabelas
                                                                                                  • Lista de abreviaturas e siglas
                                                                                                  • Sumaacuterio
                                                                                                  • INTRODUCcedilAtildeO
                                                                                                    • MOTIVACcedilAtildeO E OBJETIVO
                                                                                                    • MEacuteTODO
                                                                                                    • ESTRUTURA
                                                                                                      • SISTEMAS ELEITORAIS
                                                                                                        • FISRT PAST THE POST
                                                                                                          • Exemplo
                                                                                                          • Vantagens e Desvantagens do FPTP
                                                                                                          • Voto Uacutetil no FPTP
                                                                                                            • TWO-ROUND SYSTEM
                                                                                                              • Exemplo
                                                                                                              • Vantagens e Desvantagens do TRS
                                                                                                              • Voto Uacutetil no TRS
                                                                                                                • INSTANT-RUNOFF VOTING
                                                                                                                  • Exemplo
                                                                                                                  • Vantagens e Desvantagens do IRV
                                                                                                                  • Voto Uacutetil no IRV
                                                                                                                    • APPROVAL VOTING SYSTEM
                                                                                                                      • Exemplo
                                                                                                                      • Vantagens e Desvantagens do AVS
                                                                                                                      • Voto Uacutetil no AVS
                                                                                                                        • THE BORDA COUNT
                                                                                                                          • Exemplo
                                                                                                                          • Vantagens e Desvantagens do BC
                                                                                                                          • Voto Uacutetil no BC
                                                                                                                            • SCORE VOTING SYSTEM
                                                                                                                              • Exemplo
                                                                                                                              • Vantagens e Desvantagens do SVS
                                                                                                                              • Voto Uacutetil no SVS
                                                                                                                                • BLOC VOTE
                                                                                                                                  • Exemplo
                                                                                                                                  • Voto Uacutetil no BV
                                                                                                                                      • O SIMULADOR
                                                                                                                                      • CENAacuteRIOS PERTINENTES
                                                                                                                                        • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                                                        • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                                                        • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                                                        • CENAacuteRIO 4 COALIZOtildeES
                                                                                                                                        • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                                                        • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                                                          • COMO FUNCIONA O SIMULADOR
                                                                                                                                            • CLASSE Elections
                                                                                                                                            • CLASSE FirstPastThePost
                                                                                                                                            • CLASSE TwoRoundSystem
                                                                                                                                            • CLASSE InstantRunoffVoting
                                                                                                                                            • CLASSE ApprovalVoting
                                                                                                                                            • CLASSE BordaCount
                                                                                                                                            • CLASSE ScoreVoting
                                                                                                                                            • CLASSE BlocVote
                                                                                                                                            • TECNOLOGIAS UTILIZADAS
                                                                                                                                              • CONCLUSAtildeO
                                                                                                                                              • Referecircncias
                                                                                                                                              • Meacutetodo create_voters
                                                                                                                                              • Meacutetodo create_candidates
                                                                                                                                              • Meacutetodo calculate_means
                                                                                                                                              • Meacutetodo get_mean
                                                                                                                                              • Meacutetodo calculate_mean
                                                                                                                                              • Meacutetodo set_leading_candidates
                                                                                                                                              • Meacutetodo irv_set_leading_candidates
                                                                                                                                              • Meacutetodo sort_ranks
                                                                                                                                              • Meacutetodo fptp_count_tactical_votes
                                                                                                                                              • Meacutetodo fptp_count_minority_votes
                                                                                                                                              • Meacutetodo trs_second_round
                                                                                                                                              • Meacutetodo trs_account_for_coalitions
                                                                                                                                              • Meacutetodo irv_count_votes
                                                                                                                                              • Meacutetodo avs_count_votes
                                                                                                                                              • Meacutetodo avs_count_votes_with_tactical
                                                                                                                                              • Meacutetodo irv_apply_tactical_votes
                                                                                                                                              • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                                                              • Meacutetodo bc_sum_candidates_scores
                                                                                                                                              • Meacutetodo svs_apply_tactical_votes
                                                                                                                                              • Meacutetodo svs_sum_candidates_scores
                                                                                                                                              • Meacutetodo bv_count_votes

                                                                                                    50

                                                                                                    Figura 39 ndash SVS - Cenaacuterio 5

                                                                                                    46 CENAacuteRIO 6 VOTO DE MINORIA

                                                                                                    Neste cenaacuterio temos uma eleiccedilatildeo com quatro candidatos e duas vagas A Ana seraacutea preferecircncia de uma extensa parte da populaccedilatildeo (distribuiccedilatildeo Loved Figura 53) Betoe Carla seratildeo candidatos razoavelmente populares (distribuiccedilatildeo Neutral Figura 47) eDiego seraacute a preferecircncia de apenas um pequeno grupo especiacutefico e rejeitado pela maioria(distribuiccedilatildeo Disliked Figura 51) Eacute intuitivo esperar que os dois candidatos eleitos seratildeoa Ana e ou o Beto ou a Carla e isso eacute exatamente o que ocorre na figura 40 no sistemaFPTP sem voto de minoria

                                                                                                    Figura 40 ndash FPTP - Cenaacuterio 6 sem voto de minoria

                                                                                                    Eacute evidente a discrepacircncia da quantidade de votos da Ana para os outros candidatose apesar de Beto e Carla serem mais populares que Diego os trecircs natildeo se encontrammuito afastados Poreacutem se a pequena fraccedilatildeo de candidatos que possuem a Ana como

                                                                                                    51

                                                                                                    Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego

                                                                                                    preferecircncia e Diego como segunda opccedilatildeo optarem pelo voto de minoria a situaccedilatildeo mudacompletamente (Figura 41) Assim apesar de extensamente rejeitado Diego conquistaa segunda vaga e a meacutedia das notas despenca de 2929 para 0505 No entanto aindaexiste um cenaacuterio pior Se os outros grupos de eleitores pensarem da mesma forma eevitarem votar na Ana achando que sua eleiccedilatildeo jaacute estaacute assegurada apenas 80 de votode minoria para esses grupos jaacute eacute o suficiente para eliminaacute-la das eleiccedilotildees (Figura 42)Com a Ana eliminada a meacutedia das notas cai ainda mais para 0058

                                                                                                    Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego

                                                                                                    O sistema Bloc Vote eacute uma das soluccedilotildees para o voto de minoria Permitindo queos eleitores votem no mesmo nuacutemero de candidatos que de vagas a serem preenchidasnatildeo existe o iacutempeto a esse tipo de voto estrateacutegico O resultado desse sistema portantoretorna a meacutedia das notas a casa dos 29 (Figura 43) Os sistemas AVS Borda Count eSVS tambeacutem impedem a presenccedila do voto de minoria e atingem resultados semelhantes

                                                                                                    52

                                                                                                    Figura 43 ndash BV - Cenaacuterio 6

                                                                                                    Tabela 18 ndash Resultados do Cenaacuterio 6

                                                                                                    Sistema Candidatoseleitos

                                                                                                    Meacutedia dasnotas

                                                                                                    FPTP sem voto de minoriaAna eBeto 2929

                                                                                                    FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

                                                                                                    FPTP com 80 de voto de minoriaBeto eCarla 0058

                                                                                                    Bloc VoteAna eCarla 2913

                                                                                                    Esses resultados podem ser replicados acessando os links

                                                                                                    Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

                                                                                                    100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

                                                                                                    80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

                                                                                                    53

                                                                                                    5 COMO FUNCIONA O SIMULADOR

                                                                                                    O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

                                                                                                    51 CLASSE ELECTIONS

                                                                                                    Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

                                                                                                    bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

                                                                                                    Figura 44 ndash estrutura candidates

                                                                                                    bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

                                                                                                    bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

                                                                                                    Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

                                                                                                    Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

                                                                                                    54

                                                                                                    Figura 45 ndash estrutura voters

                                                                                                    Figura 46 ndash estrutura votes

                                                                                                    daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

                                                                                                    Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

                                                                                                    55

                                                                                                    Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

                                                                                                    Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

                                                                                                    na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

                                                                                                    56

                                                                                                    Figura 49 ndash PDF - Distribuiccedilatildeo Liked

                                                                                                    Figura 50 ndash CDF - Distribuiccedilatildeo Liked

                                                                                                    (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

                                                                                                    Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

                                                                                                    57

                                                                                                    Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

                                                                                                    Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

                                                                                                    candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

                                                                                                    Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

                                                                                                    58

                                                                                                    Figura 53 ndash PDF - Distribuiccedilatildeo Loved

                                                                                                    Figura 54 ndash CDF - Distribuiccedilatildeo Loved

                                                                                                    funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

                                                                                                    59

                                                                                                    Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                                                                                                    Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                                                                                                    Meacutedia das Notas sumei

                                                                                                    sumvj nij

                                                                                                    etimes v

                                                                                                    Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                                                                                                    Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                                                                                                    60

                                                                                                    Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                                                                                                    Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                                                                                                    52 CLASSE FIRSTPASTTHEPOST

                                                                                                    Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                                                                                                    Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                                                                                                    61

                                                                                                    Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                                                                                                    Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                                                                                                    mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                                                                                                    62

                                                                                                    53 CLASSE TWOROUNDSYSTEM

                                                                                                    A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                                                                                                    54 CLASSE INSTANTRUNOFFVOTING

                                                                                                    A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                                                                                                    Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                                                                                                    63

                                                                                                    cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                                                                                                    55 CLASSE APPROVALVOTING

                                                                                                    Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                                                                                                    56 CLASSE BORDACOUNT

                                                                                                    Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                                                                                                    57 CLASSE SCOREVOTING

                                                                                                    De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                                                                                                    64

                                                                                                    58 CLASSE BLOCVOTE

                                                                                                    O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                                                                                                    59 TECNOLOGIAS UTILIZADAS

                                                                                                    A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                                                                                                    Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                                                                                                    O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                                                                                                    Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                                                                                                    65

                                                                                                    6 CONCLUSAtildeO

                                                                                                    Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                                                                                                    Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                                                                                                    Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                                                                                                    Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                                                                                                    Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                                                                                                    66

                                                                                                    REFEREcircNCIAS

                                                                                                    AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                                                                                                    Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                                                                                                    Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                                                                                                    Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                                                                                                    HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                                                                                                    LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                                                                                                    ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                                                                                                    Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                                                                                                    POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                                                                                                    The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                                                                                                    67

                                                                                                    APEcircNDICES

                                                                                                    APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                                                                                    Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                                                                                    if(not len(selfvoter_profiles))

                                                                                                    for voter in range(selfN_VOTERS)

                                                                                                    candidates_rank = dict()

                                                                                                    for candidate in reversed(range(selfN_CANDIDATES))

                                                                                                    if(selfBIAS_VECTOR[candidate]==4)

                                                                                                    candidates_rank[candidate] = self_sortear(selfloved)

                                                                                                    elif(selfBIAS_VECTOR[candidate]==3)

                                                                                                    candidates_rank[candidate] = self_sortear(selfliked)

                                                                                                    elif(selfBIAS_VECTOR[candidate]==2)

                                                                                                    candidates_rank[candidate] = self_sortear(selfdisliked)

                                                                                                    elif(selfBIAS_VECTOR[candidate]==1)

                                                                                                    candidates_rank[candidate] = self_sortear(selfhated)

                                                                                                    elif(selfBIAS_VECTOR[candidate]==-1)

                                                                                                    candidates_rank[candidate] = self_sortear(selfpolarizer

                                                                                                    )

                                                                                                    elif(selfBIAS_VECTOR[candidate]==-2)

                                                                                                    candidates_rank[candidate] = self_sortear(self

                                                                                                    more_polarizer)

                                                                                                    else

                                                                                                    candidates_rank[candidate] = self_sortear(selfneutral)

                                                                                                    selfvotersappend(candidates_rank)

                                                                                                    else

                                                                                                    ranges = []

                                                                                                    ranks = []

                                                                                                    for prof in selfvoter_profiles

                                                                                                    rangesappend(int(prof[pop_percentage]))

                                                                                                    rank =

                                                                                                    for index score in enumerate(prof[scores])

                                                                                                    rank[index] = score

                                                                                                    ranksappend(rank)

                                                                                                    for index _range in enumerate(ranges)

                                                                                                    for _ in range(int(selfN_VOTERS(_range100)))

                                                                                                    selfvotersappend(ranks[index])

                                                                                                    68

                                                                                                    APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                                                                                    Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                                                                                    for i in range(selfN_CANDIDATES)

                                                                                                    selfcandidates[i] = 0

                                                                                                    selfvotes[i] = set()

                                                                                                    APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                                                                                    Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                                                                                    for candidate in range(selfN_CANDIDATES)

                                                                                                    rating_sum = 0

                                                                                                    for voter in selfvoters

                                                                                                    rating_sum += voter[candidate]

                                                                                                    selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                                                                                    APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                                                                                    Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                                                                                    if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                                                                                    return selfcalculate_mean(winners)

                                                                                                    else

                                                                                                    chose_best = True if winners[0] == selfbest_candidate else

                                                                                                    False

                                                                                                    return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                                                                                    69

                                                                                                    APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                                                                                    Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                                                                                    rating_sum = 0

                                                                                                    for voter in selfvoters

                                                                                                    for candidate in winners

                                                                                                    rating_sum += voter[candidate]

                                                                                                    return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                                                                                    APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                                                                                    Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                                                                                    for i in range(1 selfN_VACANCIES + 2)

                                                                                                    selfleading_candidatesappend(selfsorted_candidates[-i][self

                                                                                                    CANDIDATE_INDEX])

                                                                                                    APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                                                                                    Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                                                                                    for leader in selfelecrounds[-1]

                                                                                                    selfleading_candidatesappend(leader[0])

                                                                                                    70

                                                                                                    APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                                                                                    Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                                                                                    self_account_for_coalitions()

                                                                                                    for voter in selfvoters

                                                                                                    selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                                                                                    (1)))

                                                                                                    temp = []

                                                                                                    for voter in selfsorted_voters

                                                                                                    new_dict = defaultdict(list)

                                                                                                    for k in voter

                                                                                                    new_dict[k[1]]append(k[0])

                                                                                                    tempappend(new_dict)

                                                                                                    selfsorted_voters = []

                                                                                                    for voter_index current_voter in enumerate(temp)

                                                                                                    new_voter = []

                                                                                                    for rating candidate_indexes in current_voteritems()

                                                                                                    if len(current_voter[rating]) gt 1

                                                                                                    shuffle(current_voter[rating])

                                                                                                    for e in candidate_indexes

                                                                                                    new_voterappend((e rating))

                                                                                                    else

                                                                                                    new_voterappend((candidate_indexes[0] rating))

                                                                                                    selfsorted_votersappend(new_voter)

                                                                                                    selfcandidates[new_voter[-1][0]] += 1

                                                                                                    selfvotes[new_voter[-1][0]]add(voter_index)

                                                                                                    71

                                                                                                    APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                                                                                    Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                                                                                    for candidate in selfvotes_copy

                                                                                                    if candidate not in selfelecleading_candidates

                                                                                                    for voter_index in selfvotes_copy[candidate]

                                                                                                    for index _candidate in enumerate(reversed(selfelec

                                                                                                    sorted_voters[voter_index]))

                                                                                                    if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                                                                                    leading_candidates

                                                                                                    if randomrandom() lt selfelec

                                                                                                    tactical_vote_percentages[_candidate[selfelec

                                                                                                    CANDIDATE_INDEX]]

                                                                                                    selfrankings_changed[voter_index] = copy

                                                                                                    deepcopy(selfelecsorted_voters[voter_index])

                                                                                                    selfrankings_changed[voter_index][-(index + 1)]

                                                                                                    selfrankings_changed[voter_index][-1] = self

                                                                                                    rankings_changed[voter_index][-1] self

                                                                                                    rankings_changed[voter_index][-(index + 1)]

                                                                                                    selfcandidates[candidate] -= 1

                                                                                                    selfcandidates[_candidate[selfelec

                                                                                                    CANDIDATE_INDEX]] += 1

                                                                                                    selfvotes[candidate]remove(voter_index)

                                                                                                    selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                                                                                    ]]add(voter_index)

                                                                                                    break

                                                                                                    break

                                                                                                    72

                                                                                                    APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                                                                                    Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                                                                                    half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                                                                                    for candidate in selfelecleading_candidates

                                                                                                    if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                                                                                    continue

                                                                                                    for voter_index in selfvotes_copy[candidate]

                                                                                                    if voter_index in selfrankings_changed

                                                                                                    ranking = selfrankings_changed[voter_index]

                                                                                                    else

                                                                                                    ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                                                                                    ])

                                                                                                    for index _candidate in enumerate(reversed(ranking))

                                                                                                    if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                    leading_candidates or (_candidate[selfelec

                                                                                                    CANDIDATE_INDEX] in selfelecleading_candidates and

                                                                                                    selfelecleading_candidatesindex(_candidate[selfelec

                                                                                                    CANDIDATE_INDEX]) gt= half_vacancies)

                                                                                                    if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                                                                                    if randomrandom() lt selfelec

                                                                                                    minority_vote_percentages[_candidate[selfelec

                                                                                                    CANDIDATE_INDEX]]

                                                                                                    selfcandidates[candidate] -= 1

                                                                                                    selfcandidates[_candidate[selfelec

                                                                                                    CANDIDATE_INDEX]] += 1

                                                                                                    break

                                                                                                    break

                                                                                                    break

                                                                                                    73

                                                                                                    APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                                                                                    Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                                                                                    self_account_for_coalitions()

                                                                                                    for candidate in selfvotes

                                                                                                    if candidate = selfwinner and candidate = selfsecond_place

                                                                                                    for voter_index in selfvotes[candidate]

                                                                                                    if voter_index in selfrankings_changed

                                                                                                    ranking = selfrankings_changed[voter_index]

                                                                                                    else

                                                                                                    ranking = copydeepcopy(selfelecsorted_voters[

                                                                                                    voter_index])

                                                                                                    for index2 candidate in enumerate(reversed(ranking))

                                                                                                    if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                                                                                    selfcandidates[selfwinner] += 1

                                                                                                    selfvotes[selfwinner]add(voter_index)

                                                                                                    break

                                                                                                    elif candidate[selfelecCANDIDATE_INDEX] == self

                                                                                                    second_place

                                                                                                    selfcandidates[selfsecond_place] += 1

                                                                                                    selfvotes[selfsecond_place]add(voter_index)

                                                                                                    break

                                                                                                    selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                    winners = []

                                                                                                    vacancies = selfelecN_VACANCIES

                                                                                                    for candidate in reversed(selfsorted_candidates)

                                                                                                    if vacancies == 0

                                                                                                    break

                                                                                                    winnersappend(candidate[0])

                                                                                                    vacancies -= 1

                                                                                                    mean chose_best = selfelecget_mean(winners = winners)

                                                                                                    74

                                                                                                    APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                                                                                    Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                                                                                    for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                    voter_dict = dict()

                                                                                                    og_voter_dict = dict()

                                                                                                    for tup in voter

                                                                                                    voter_dict[tup[0]] = tup[1]

                                                                                                    og_voter_dict[tup[0]] = tup[1]

                                                                                                    for coalition in selfeleccoalitions

                                                                                                    for candidate in coalition

                                                                                                    add_to_score = 0

                                                                                                    for candidate2 in coalition

                                                                                                    if candidate == candidate2

                                                                                                    continue

                                                                                                    half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                                                                                    if half lt 0

                                                                                                    add_to_score += mathceil(half)

                                                                                                    else

                                                                                                    add_to_score += mathfloor(half)

                                                                                                    if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                                                                                    voter_dict[candidate[rsquovaluersquo]] = 10

                                                                                                    elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                                                                                    voter_dict[candidate[rsquovaluersquo]] = -10

                                                                                                    else

                                                                                                    voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                                                                                    selfrankings_changed[voter_index] = []

                                                                                                    for candidate in voter_dict

                                                                                                    selfrankings_changed[voter_index]append((candidate voter_dict[

                                                                                                    candidate]))

                                                                                                    selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                                                                                    voter_index] key=lambda x x[1])

                                                                                                    75

                                                                                                    APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                                                                    Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                                                                    selfelecroundsappend(selfsorted_candidates[_round])

                                                                                                    if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                    N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                                                                    N_VACANCIES - 1)

                                                                                                    return 2

                                                                                                    elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                    N_VOTERS gt 05)

                                                                                                    return 1

                                                                                                    else

                                                                                                    selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                                                                    CANDIDATE_INDEX])

                                                                                                    for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                                                                    elecCANDIDATE_INDEX]]

                                                                                                    if voter_index in selfrankings_changed

                                                                                                    for candidate in reversed(selfrankings_changed[voter_index

                                                                                                    ])

                                                                                                    if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                    excluded

                                                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                    ]] += 1

                                                                                                    selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                    add(voter_index)

                                                                                                    break

                                                                                                    else

                                                                                                    continue

                                                                                                    else

                                                                                                    for candidate in reversed(selfelecsorted_voters[

                                                                                                    voter_index])

                                                                                                    if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                    excluded

                                                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                    ]] += 1

                                                                                                    selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                    add(voter_index)

                                                                                                    break

                                                                                                    else

                                                                                                    continue

                                                                                                    selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                    return 0

                                                                                                    76

                                                                                                    APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                                                                    Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                                                                    for index in range(selfelecN_CANDIDATES)

                                                                                                    selfcandidates[index] = 0

                                                                                                    for voter in selfelecsorted_voters

                                                                                                    for candidate in reversed(voter)

                                                                                                    if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                    else

                                                                                                    break

                                                                                                    APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                                                                    Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                                                                    for index in range(selfelecN_CANDIDATES)

                                                                                                    selfcandidates[index] = 0

                                                                                                    for voter in selfelecsorted_voters

                                                                                                    if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                    elecCANDIDATE_INDEX]]

                                                                                                    selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                                                                    else

                                                                                                    for candidate in reversed(voter)

                                                                                                    if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                    else

                                                                                                    break

                                                                                                    77

                                                                                                    APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                                                                    Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                                                                    pos = set()

                                                                                                    for index perc in enumerate(selfelectactical_vote_percentages)

                                                                                                    if perc gt 0

                                                                                                    posadd(index)

                                                                                                    for candidate in selfeleccandidates

                                                                                                    if candidate not in selfleading_candidates

                                                                                                    for voter_index in selfvotes[candidate]

                                                                                                    raised = None

                                                                                                    for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                                                                    ])

                                                                                                    if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                                                                    leading_candidates

                                                                                                    if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                                                                    if randomrandom() lt selfelectactical_vote_percentages[

                                                                                                    candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                                                                    ranking = [None]selfelecN_CANDIDATES

                                                                                                    ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                    selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                    CANDIDATE_INDEX]])

                                                                                                    raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                    break

                                                                                                    break

                                                                                                    break

                                                                                                    if raised = None

                                                                                                    for _candidate in selfleading_candidates

                                                                                                    if _candidate = ranking[-1][0]

                                                                                                    ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                    _candidate])

                                                                                                    buried = _candidate

                                                                                                    break

                                                                                                    i = 1

                                                                                                    for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                    if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                                                                    buried]

                                                                                                    continue

                                                                                                    else

                                                                                                    ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                    selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                    CANDIDATE_INDEX]])

                                                                                                    i += 1

                                                                                                    selfrankings_changed[voter_index] = ranking

                                                                                                    78

                                                                                                    APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                                                                    Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                                                                    for voter_index in selfvotes[candidate]

                                                                                                    if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                                                                    ]

                                                                                                    for _candidate in selfleading_candidates

                                                                                                    if _candidate = candidate

                                                                                                    ranking = [None]selfelecN_CANDIDATES

                                                                                                    ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                    _candidate])

                                                                                                    buried = _candidate

                                                                                                    break

                                                                                                    i = 1

                                                                                                    for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                    if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                                                                    continue

                                                                                                    else

                                                                                                    ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                    selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                    CANDIDATE_INDEX]])

                                                                                                    i += 1

                                                                                                    selfrankings_changed[voter_index] = ranking

                                                                                                    79

                                                                                                    APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                                                                    Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                                                                    for index in range(selfelecN_CANDIDATES)

                                                                                                    selfcandidates[index] = 0

                                                                                                    for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                    score = 0

                                                                                                    if voter_index in selfrankings_changed

                                                                                                    for candidate in selfrankings_changed[voter_index]

                                                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                    score += 1

                                                                                                    else

                                                                                                    for candidate in voter

                                                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                    score += 1

                                                                                                    APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                                                                    Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                                                                    for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                    if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                    elecCANDIDATE_INDEX]]

                                                                                                    selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                                                                    sorted_voters[voter_index])

                                                                                                    for candidate_index candidate in enumerate(reversed(voter))

                                                                                                    if candidate_index == 0

                                                                                                    selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                    voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                                                                    else

                                                                                                    selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                    voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                                                                    80

                                                                                                    APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                                                                    Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                                                                    for index in range(selfelecN_CANDIDATES)

                                                                                                    selfcandidates[index] = 0

                                                                                                    for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                    if voter_index in selfrankings_changed

                                                                                                    for candidate in selfrankings_changed[voter_index]

                                                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                    selfelecCANDIDATE_RANK]

                                                                                                    else

                                                                                                    for candidate in voter

                                                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                    selfelecCANDIDATE_RANK]

                                                                                                    APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                                                                    Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                                                                    for index in range(selfelecN_CANDIDATES)

                                                                                                    selfcandidates[index] = 0

                                                                                                    for voter in selfelecsorted_voters

                                                                                                    votes = selfelecN_VACANCIES

                                                                                                    for candidate in reversed(voter)

                                                                                                    if votes == 0

                                                                                                    break

                                                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                    votes -= 1

                                                                                                    • Folha de aprovaccedilatildeo
                                                                                                    • Agradecimentos
                                                                                                    • Epiacutegrafe
                                                                                                    • Resumo
                                                                                                    • Abstract
                                                                                                    • Lista de ilustraccedilotildees
                                                                                                    • Lista de Coacutedigos
                                                                                                    • Lista de tabelas
                                                                                                    • Lista de abreviaturas e siglas
                                                                                                    • Sumaacuterio
                                                                                                    • INTRODUCcedilAtildeO
                                                                                                      • MOTIVACcedilAtildeO E OBJETIVO
                                                                                                      • MEacuteTODO
                                                                                                      • ESTRUTURA
                                                                                                        • SISTEMAS ELEITORAIS
                                                                                                          • FISRT PAST THE POST
                                                                                                            • Exemplo
                                                                                                            • Vantagens e Desvantagens do FPTP
                                                                                                            • Voto Uacutetil no FPTP
                                                                                                              • TWO-ROUND SYSTEM
                                                                                                                • Exemplo
                                                                                                                • Vantagens e Desvantagens do TRS
                                                                                                                • Voto Uacutetil no TRS
                                                                                                                  • INSTANT-RUNOFF VOTING
                                                                                                                    • Exemplo
                                                                                                                    • Vantagens e Desvantagens do IRV
                                                                                                                    • Voto Uacutetil no IRV
                                                                                                                      • APPROVAL VOTING SYSTEM
                                                                                                                        • Exemplo
                                                                                                                        • Vantagens e Desvantagens do AVS
                                                                                                                        • Voto Uacutetil no AVS
                                                                                                                          • THE BORDA COUNT
                                                                                                                            • Exemplo
                                                                                                                            • Vantagens e Desvantagens do BC
                                                                                                                            • Voto Uacutetil no BC
                                                                                                                              • SCORE VOTING SYSTEM
                                                                                                                                • Exemplo
                                                                                                                                • Vantagens e Desvantagens do SVS
                                                                                                                                • Voto Uacutetil no SVS
                                                                                                                                  • BLOC VOTE
                                                                                                                                    • Exemplo
                                                                                                                                    • Voto Uacutetil no BV
                                                                                                                                        • O SIMULADOR
                                                                                                                                        • CENAacuteRIOS PERTINENTES
                                                                                                                                          • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                                                          • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                                                          • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                                                          • CENAacuteRIO 4 COALIZOtildeES
                                                                                                                                          • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                                                          • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                                                            • COMO FUNCIONA O SIMULADOR
                                                                                                                                              • CLASSE Elections
                                                                                                                                              • CLASSE FirstPastThePost
                                                                                                                                              • CLASSE TwoRoundSystem
                                                                                                                                              • CLASSE InstantRunoffVoting
                                                                                                                                              • CLASSE ApprovalVoting
                                                                                                                                              • CLASSE BordaCount
                                                                                                                                              • CLASSE ScoreVoting
                                                                                                                                              • CLASSE BlocVote
                                                                                                                                              • TECNOLOGIAS UTILIZADAS
                                                                                                                                                • CONCLUSAtildeO
                                                                                                                                                • Referecircncias
                                                                                                                                                • Meacutetodo create_voters
                                                                                                                                                • Meacutetodo create_candidates
                                                                                                                                                • Meacutetodo calculate_means
                                                                                                                                                • Meacutetodo get_mean
                                                                                                                                                • Meacutetodo calculate_mean
                                                                                                                                                • Meacutetodo set_leading_candidates
                                                                                                                                                • Meacutetodo irv_set_leading_candidates
                                                                                                                                                • Meacutetodo sort_ranks
                                                                                                                                                • Meacutetodo fptp_count_tactical_votes
                                                                                                                                                • Meacutetodo fptp_count_minority_votes
                                                                                                                                                • Meacutetodo trs_second_round
                                                                                                                                                • Meacutetodo trs_account_for_coalitions
                                                                                                                                                • Meacutetodo irv_count_votes
                                                                                                                                                • Meacutetodo avs_count_votes
                                                                                                                                                • Meacutetodo avs_count_votes_with_tactical
                                                                                                                                                • Meacutetodo irv_apply_tactical_votes
                                                                                                                                                • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                                                                • Meacutetodo bc_sum_candidates_scores
                                                                                                                                                • Meacutetodo svs_apply_tactical_votes
                                                                                                                                                • Meacutetodo svs_sum_candidates_scores
                                                                                                                                                • Meacutetodo bv_count_votes

                                                                                                      51

                                                                                                      Figura 41 ndash FPTP - Cenaacuterio 6 100 voto de minoria para Diego

                                                                                                      preferecircncia e Diego como segunda opccedilatildeo optarem pelo voto de minoria a situaccedilatildeo mudacompletamente (Figura 41) Assim apesar de extensamente rejeitado Diego conquistaa segunda vaga e a meacutedia das notas despenca de 2929 para 0505 No entanto aindaexiste um cenaacuterio pior Se os outros grupos de eleitores pensarem da mesma forma eevitarem votar na Ana achando que sua eleiccedilatildeo jaacute estaacute assegurada apenas 80 de votode minoria para esses grupos jaacute eacute o suficiente para eliminaacute-la das eleiccedilotildees (Figura 42)Com a Ana eliminada a meacutedia das notas cai ainda mais para 0058

                                                                                                      Figura 42 ndash FPTP - Cenaacuterio 6 80 voto de minoria em Beto Carla e Diego

                                                                                                      O sistema Bloc Vote eacute uma das soluccedilotildees para o voto de minoria Permitindo queos eleitores votem no mesmo nuacutemero de candidatos que de vagas a serem preenchidasnatildeo existe o iacutempeto a esse tipo de voto estrateacutegico O resultado desse sistema portantoretorna a meacutedia das notas a casa dos 29 (Figura 43) Os sistemas AVS Borda Count eSVS tambeacutem impedem a presenccedila do voto de minoria e atingem resultados semelhantes

                                                                                                      52

                                                                                                      Figura 43 ndash BV - Cenaacuterio 6

                                                                                                      Tabela 18 ndash Resultados do Cenaacuterio 6

                                                                                                      Sistema Candidatoseleitos

                                                                                                      Meacutedia dasnotas

                                                                                                      FPTP sem voto de minoriaAna eBeto 2929

                                                                                                      FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

                                                                                                      FPTP com 80 de voto de minoriaBeto eCarla 0058

                                                                                                      Bloc VoteAna eCarla 2913

                                                                                                      Esses resultados podem ser replicados acessando os links

                                                                                                      Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

                                                                                                      100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

                                                                                                      80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

                                                                                                      53

                                                                                                      5 COMO FUNCIONA O SIMULADOR

                                                                                                      O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

                                                                                                      51 CLASSE ELECTIONS

                                                                                                      Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

                                                                                                      bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

                                                                                                      Figura 44 ndash estrutura candidates

                                                                                                      bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

                                                                                                      bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

                                                                                                      Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

                                                                                                      Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

                                                                                                      54

                                                                                                      Figura 45 ndash estrutura voters

                                                                                                      Figura 46 ndash estrutura votes

                                                                                                      daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

                                                                                                      Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

                                                                                                      55

                                                                                                      Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

                                                                                                      Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

                                                                                                      na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

                                                                                                      56

                                                                                                      Figura 49 ndash PDF - Distribuiccedilatildeo Liked

                                                                                                      Figura 50 ndash CDF - Distribuiccedilatildeo Liked

                                                                                                      (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

                                                                                                      Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

                                                                                                      57

                                                                                                      Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

                                                                                                      Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

                                                                                                      candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

                                                                                                      Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

                                                                                                      58

                                                                                                      Figura 53 ndash PDF - Distribuiccedilatildeo Loved

                                                                                                      Figura 54 ndash CDF - Distribuiccedilatildeo Loved

                                                                                                      funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

                                                                                                      59

                                                                                                      Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                                                                                                      Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                                                                                                      Meacutedia das Notas sumei

                                                                                                      sumvj nij

                                                                                                      etimes v

                                                                                                      Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                                                                                                      Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                                                                                                      60

                                                                                                      Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                                                                                                      Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                                                                                                      52 CLASSE FIRSTPASTTHEPOST

                                                                                                      Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                                                                                                      Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                                                                                                      61

                                                                                                      Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                                                                                                      Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                                                                                                      mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                                                                                                      62

                                                                                                      53 CLASSE TWOROUNDSYSTEM

                                                                                                      A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                                                                                                      54 CLASSE INSTANTRUNOFFVOTING

                                                                                                      A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                                                                                                      Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                                                                                                      63

                                                                                                      cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                                                                                                      55 CLASSE APPROVALVOTING

                                                                                                      Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                                                                                                      56 CLASSE BORDACOUNT

                                                                                                      Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                                                                                                      57 CLASSE SCOREVOTING

                                                                                                      De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                                                                                                      64

                                                                                                      58 CLASSE BLOCVOTE

                                                                                                      O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                                                                                                      59 TECNOLOGIAS UTILIZADAS

                                                                                                      A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                                                                                                      Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                                                                                                      O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                                                                                                      Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                                                                                                      65

                                                                                                      6 CONCLUSAtildeO

                                                                                                      Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                                                                                                      Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                                                                                                      Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                                                                                                      Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                                                                                                      Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                                                                                                      66

                                                                                                      REFEREcircNCIAS

                                                                                                      AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                                                                                                      Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                                                                                                      Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                                                                                                      Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                                                                                                      HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                                                                                                      LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                                                                                                      ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                                                                                                      Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                                                                                                      POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                                                                                                      The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                                                                                                      67

                                                                                                      APEcircNDICES

                                                                                                      APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                                                                                      Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                                                                                      if(not len(selfvoter_profiles))

                                                                                                      for voter in range(selfN_VOTERS)

                                                                                                      candidates_rank = dict()

                                                                                                      for candidate in reversed(range(selfN_CANDIDATES))

                                                                                                      if(selfBIAS_VECTOR[candidate]==4)

                                                                                                      candidates_rank[candidate] = self_sortear(selfloved)

                                                                                                      elif(selfBIAS_VECTOR[candidate]==3)

                                                                                                      candidates_rank[candidate] = self_sortear(selfliked)

                                                                                                      elif(selfBIAS_VECTOR[candidate]==2)

                                                                                                      candidates_rank[candidate] = self_sortear(selfdisliked)

                                                                                                      elif(selfBIAS_VECTOR[candidate]==1)

                                                                                                      candidates_rank[candidate] = self_sortear(selfhated)

                                                                                                      elif(selfBIAS_VECTOR[candidate]==-1)

                                                                                                      candidates_rank[candidate] = self_sortear(selfpolarizer

                                                                                                      )

                                                                                                      elif(selfBIAS_VECTOR[candidate]==-2)

                                                                                                      candidates_rank[candidate] = self_sortear(self

                                                                                                      more_polarizer)

                                                                                                      else

                                                                                                      candidates_rank[candidate] = self_sortear(selfneutral)

                                                                                                      selfvotersappend(candidates_rank)

                                                                                                      else

                                                                                                      ranges = []

                                                                                                      ranks = []

                                                                                                      for prof in selfvoter_profiles

                                                                                                      rangesappend(int(prof[pop_percentage]))

                                                                                                      rank =

                                                                                                      for index score in enumerate(prof[scores])

                                                                                                      rank[index] = score

                                                                                                      ranksappend(rank)

                                                                                                      for index _range in enumerate(ranges)

                                                                                                      for _ in range(int(selfN_VOTERS(_range100)))

                                                                                                      selfvotersappend(ranks[index])

                                                                                                      68

                                                                                                      APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                                                                                      Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                                                                                      for i in range(selfN_CANDIDATES)

                                                                                                      selfcandidates[i] = 0

                                                                                                      selfvotes[i] = set()

                                                                                                      APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                                                                                      Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                                                                                      for candidate in range(selfN_CANDIDATES)

                                                                                                      rating_sum = 0

                                                                                                      for voter in selfvoters

                                                                                                      rating_sum += voter[candidate]

                                                                                                      selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                                                                                      APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                                                                                      Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                                                                                      if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                                                                                      return selfcalculate_mean(winners)

                                                                                                      else

                                                                                                      chose_best = True if winners[0] == selfbest_candidate else

                                                                                                      False

                                                                                                      return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                                                                                      69

                                                                                                      APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                                                                                      Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                                                                                      rating_sum = 0

                                                                                                      for voter in selfvoters

                                                                                                      for candidate in winners

                                                                                                      rating_sum += voter[candidate]

                                                                                                      return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                                                                                      APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                                                                                      Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                                                                                      for i in range(1 selfN_VACANCIES + 2)

                                                                                                      selfleading_candidatesappend(selfsorted_candidates[-i][self

                                                                                                      CANDIDATE_INDEX])

                                                                                                      APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                                                                                      Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                                                                                      for leader in selfelecrounds[-1]

                                                                                                      selfleading_candidatesappend(leader[0])

                                                                                                      70

                                                                                                      APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                                                                                      Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                                                                                      self_account_for_coalitions()

                                                                                                      for voter in selfvoters

                                                                                                      selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                                                                                      (1)))

                                                                                                      temp = []

                                                                                                      for voter in selfsorted_voters

                                                                                                      new_dict = defaultdict(list)

                                                                                                      for k in voter

                                                                                                      new_dict[k[1]]append(k[0])

                                                                                                      tempappend(new_dict)

                                                                                                      selfsorted_voters = []

                                                                                                      for voter_index current_voter in enumerate(temp)

                                                                                                      new_voter = []

                                                                                                      for rating candidate_indexes in current_voteritems()

                                                                                                      if len(current_voter[rating]) gt 1

                                                                                                      shuffle(current_voter[rating])

                                                                                                      for e in candidate_indexes

                                                                                                      new_voterappend((e rating))

                                                                                                      else

                                                                                                      new_voterappend((candidate_indexes[0] rating))

                                                                                                      selfsorted_votersappend(new_voter)

                                                                                                      selfcandidates[new_voter[-1][0]] += 1

                                                                                                      selfvotes[new_voter[-1][0]]add(voter_index)

                                                                                                      71

                                                                                                      APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                                                                                      Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                                                                                      for candidate in selfvotes_copy

                                                                                                      if candidate not in selfelecleading_candidates

                                                                                                      for voter_index in selfvotes_copy[candidate]

                                                                                                      for index _candidate in enumerate(reversed(selfelec

                                                                                                      sorted_voters[voter_index]))

                                                                                                      if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                                                                                      leading_candidates

                                                                                                      if randomrandom() lt selfelec

                                                                                                      tactical_vote_percentages[_candidate[selfelec

                                                                                                      CANDIDATE_INDEX]]

                                                                                                      selfrankings_changed[voter_index] = copy

                                                                                                      deepcopy(selfelecsorted_voters[voter_index])

                                                                                                      selfrankings_changed[voter_index][-(index + 1)]

                                                                                                      selfrankings_changed[voter_index][-1] = self

                                                                                                      rankings_changed[voter_index][-1] self

                                                                                                      rankings_changed[voter_index][-(index + 1)]

                                                                                                      selfcandidates[candidate] -= 1

                                                                                                      selfcandidates[_candidate[selfelec

                                                                                                      CANDIDATE_INDEX]] += 1

                                                                                                      selfvotes[candidate]remove(voter_index)

                                                                                                      selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                                                                                      ]]add(voter_index)

                                                                                                      break

                                                                                                      break

                                                                                                      72

                                                                                                      APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                                                                                      Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                                                                                      half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                                                                                      for candidate in selfelecleading_candidates

                                                                                                      if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                                                                                      continue

                                                                                                      for voter_index in selfvotes_copy[candidate]

                                                                                                      if voter_index in selfrankings_changed

                                                                                                      ranking = selfrankings_changed[voter_index]

                                                                                                      else

                                                                                                      ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                                                                                      ])

                                                                                                      for index _candidate in enumerate(reversed(ranking))

                                                                                                      if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                      leading_candidates or (_candidate[selfelec

                                                                                                      CANDIDATE_INDEX] in selfelecleading_candidates and

                                                                                                      selfelecleading_candidatesindex(_candidate[selfelec

                                                                                                      CANDIDATE_INDEX]) gt= half_vacancies)

                                                                                                      if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                                                                                      if randomrandom() lt selfelec

                                                                                                      minority_vote_percentages[_candidate[selfelec

                                                                                                      CANDIDATE_INDEX]]

                                                                                                      selfcandidates[candidate] -= 1

                                                                                                      selfcandidates[_candidate[selfelec

                                                                                                      CANDIDATE_INDEX]] += 1

                                                                                                      break

                                                                                                      break

                                                                                                      break

                                                                                                      73

                                                                                                      APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                                                                                      Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                                                                                      self_account_for_coalitions()

                                                                                                      for candidate in selfvotes

                                                                                                      if candidate = selfwinner and candidate = selfsecond_place

                                                                                                      for voter_index in selfvotes[candidate]

                                                                                                      if voter_index in selfrankings_changed

                                                                                                      ranking = selfrankings_changed[voter_index]

                                                                                                      else

                                                                                                      ranking = copydeepcopy(selfelecsorted_voters[

                                                                                                      voter_index])

                                                                                                      for index2 candidate in enumerate(reversed(ranking))

                                                                                                      if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                                                                                      selfcandidates[selfwinner] += 1

                                                                                                      selfvotes[selfwinner]add(voter_index)

                                                                                                      break

                                                                                                      elif candidate[selfelecCANDIDATE_INDEX] == self

                                                                                                      second_place

                                                                                                      selfcandidates[selfsecond_place] += 1

                                                                                                      selfvotes[selfsecond_place]add(voter_index)

                                                                                                      break

                                                                                                      selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                      winners = []

                                                                                                      vacancies = selfelecN_VACANCIES

                                                                                                      for candidate in reversed(selfsorted_candidates)

                                                                                                      if vacancies == 0

                                                                                                      break

                                                                                                      winnersappend(candidate[0])

                                                                                                      vacancies -= 1

                                                                                                      mean chose_best = selfelecget_mean(winners = winners)

                                                                                                      74

                                                                                                      APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                                                                                      Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                                                                                      for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                      voter_dict = dict()

                                                                                                      og_voter_dict = dict()

                                                                                                      for tup in voter

                                                                                                      voter_dict[tup[0]] = tup[1]

                                                                                                      og_voter_dict[tup[0]] = tup[1]

                                                                                                      for coalition in selfeleccoalitions

                                                                                                      for candidate in coalition

                                                                                                      add_to_score = 0

                                                                                                      for candidate2 in coalition

                                                                                                      if candidate == candidate2

                                                                                                      continue

                                                                                                      half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                                                                                      if half lt 0

                                                                                                      add_to_score += mathceil(half)

                                                                                                      else

                                                                                                      add_to_score += mathfloor(half)

                                                                                                      if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                                                                                      voter_dict[candidate[rsquovaluersquo]] = 10

                                                                                                      elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                                                                                      voter_dict[candidate[rsquovaluersquo]] = -10

                                                                                                      else

                                                                                                      voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                                                                                      selfrankings_changed[voter_index] = []

                                                                                                      for candidate in voter_dict

                                                                                                      selfrankings_changed[voter_index]append((candidate voter_dict[

                                                                                                      candidate]))

                                                                                                      selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                                                                                      voter_index] key=lambda x x[1])

                                                                                                      75

                                                                                                      APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                                                                      Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                                                                      selfelecroundsappend(selfsorted_candidates[_round])

                                                                                                      if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                      N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                                                                      N_VACANCIES - 1)

                                                                                                      return 2

                                                                                                      elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                      N_VOTERS gt 05)

                                                                                                      return 1

                                                                                                      else

                                                                                                      selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                                                                      CANDIDATE_INDEX])

                                                                                                      for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                                                                      elecCANDIDATE_INDEX]]

                                                                                                      if voter_index in selfrankings_changed

                                                                                                      for candidate in reversed(selfrankings_changed[voter_index

                                                                                                      ])

                                                                                                      if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                      excluded

                                                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                      ]] += 1

                                                                                                      selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                      add(voter_index)

                                                                                                      break

                                                                                                      else

                                                                                                      continue

                                                                                                      else

                                                                                                      for candidate in reversed(selfelecsorted_voters[

                                                                                                      voter_index])

                                                                                                      if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                      excluded

                                                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                      ]] += 1

                                                                                                      selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                      add(voter_index)

                                                                                                      break

                                                                                                      else

                                                                                                      continue

                                                                                                      selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                      return 0

                                                                                                      76

                                                                                                      APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                                                                      Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                                                                      for index in range(selfelecN_CANDIDATES)

                                                                                                      selfcandidates[index] = 0

                                                                                                      for voter in selfelecsorted_voters

                                                                                                      for candidate in reversed(voter)

                                                                                                      if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                      else

                                                                                                      break

                                                                                                      APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                                                                      Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                                                                      for index in range(selfelecN_CANDIDATES)

                                                                                                      selfcandidates[index] = 0

                                                                                                      for voter in selfelecsorted_voters

                                                                                                      if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                      elecCANDIDATE_INDEX]]

                                                                                                      selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                                                                      else

                                                                                                      for candidate in reversed(voter)

                                                                                                      if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                      else

                                                                                                      break

                                                                                                      77

                                                                                                      APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                                                                      Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                                                                      pos = set()

                                                                                                      for index perc in enumerate(selfelectactical_vote_percentages)

                                                                                                      if perc gt 0

                                                                                                      posadd(index)

                                                                                                      for candidate in selfeleccandidates

                                                                                                      if candidate not in selfleading_candidates

                                                                                                      for voter_index in selfvotes[candidate]

                                                                                                      raised = None

                                                                                                      for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                                                                      ])

                                                                                                      if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                                                                      leading_candidates

                                                                                                      if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                                                                      if randomrandom() lt selfelectactical_vote_percentages[

                                                                                                      candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                                                                      ranking = [None]selfelecN_CANDIDATES

                                                                                                      ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                      selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                      CANDIDATE_INDEX]])

                                                                                                      raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                      break

                                                                                                      break

                                                                                                      break

                                                                                                      if raised = None

                                                                                                      for _candidate in selfleading_candidates

                                                                                                      if _candidate = ranking[-1][0]

                                                                                                      ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                      _candidate])

                                                                                                      buried = _candidate

                                                                                                      break

                                                                                                      i = 1

                                                                                                      for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                      if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                                                                      buried]

                                                                                                      continue

                                                                                                      else

                                                                                                      ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                      selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                      CANDIDATE_INDEX]])

                                                                                                      i += 1

                                                                                                      selfrankings_changed[voter_index] = ranking

                                                                                                      78

                                                                                                      APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                                                                      Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                                                                      for voter_index in selfvotes[candidate]

                                                                                                      if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                                                                      ]

                                                                                                      for _candidate in selfleading_candidates

                                                                                                      if _candidate = candidate

                                                                                                      ranking = [None]selfelecN_CANDIDATES

                                                                                                      ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                      _candidate])

                                                                                                      buried = _candidate

                                                                                                      break

                                                                                                      i = 1

                                                                                                      for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                      if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                                                                      continue

                                                                                                      else

                                                                                                      ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                      selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                      CANDIDATE_INDEX]])

                                                                                                      i += 1

                                                                                                      selfrankings_changed[voter_index] = ranking

                                                                                                      79

                                                                                                      APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                                                                      Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                                                                      for index in range(selfelecN_CANDIDATES)

                                                                                                      selfcandidates[index] = 0

                                                                                                      for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                      score = 0

                                                                                                      if voter_index in selfrankings_changed

                                                                                                      for candidate in selfrankings_changed[voter_index]

                                                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                      score += 1

                                                                                                      else

                                                                                                      for candidate in voter

                                                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                      score += 1

                                                                                                      APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                                                                      Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                                                                      for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                      if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                      elecCANDIDATE_INDEX]]

                                                                                                      selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                                                                      sorted_voters[voter_index])

                                                                                                      for candidate_index candidate in enumerate(reversed(voter))

                                                                                                      if candidate_index == 0

                                                                                                      selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                      voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                                                                      else

                                                                                                      selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                      voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                                                                      80

                                                                                                      APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                                                                      Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                                                                      for index in range(selfelecN_CANDIDATES)

                                                                                                      selfcandidates[index] = 0

                                                                                                      for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                      if voter_index in selfrankings_changed

                                                                                                      for candidate in selfrankings_changed[voter_index]

                                                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                      selfelecCANDIDATE_RANK]

                                                                                                      else

                                                                                                      for candidate in voter

                                                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                      selfelecCANDIDATE_RANK]

                                                                                                      APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                                                                      Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                                                                      for index in range(selfelecN_CANDIDATES)

                                                                                                      selfcandidates[index] = 0

                                                                                                      for voter in selfelecsorted_voters

                                                                                                      votes = selfelecN_VACANCIES

                                                                                                      for candidate in reversed(voter)

                                                                                                      if votes == 0

                                                                                                      break

                                                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                      votes -= 1

                                                                                                      • Folha de aprovaccedilatildeo
                                                                                                      • Agradecimentos
                                                                                                      • Epiacutegrafe
                                                                                                      • Resumo
                                                                                                      • Abstract
                                                                                                      • Lista de ilustraccedilotildees
                                                                                                      • Lista de Coacutedigos
                                                                                                      • Lista de tabelas
                                                                                                      • Lista de abreviaturas e siglas
                                                                                                      • Sumaacuterio
                                                                                                      • INTRODUCcedilAtildeO
                                                                                                        • MOTIVACcedilAtildeO E OBJETIVO
                                                                                                        • MEacuteTODO
                                                                                                        • ESTRUTURA
                                                                                                          • SISTEMAS ELEITORAIS
                                                                                                            • FISRT PAST THE POST
                                                                                                              • Exemplo
                                                                                                              • Vantagens e Desvantagens do FPTP
                                                                                                              • Voto Uacutetil no FPTP
                                                                                                                • TWO-ROUND SYSTEM
                                                                                                                  • Exemplo
                                                                                                                  • Vantagens e Desvantagens do TRS
                                                                                                                  • Voto Uacutetil no TRS
                                                                                                                    • INSTANT-RUNOFF VOTING
                                                                                                                      • Exemplo
                                                                                                                      • Vantagens e Desvantagens do IRV
                                                                                                                      • Voto Uacutetil no IRV
                                                                                                                        • APPROVAL VOTING SYSTEM
                                                                                                                          • Exemplo
                                                                                                                          • Vantagens e Desvantagens do AVS
                                                                                                                          • Voto Uacutetil no AVS
                                                                                                                            • THE BORDA COUNT
                                                                                                                              • Exemplo
                                                                                                                              • Vantagens e Desvantagens do BC
                                                                                                                              • Voto Uacutetil no BC
                                                                                                                                • SCORE VOTING SYSTEM
                                                                                                                                  • Exemplo
                                                                                                                                  • Vantagens e Desvantagens do SVS
                                                                                                                                  • Voto Uacutetil no SVS
                                                                                                                                    • BLOC VOTE
                                                                                                                                      • Exemplo
                                                                                                                                      • Voto Uacutetil no BV
                                                                                                                                          • O SIMULADOR
                                                                                                                                          • CENAacuteRIOS PERTINENTES
                                                                                                                                            • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                                                            • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                                                            • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                                                            • CENAacuteRIO 4 COALIZOtildeES
                                                                                                                                            • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                                                            • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                                                              • COMO FUNCIONA O SIMULADOR
                                                                                                                                                • CLASSE Elections
                                                                                                                                                • CLASSE FirstPastThePost
                                                                                                                                                • CLASSE TwoRoundSystem
                                                                                                                                                • CLASSE InstantRunoffVoting
                                                                                                                                                • CLASSE ApprovalVoting
                                                                                                                                                • CLASSE BordaCount
                                                                                                                                                • CLASSE ScoreVoting
                                                                                                                                                • CLASSE BlocVote
                                                                                                                                                • TECNOLOGIAS UTILIZADAS
                                                                                                                                                  • CONCLUSAtildeO
                                                                                                                                                  • Referecircncias
                                                                                                                                                  • Meacutetodo create_voters
                                                                                                                                                  • Meacutetodo create_candidates
                                                                                                                                                  • Meacutetodo calculate_means
                                                                                                                                                  • Meacutetodo get_mean
                                                                                                                                                  • Meacutetodo calculate_mean
                                                                                                                                                  • Meacutetodo set_leading_candidates
                                                                                                                                                  • Meacutetodo irv_set_leading_candidates
                                                                                                                                                  • Meacutetodo sort_ranks
                                                                                                                                                  • Meacutetodo fptp_count_tactical_votes
                                                                                                                                                  • Meacutetodo fptp_count_minority_votes
                                                                                                                                                  • Meacutetodo trs_second_round
                                                                                                                                                  • Meacutetodo trs_account_for_coalitions
                                                                                                                                                  • Meacutetodo irv_count_votes
                                                                                                                                                  • Meacutetodo avs_count_votes
                                                                                                                                                  • Meacutetodo avs_count_votes_with_tactical
                                                                                                                                                  • Meacutetodo irv_apply_tactical_votes
                                                                                                                                                  • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                                                                  • Meacutetodo bc_sum_candidates_scores
                                                                                                                                                  • Meacutetodo svs_apply_tactical_votes
                                                                                                                                                  • Meacutetodo svs_sum_candidates_scores
                                                                                                                                                  • Meacutetodo bv_count_votes

                                                                                                        52

                                                                                                        Figura 43 ndash BV - Cenaacuterio 6

                                                                                                        Tabela 18 ndash Resultados do Cenaacuterio 6

                                                                                                        Sistema Candidatoseleitos

                                                                                                        Meacutedia dasnotas

                                                                                                        FPTP sem voto de minoriaAna eBeto 2929

                                                                                                        FPTP com 100 de voto de minoria no candidato 3Ana eDiego 0505

                                                                                                        FPTP com 80 de voto de minoriaBeto eCarla 0058

                                                                                                        Bloc VoteAna eCarla 2913

                                                                                                        Esses resultados podem ser replicados acessando os links

                                                                                                        Sem voto de minoria lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]------100gt

                                                                                                        100 voto de minoria para Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[00010]--100gt

                                                                                                        80 voto de minoria em Beto Carla e Diego lthttpelectionsimpythonanywherecomdirect_res1000001-2[4002][22Ana222022Beto222022Carla2222Diego22]-1-[0080808]--100gt

                                                                                                        53

                                                                                                        5 COMO FUNCIONA O SIMULADOR

                                                                                                        O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

                                                                                                        51 CLASSE ELECTIONS

                                                                                                        Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

                                                                                                        bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

                                                                                                        Figura 44 ndash estrutura candidates

                                                                                                        bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

                                                                                                        bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

                                                                                                        Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

                                                                                                        Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

                                                                                                        54

                                                                                                        Figura 45 ndash estrutura voters

                                                                                                        Figura 46 ndash estrutura votes

                                                                                                        daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

                                                                                                        Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

                                                                                                        55

                                                                                                        Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

                                                                                                        Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

                                                                                                        na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

                                                                                                        56

                                                                                                        Figura 49 ndash PDF - Distribuiccedilatildeo Liked

                                                                                                        Figura 50 ndash CDF - Distribuiccedilatildeo Liked

                                                                                                        (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

                                                                                                        Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

                                                                                                        57

                                                                                                        Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

                                                                                                        Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

                                                                                                        candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

                                                                                                        Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

                                                                                                        58

                                                                                                        Figura 53 ndash PDF - Distribuiccedilatildeo Loved

                                                                                                        Figura 54 ndash CDF - Distribuiccedilatildeo Loved

                                                                                                        funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

                                                                                                        59

                                                                                                        Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                                                                                                        Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                                                                                                        Meacutedia das Notas sumei

                                                                                                        sumvj nij

                                                                                                        etimes v

                                                                                                        Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                                                                                                        Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                                                                                                        60

                                                                                                        Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                                                                                                        Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                                                                                                        52 CLASSE FIRSTPASTTHEPOST

                                                                                                        Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                                                                                                        Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                                                                                                        61

                                                                                                        Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                                                                                                        Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                                                                                                        mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                                                                                                        62

                                                                                                        53 CLASSE TWOROUNDSYSTEM

                                                                                                        A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                                                                                                        54 CLASSE INSTANTRUNOFFVOTING

                                                                                                        A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                                                                                                        Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                                                                                                        63

                                                                                                        cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                                                                                                        55 CLASSE APPROVALVOTING

                                                                                                        Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                                                                                                        56 CLASSE BORDACOUNT

                                                                                                        Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                                                                                                        57 CLASSE SCOREVOTING

                                                                                                        De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                                                                                                        64

                                                                                                        58 CLASSE BLOCVOTE

                                                                                                        O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                                                                                                        59 TECNOLOGIAS UTILIZADAS

                                                                                                        A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                                                                                                        Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                                                                                                        O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                                                                                                        Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                                                                                                        65

                                                                                                        6 CONCLUSAtildeO

                                                                                                        Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                                                                                                        Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                                                                                                        Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                                                                                                        Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                                                                                                        Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                                                                                                        66

                                                                                                        REFEREcircNCIAS

                                                                                                        AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                                                                                                        Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                                                                                                        Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                                                                                                        Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                                                                                                        HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                                                                                                        LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                                                                                                        ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                                                                                                        Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                                                                                                        POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                                                                                                        The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                                                                                                        67

                                                                                                        APEcircNDICES

                                                                                                        APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                                                                                        Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                                                                                        if(not len(selfvoter_profiles))

                                                                                                        for voter in range(selfN_VOTERS)

                                                                                                        candidates_rank = dict()

                                                                                                        for candidate in reversed(range(selfN_CANDIDATES))

                                                                                                        if(selfBIAS_VECTOR[candidate]==4)

                                                                                                        candidates_rank[candidate] = self_sortear(selfloved)

                                                                                                        elif(selfBIAS_VECTOR[candidate]==3)

                                                                                                        candidates_rank[candidate] = self_sortear(selfliked)

                                                                                                        elif(selfBIAS_VECTOR[candidate]==2)

                                                                                                        candidates_rank[candidate] = self_sortear(selfdisliked)

                                                                                                        elif(selfBIAS_VECTOR[candidate]==1)

                                                                                                        candidates_rank[candidate] = self_sortear(selfhated)

                                                                                                        elif(selfBIAS_VECTOR[candidate]==-1)

                                                                                                        candidates_rank[candidate] = self_sortear(selfpolarizer

                                                                                                        )

                                                                                                        elif(selfBIAS_VECTOR[candidate]==-2)

                                                                                                        candidates_rank[candidate] = self_sortear(self

                                                                                                        more_polarizer)

                                                                                                        else

                                                                                                        candidates_rank[candidate] = self_sortear(selfneutral)

                                                                                                        selfvotersappend(candidates_rank)

                                                                                                        else

                                                                                                        ranges = []

                                                                                                        ranks = []

                                                                                                        for prof in selfvoter_profiles

                                                                                                        rangesappend(int(prof[pop_percentage]))

                                                                                                        rank =

                                                                                                        for index score in enumerate(prof[scores])

                                                                                                        rank[index] = score

                                                                                                        ranksappend(rank)

                                                                                                        for index _range in enumerate(ranges)

                                                                                                        for _ in range(int(selfN_VOTERS(_range100)))

                                                                                                        selfvotersappend(ranks[index])

                                                                                                        68

                                                                                                        APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                                                                                        Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                                                                                        for i in range(selfN_CANDIDATES)

                                                                                                        selfcandidates[i] = 0

                                                                                                        selfvotes[i] = set()

                                                                                                        APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                                                                                        Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                                                                                        for candidate in range(selfN_CANDIDATES)

                                                                                                        rating_sum = 0

                                                                                                        for voter in selfvoters

                                                                                                        rating_sum += voter[candidate]

                                                                                                        selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                                                                                        APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                                                                                        Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                                                                                        if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                                                                                        return selfcalculate_mean(winners)

                                                                                                        else

                                                                                                        chose_best = True if winners[0] == selfbest_candidate else

                                                                                                        False

                                                                                                        return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                                                                                        69

                                                                                                        APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                                                                                        Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                                                                                        rating_sum = 0

                                                                                                        for voter in selfvoters

                                                                                                        for candidate in winners

                                                                                                        rating_sum += voter[candidate]

                                                                                                        return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                                                                                        APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                                                                                        Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                                                                                        for i in range(1 selfN_VACANCIES + 2)

                                                                                                        selfleading_candidatesappend(selfsorted_candidates[-i][self

                                                                                                        CANDIDATE_INDEX])

                                                                                                        APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                                                                                        Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                                                                                        for leader in selfelecrounds[-1]

                                                                                                        selfleading_candidatesappend(leader[0])

                                                                                                        70

                                                                                                        APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                                                                                        Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                                                                                        self_account_for_coalitions()

                                                                                                        for voter in selfvoters

                                                                                                        selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                                                                                        (1)))

                                                                                                        temp = []

                                                                                                        for voter in selfsorted_voters

                                                                                                        new_dict = defaultdict(list)

                                                                                                        for k in voter

                                                                                                        new_dict[k[1]]append(k[0])

                                                                                                        tempappend(new_dict)

                                                                                                        selfsorted_voters = []

                                                                                                        for voter_index current_voter in enumerate(temp)

                                                                                                        new_voter = []

                                                                                                        for rating candidate_indexes in current_voteritems()

                                                                                                        if len(current_voter[rating]) gt 1

                                                                                                        shuffle(current_voter[rating])

                                                                                                        for e in candidate_indexes

                                                                                                        new_voterappend((e rating))

                                                                                                        else

                                                                                                        new_voterappend((candidate_indexes[0] rating))

                                                                                                        selfsorted_votersappend(new_voter)

                                                                                                        selfcandidates[new_voter[-1][0]] += 1

                                                                                                        selfvotes[new_voter[-1][0]]add(voter_index)

                                                                                                        71

                                                                                                        APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                                                                                        Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                                                                                        for candidate in selfvotes_copy

                                                                                                        if candidate not in selfelecleading_candidates

                                                                                                        for voter_index in selfvotes_copy[candidate]

                                                                                                        for index _candidate in enumerate(reversed(selfelec

                                                                                                        sorted_voters[voter_index]))

                                                                                                        if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                                                                                        leading_candidates

                                                                                                        if randomrandom() lt selfelec

                                                                                                        tactical_vote_percentages[_candidate[selfelec

                                                                                                        CANDIDATE_INDEX]]

                                                                                                        selfrankings_changed[voter_index] = copy

                                                                                                        deepcopy(selfelecsorted_voters[voter_index])

                                                                                                        selfrankings_changed[voter_index][-(index + 1)]

                                                                                                        selfrankings_changed[voter_index][-1] = self

                                                                                                        rankings_changed[voter_index][-1] self

                                                                                                        rankings_changed[voter_index][-(index + 1)]

                                                                                                        selfcandidates[candidate] -= 1

                                                                                                        selfcandidates[_candidate[selfelec

                                                                                                        CANDIDATE_INDEX]] += 1

                                                                                                        selfvotes[candidate]remove(voter_index)

                                                                                                        selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                                                                                        ]]add(voter_index)

                                                                                                        break

                                                                                                        break

                                                                                                        72

                                                                                                        APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                                                                                        Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                                                                                        half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                                                                                        for candidate in selfelecleading_candidates

                                                                                                        if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                                                                                        continue

                                                                                                        for voter_index in selfvotes_copy[candidate]

                                                                                                        if voter_index in selfrankings_changed

                                                                                                        ranking = selfrankings_changed[voter_index]

                                                                                                        else

                                                                                                        ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                                                                                        ])

                                                                                                        for index _candidate in enumerate(reversed(ranking))

                                                                                                        if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                        leading_candidates or (_candidate[selfelec

                                                                                                        CANDIDATE_INDEX] in selfelecleading_candidates and

                                                                                                        selfelecleading_candidatesindex(_candidate[selfelec

                                                                                                        CANDIDATE_INDEX]) gt= half_vacancies)

                                                                                                        if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                                                                                        if randomrandom() lt selfelec

                                                                                                        minority_vote_percentages[_candidate[selfelec

                                                                                                        CANDIDATE_INDEX]]

                                                                                                        selfcandidates[candidate] -= 1

                                                                                                        selfcandidates[_candidate[selfelec

                                                                                                        CANDIDATE_INDEX]] += 1

                                                                                                        break

                                                                                                        break

                                                                                                        break

                                                                                                        73

                                                                                                        APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                                                                                        Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                                                                                        self_account_for_coalitions()

                                                                                                        for candidate in selfvotes

                                                                                                        if candidate = selfwinner and candidate = selfsecond_place

                                                                                                        for voter_index in selfvotes[candidate]

                                                                                                        if voter_index in selfrankings_changed

                                                                                                        ranking = selfrankings_changed[voter_index]

                                                                                                        else

                                                                                                        ranking = copydeepcopy(selfelecsorted_voters[

                                                                                                        voter_index])

                                                                                                        for index2 candidate in enumerate(reversed(ranking))

                                                                                                        if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                                                                                        selfcandidates[selfwinner] += 1

                                                                                                        selfvotes[selfwinner]add(voter_index)

                                                                                                        break

                                                                                                        elif candidate[selfelecCANDIDATE_INDEX] == self

                                                                                                        second_place

                                                                                                        selfcandidates[selfsecond_place] += 1

                                                                                                        selfvotes[selfsecond_place]add(voter_index)

                                                                                                        break

                                                                                                        selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                        winners = []

                                                                                                        vacancies = selfelecN_VACANCIES

                                                                                                        for candidate in reversed(selfsorted_candidates)

                                                                                                        if vacancies == 0

                                                                                                        break

                                                                                                        winnersappend(candidate[0])

                                                                                                        vacancies -= 1

                                                                                                        mean chose_best = selfelecget_mean(winners = winners)

                                                                                                        74

                                                                                                        APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                                                                                        Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                                                                                        for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                        voter_dict = dict()

                                                                                                        og_voter_dict = dict()

                                                                                                        for tup in voter

                                                                                                        voter_dict[tup[0]] = tup[1]

                                                                                                        og_voter_dict[tup[0]] = tup[1]

                                                                                                        for coalition in selfeleccoalitions

                                                                                                        for candidate in coalition

                                                                                                        add_to_score = 0

                                                                                                        for candidate2 in coalition

                                                                                                        if candidate == candidate2

                                                                                                        continue

                                                                                                        half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                                                                                        if half lt 0

                                                                                                        add_to_score += mathceil(half)

                                                                                                        else

                                                                                                        add_to_score += mathfloor(half)

                                                                                                        if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                                                                                        voter_dict[candidate[rsquovaluersquo]] = 10

                                                                                                        elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                                                                                        voter_dict[candidate[rsquovaluersquo]] = -10

                                                                                                        else

                                                                                                        voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                                                                                        selfrankings_changed[voter_index] = []

                                                                                                        for candidate in voter_dict

                                                                                                        selfrankings_changed[voter_index]append((candidate voter_dict[

                                                                                                        candidate]))

                                                                                                        selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                                                                                        voter_index] key=lambda x x[1])

                                                                                                        75

                                                                                                        APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                                                                        Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                                                                        selfelecroundsappend(selfsorted_candidates[_round])

                                                                                                        if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                        N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                                                                        N_VACANCIES - 1)

                                                                                                        return 2

                                                                                                        elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                        N_VOTERS gt 05)

                                                                                                        return 1

                                                                                                        else

                                                                                                        selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                                                                        CANDIDATE_INDEX])

                                                                                                        for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                                                                        elecCANDIDATE_INDEX]]

                                                                                                        if voter_index in selfrankings_changed

                                                                                                        for candidate in reversed(selfrankings_changed[voter_index

                                                                                                        ])

                                                                                                        if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                        excluded

                                                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                        ]] += 1

                                                                                                        selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                        add(voter_index)

                                                                                                        break

                                                                                                        else

                                                                                                        continue

                                                                                                        else

                                                                                                        for candidate in reversed(selfelecsorted_voters[

                                                                                                        voter_index])

                                                                                                        if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                        excluded

                                                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                        ]] += 1

                                                                                                        selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                        add(voter_index)

                                                                                                        break

                                                                                                        else

                                                                                                        continue

                                                                                                        selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                        return 0

                                                                                                        76

                                                                                                        APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                                                                        Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                                                                        for index in range(selfelecN_CANDIDATES)

                                                                                                        selfcandidates[index] = 0

                                                                                                        for voter in selfelecsorted_voters

                                                                                                        for candidate in reversed(voter)

                                                                                                        if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                        else

                                                                                                        break

                                                                                                        APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                                                                        Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                                                                        for index in range(selfelecN_CANDIDATES)

                                                                                                        selfcandidates[index] = 0

                                                                                                        for voter in selfelecsorted_voters

                                                                                                        if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                        elecCANDIDATE_INDEX]]

                                                                                                        selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                                                                        else

                                                                                                        for candidate in reversed(voter)

                                                                                                        if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                        else

                                                                                                        break

                                                                                                        77

                                                                                                        APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                                                                        Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                                                                        pos = set()

                                                                                                        for index perc in enumerate(selfelectactical_vote_percentages)

                                                                                                        if perc gt 0

                                                                                                        posadd(index)

                                                                                                        for candidate in selfeleccandidates

                                                                                                        if candidate not in selfleading_candidates

                                                                                                        for voter_index in selfvotes[candidate]

                                                                                                        raised = None

                                                                                                        for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                                                                        ])

                                                                                                        if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                                                                        leading_candidates

                                                                                                        if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                                                                        if randomrandom() lt selfelectactical_vote_percentages[

                                                                                                        candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                                                                        ranking = [None]selfelecN_CANDIDATES

                                                                                                        ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                        selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                        CANDIDATE_INDEX]])

                                                                                                        raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                        break

                                                                                                        break

                                                                                                        break

                                                                                                        if raised = None

                                                                                                        for _candidate in selfleading_candidates

                                                                                                        if _candidate = ranking[-1][0]

                                                                                                        ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                        _candidate])

                                                                                                        buried = _candidate

                                                                                                        break

                                                                                                        i = 1

                                                                                                        for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                        if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                                                                        buried]

                                                                                                        continue

                                                                                                        else

                                                                                                        ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                        selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                        CANDIDATE_INDEX]])

                                                                                                        i += 1

                                                                                                        selfrankings_changed[voter_index] = ranking

                                                                                                        78

                                                                                                        APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                                                                        Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                                                                        for voter_index in selfvotes[candidate]

                                                                                                        if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                                                                        ]

                                                                                                        for _candidate in selfleading_candidates

                                                                                                        if _candidate = candidate

                                                                                                        ranking = [None]selfelecN_CANDIDATES

                                                                                                        ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                        _candidate])

                                                                                                        buried = _candidate

                                                                                                        break

                                                                                                        i = 1

                                                                                                        for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                        if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                                                                        continue

                                                                                                        else

                                                                                                        ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                        selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                        CANDIDATE_INDEX]])

                                                                                                        i += 1

                                                                                                        selfrankings_changed[voter_index] = ranking

                                                                                                        79

                                                                                                        APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                                                                        Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                                                                        for index in range(selfelecN_CANDIDATES)

                                                                                                        selfcandidates[index] = 0

                                                                                                        for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                        score = 0

                                                                                                        if voter_index in selfrankings_changed

                                                                                                        for candidate in selfrankings_changed[voter_index]

                                                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                        score += 1

                                                                                                        else

                                                                                                        for candidate in voter

                                                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                        score += 1

                                                                                                        APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                                                                        Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                                                                        for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                        if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                        elecCANDIDATE_INDEX]]

                                                                                                        selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                                                                        sorted_voters[voter_index])

                                                                                                        for candidate_index candidate in enumerate(reversed(voter))

                                                                                                        if candidate_index == 0

                                                                                                        selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                        voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                                                                        else

                                                                                                        selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                        voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                                                                        80

                                                                                                        APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                                                                        Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                                                                        for index in range(selfelecN_CANDIDATES)

                                                                                                        selfcandidates[index] = 0

                                                                                                        for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                        if voter_index in selfrankings_changed

                                                                                                        for candidate in selfrankings_changed[voter_index]

                                                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                        selfelecCANDIDATE_RANK]

                                                                                                        else

                                                                                                        for candidate in voter

                                                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                        selfelecCANDIDATE_RANK]

                                                                                                        APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                                                                        Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                                                                        for index in range(selfelecN_CANDIDATES)

                                                                                                        selfcandidates[index] = 0

                                                                                                        for voter in selfelecsorted_voters

                                                                                                        votes = selfelecN_VACANCIES

                                                                                                        for candidate in reversed(voter)

                                                                                                        if votes == 0

                                                                                                        break

                                                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                        votes -= 1

                                                                                                        • Folha de aprovaccedilatildeo
                                                                                                        • Agradecimentos
                                                                                                        • Epiacutegrafe
                                                                                                        • Resumo
                                                                                                        • Abstract
                                                                                                        • Lista de ilustraccedilotildees
                                                                                                        • Lista de Coacutedigos
                                                                                                        • Lista de tabelas
                                                                                                        • Lista de abreviaturas e siglas
                                                                                                        • Sumaacuterio
                                                                                                        • INTRODUCcedilAtildeO
                                                                                                          • MOTIVACcedilAtildeO E OBJETIVO
                                                                                                          • MEacuteTODO
                                                                                                          • ESTRUTURA
                                                                                                            • SISTEMAS ELEITORAIS
                                                                                                              • FISRT PAST THE POST
                                                                                                                • Exemplo
                                                                                                                • Vantagens e Desvantagens do FPTP
                                                                                                                • Voto Uacutetil no FPTP
                                                                                                                  • TWO-ROUND SYSTEM
                                                                                                                    • Exemplo
                                                                                                                    • Vantagens e Desvantagens do TRS
                                                                                                                    • Voto Uacutetil no TRS
                                                                                                                      • INSTANT-RUNOFF VOTING
                                                                                                                        • Exemplo
                                                                                                                        • Vantagens e Desvantagens do IRV
                                                                                                                        • Voto Uacutetil no IRV
                                                                                                                          • APPROVAL VOTING SYSTEM
                                                                                                                            • Exemplo
                                                                                                                            • Vantagens e Desvantagens do AVS
                                                                                                                            • Voto Uacutetil no AVS
                                                                                                                              • THE BORDA COUNT
                                                                                                                                • Exemplo
                                                                                                                                • Vantagens e Desvantagens do BC
                                                                                                                                • Voto Uacutetil no BC
                                                                                                                                  • SCORE VOTING SYSTEM
                                                                                                                                    • Exemplo
                                                                                                                                    • Vantagens e Desvantagens do SVS
                                                                                                                                    • Voto Uacutetil no SVS
                                                                                                                                      • BLOC VOTE
                                                                                                                                        • Exemplo
                                                                                                                                        • Voto Uacutetil no BV
                                                                                                                                            • O SIMULADOR
                                                                                                                                            • CENAacuteRIOS PERTINENTES
                                                                                                                                              • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                                                              • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                                                              • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                                                              • CENAacuteRIO 4 COALIZOtildeES
                                                                                                                                              • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                                                              • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                                                                • COMO FUNCIONA O SIMULADOR
                                                                                                                                                  • CLASSE Elections
                                                                                                                                                  • CLASSE FirstPastThePost
                                                                                                                                                  • CLASSE TwoRoundSystem
                                                                                                                                                  • CLASSE InstantRunoffVoting
                                                                                                                                                  • CLASSE ApprovalVoting
                                                                                                                                                  • CLASSE BordaCount
                                                                                                                                                  • CLASSE ScoreVoting
                                                                                                                                                  • CLASSE BlocVote
                                                                                                                                                  • TECNOLOGIAS UTILIZADAS
                                                                                                                                                    • CONCLUSAtildeO
                                                                                                                                                    • Referecircncias
                                                                                                                                                    • Meacutetodo create_voters
                                                                                                                                                    • Meacutetodo create_candidates
                                                                                                                                                    • Meacutetodo calculate_means
                                                                                                                                                    • Meacutetodo get_mean
                                                                                                                                                    • Meacutetodo calculate_mean
                                                                                                                                                    • Meacutetodo set_leading_candidates
                                                                                                                                                    • Meacutetodo irv_set_leading_candidates
                                                                                                                                                    • Meacutetodo sort_ranks
                                                                                                                                                    • Meacutetodo fptp_count_tactical_votes
                                                                                                                                                    • Meacutetodo fptp_count_minority_votes
                                                                                                                                                    • Meacutetodo trs_second_round
                                                                                                                                                    • Meacutetodo trs_account_for_coalitions
                                                                                                                                                    • Meacutetodo irv_count_votes
                                                                                                                                                    • Meacutetodo avs_count_votes
                                                                                                                                                    • Meacutetodo avs_count_votes_with_tactical
                                                                                                                                                    • Meacutetodo irv_apply_tactical_votes
                                                                                                                                                    • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                                                                    • Meacutetodo bc_sum_candidates_scores
                                                                                                                                                    • Meacutetodo svs_apply_tactical_votes
                                                                                                                                                    • Meacutetodo svs_sum_candidates_scores
                                                                                                                                                    • Meacutetodo bv_count_votes

                                                                                                          53

                                                                                                          5 COMO FUNCIONA O SIMULADOR

                                                                                                          O programa foi implementado na linguagem Python e eacute composto por oito classes dis-tintas sendo uma classe base e outras sete (uma para cada sistema eleitoral implementado)que estendem a classe base

                                                                                                          51 CLASSE ELECTIONS

                                                                                                          Esta classe funciona como base para todas as outras Ela conteacutem todas as estrutu-ras requisitadas e acessadas pela simulaccedilatildeo de cada sistema eleitoral Suas principaisestruturas satildeo

                                                                                                          bull candidates Dicionaacuterio composto por chave igual ao iacutendice de cada candidato evalor igual ao nuacutemero de votos recebidos por esse candidato

                                                                                                          Figura 44 ndash estrutura candidates

                                                                                                          bull voters Lista de dicionaacuterios Cada dicionaacuterio representa um eleitor e eacute compostopor chave igual ao iacutendice de cada candidato e valor igual agrave nota (-10 a 10) que oeleitor atribui agravequele candidato

                                                                                                          bull votes Dicionaacuterio composto por chave igual ao iacutendice de cada candidato e valorigual a um set contendo todos os iacutendices dos eleitores que votaram nesse candidato

                                                                                                          Tais estruturas guardam as informaccedilotildees de todos os candidatos e eleitores gera-dos Dois dos paracircmetros recebidos pelo construtor da classe Elections eacute o nuacute-mero de candidatos e o nuacutemero de eleitores a serem criados respectivamente pelos meacuteto-dos create_candidates (apecircndice B) e create_voters (apecircndice A) O meacutetodocreate_candidates simplesmente inicializa cada iacutendice das estruturas candidatese votes

                                                                                                          Eleitores podem ser gerados aleatoacuteria ou deterministicamente dependendo da intenccedilatildeode uso do simulador Eacute possiacutevel gerar eleitores aleatoriamente onde a nota que esse eleitor

                                                                                                          54

                                                                                                          Figura 45 ndash estrutura voters

                                                                                                          Figura 46 ndash estrutura votes

                                                                                                          daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

                                                                                                          Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

                                                                                                          55

                                                                                                          Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

                                                                                                          Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

                                                                                                          na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

                                                                                                          56

                                                                                                          Figura 49 ndash PDF - Distribuiccedilatildeo Liked

                                                                                                          Figura 50 ndash CDF - Distribuiccedilatildeo Liked

                                                                                                          (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

                                                                                                          Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

                                                                                                          57

                                                                                                          Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

                                                                                                          Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

                                                                                                          candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

                                                                                                          Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

                                                                                                          58

                                                                                                          Figura 53 ndash PDF - Distribuiccedilatildeo Loved

                                                                                                          Figura 54 ndash CDF - Distribuiccedilatildeo Loved

                                                                                                          funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

                                                                                                          59

                                                                                                          Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                                                                                                          Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                                                                                                          Meacutedia das Notas sumei

                                                                                                          sumvj nij

                                                                                                          etimes v

                                                                                                          Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                                                                                                          Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                                                                                                          60

                                                                                                          Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                                                                                                          Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                                                                                                          52 CLASSE FIRSTPASTTHEPOST

                                                                                                          Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                                                                                                          Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                                                                                                          61

                                                                                                          Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                                                                                                          Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                                                                                                          mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                                                                                                          62

                                                                                                          53 CLASSE TWOROUNDSYSTEM

                                                                                                          A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                                                                                                          54 CLASSE INSTANTRUNOFFVOTING

                                                                                                          A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                                                                                                          Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                                                                                                          63

                                                                                                          cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                                                                                                          55 CLASSE APPROVALVOTING

                                                                                                          Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                                                                                                          56 CLASSE BORDACOUNT

                                                                                                          Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                                                                                                          57 CLASSE SCOREVOTING

                                                                                                          De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                                                                                                          64

                                                                                                          58 CLASSE BLOCVOTE

                                                                                                          O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                                                                                                          59 TECNOLOGIAS UTILIZADAS

                                                                                                          A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                                                                                                          Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                                                                                                          O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                                                                                                          Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                                                                                                          65

                                                                                                          6 CONCLUSAtildeO

                                                                                                          Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                                                                                                          Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                                                                                                          Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                                                                                                          Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                                                                                                          Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                                                                                                          66

                                                                                                          REFEREcircNCIAS

                                                                                                          AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                                                                                                          Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                                                                                                          Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                                                                                                          Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                                                                                                          HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                                                                                                          LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                                                                                                          ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                                                                                                          Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                                                                                                          POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                                                                                                          The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                                                                                                          67

                                                                                                          APEcircNDICES

                                                                                                          APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                                                                                          Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                                                                                          if(not len(selfvoter_profiles))

                                                                                                          for voter in range(selfN_VOTERS)

                                                                                                          candidates_rank = dict()

                                                                                                          for candidate in reversed(range(selfN_CANDIDATES))

                                                                                                          if(selfBIAS_VECTOR[candidate]==4)

                                                                                                          candidates_rank[candidate] = self_sortear(selfloved)

                                                                                                          elif(selfBIAS_VECTOR[candidate]==3)

                                                                                                          candidates_rank[candidate] = self_sortear(selfliked)

                                                                                                          elif(selfBIAS_VECTOR[candidate]==2)

                                                                                                          candidates_rank[candidate] = self_sortear(selfdisliked)

                                                                                                          elif(selfBIAS_VECTOR[candidate]==1)

                                                                                                          candidates_rank[candidate] = self_sortear(selfhated)

                                                                                                          elif(selfBIAS_VECTOR[candidate]==-1)

                                                                                                          candidates_rank[candidate] = self_sortear(selfpolarizer

                                                                                                          )

                                                                                                          elif(selfBIAS_VECTOR[candidate]==-2)

                                                                                                          candidates_rank[candidate] = self_sortear(self

                                                                                                          more_polarizer)

                                                                                                          else

                                                                                                          candidates_rank[candidate] = self_sortear(selfneutral)

                                                                                                          selfvotersappend(candidates_rank)

                                                                                                          else

                                                                                                          ranges = []

                                                                                                          ranks = []

                                                                                                          for prof in selfvoter_profiles

                                                                                                          rangesappend(int(prof[pop_percentage]))

                                                                                                          rank =

                                                                                                          for index score in enumerate(prof[scores])

                                                                                                          rank[index] = score

                                                                                                          ranksappend(rank)

                                                                                                          for index _range in enumerate(ranges)

                                                                                                          for _ in range(int(selfN_VOTERS(_range100)))

                                                                                                          selfvotersappend(ranks[index])

                                                                                                          68

                                                                                                          APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                                                                                          Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                                                                                          for i in range(selfN_CANDIDATES)

                                                                                                          selfcandidates[i] = 0

                                                                                                          selfvotes[i] = set()

                                                                                                          APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                                                                                          Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                                                                                          for candidate in range(selfN_CANDIDATES)

                                                                                                          rating_sum = 0

                                                                                                          for voter in selfvoters

                                                                                                          rating_sum += voter[candidate]

                                                                                                          selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                                                                                          APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                                                                                          Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                                                                                          if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                                                                                          return selfcalculate_mean(winners)

                                                                                                          else

                                                                                                          chose_best = True if winners[0] == selfbest_candidate else

                                                                                                          False

                                                                                                          return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                                                                                          69

                                                                                                          APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                                                                                          Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                                                                                          rating_sum = 0

                                                                                                          for voter in selfvoters

                                                                                                          for candidate in winners

                                                                                                          rating_sum += voter[candidate]

                                                                                                          return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                                                                                          APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                                                                                          Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                                                                                          for i in range(1 selfN_VACANCIES + 2)

                                                                                                          selfleading_candidatesappend(selfsorted_candidates[-i][self

                                                                                                          CANDIDATE_INDEX])

                                                                                                          APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                                                                                          Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                                                                                          for leader in selfelecrounds[-1]

                                                                                                          selfleading_candidatesappend(leader[0])

                                                                                                          70

                                                                                                          APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                                                                                          Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                                                                                          self_account_for_coalitions()

                                                                                                          for voter in selfvoters

                                                                                                          selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                                                                                          (1)))

                                                                                                          temp = []

                                                                                                          for voter in selfsorted_voters

                                                                                                          new_dict = defaultdict(list)

                                                                                                          for k in voter

                                                                                                          new_dict[k[1]]append(k[0])

                                                                                                          tempappend(new_dict)

                                                                                                          selfsorted_voters = []

                                                                                                          for voter_index current_voter in enumerate(temp)

                                                                                                          new_voter = []

                                                                                                          for rating candidate_indexes in current_voteritems()

                                                                                                          if len(current_voter[rating]) gt 1

                                                                                                          shuffle(current_voter[rating])

                                                                                                          for e in candidate_indexes

                                                                                                          new_voterappend((e rating))

                                                                                                          else

                                                                                                          new_voterappend((candidate_indexes[0] rating))

                                                                                                          selfsorted_votersappend(new_voter)

                                                                                                          selfcandidates[new_voter[-1][0]] += 1

                                                                                                          selfvotes[new_voter[-1][0]]add(voter_index)

                                                                                                          71

                                                                                                          APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                                                                                          Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                                                                                          for candidate in selfvotes_copy

                                                                                                          if candidate not in selfelecleading_candidates

                                                                                                          for voter_index in selfvotes_copy[candidate]

                                                                                                          for index _candidate in enumerate(reversed(selfelec

                                                                                                          sorted_voters[voter_index]))

                                                                                                          if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                                                                                          leading_candidates

                                                                                                          if randomrandom() lt selfelec

                                                                                                          tactical_vote_percentages[_candidate[selfelec

                                                                                                          CANDIDATE_INDEX]]

                                                                                                          selfrankings_changed[voter_index] = copy

                                                                                                          deepcopy(selfelecsorted_voters[voter_index])

                                                                                                          selfrankings_changed[voter_index][-(index + 1)]

                                                                                                          selfrankings_changed[voter_index][-1] = self

                                                                                                          rankings_changed[voter_index][-1] self

                                                                                                          rankings_changed[voter_index][-(index + 1)]

                                                                                                          selfcandidates[candidate] -= 1

                                                                                                          selfcandidates[_candidate[selfelec

                                                                                                          CANDIDATE_INDEX]] += 1

                                                                                                          selfvotes[candidate]remove(voter_index)

                                                                                                          selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                                                                                          ]]add(voter_index)

                                                                                                          break

                                                                                                          break

                                                                                                          72

                                                                                                          APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                                                                                          Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                                                                                          half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                                                                                          for candidate in selfelecleading_candidates

                                                                                                          if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                                                                                          continue

                                                                                                          for voter_index in selfvotes_copy[candidate]

                                                                                                          if voter_index in selfrankings_changed

                                                                                                          ranking = selfrankings_changed[voter_index]

                                                                                                          else

                                                                                                          ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                                                                                          ])

                                                                                                          for index _candidate in enumerate(reversed(ranking))

                                                                                                          if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                          leading_candidates or (_candidate[selfelec

                                                                                                          CANDIDATE_INDEX] in selfelecleading_candidates and

                                                                                                          selfelecleading_candidatesindex(_candidate[selfelec

                                                                                                          CANDIDATE_INDEX]) gt= half_vacancies)

                                                                                                          if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                                                                                          if randomrandom() lt selfelec

                                                                                                          minority_vote_percentages[_candidate[selfelec

                                                                                                          CANDIDATE_INDEX]]

                                                                                                          selfcandidates[candidate] -= 1

                                                                                                          selfcandidates[_candidate[selfelec

                                                                                                          CANDIDATE_INDEX]] += 1

                                                                                                          break

                                                                                                          break

                                                                                                          break

                                                                                                          73

                                                                                                          APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                                                                                          Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                                                                                          self_account_for_coalitions()

                                                                                                          for candidate in selfvotes

                                                                                                          if candidate = selfwinner and candidate = selfsecond_place

                                                                                                          for voter_index in selfvotes[candidate]

                                                                                                          if voter_index in selfrankings_changed

                                                                                                          ranking = selfrankings_changed[voter_index]

                                                                                                          else

                                                                                                          ranking = copydeepcopy(selfelecsorted_voters[

                                                                                                          voter_index])

                                                                                                          for index2 candidate in enumerate(reversed(ranking))

                                                                                                          if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                                                                                          selfcandidates[selfwinner] += 1

                                                                                                          selfvotes[selfwinner]add(voter_index)

                                                                                                          break

                                                                                                          elif candidate[selfelecCANDIDATE_INDEX] == self

                                                                                                          second_place

                                                                                                          selfcandidates[selfsecond_place] += 1

                                                                                                          selfvotes[selfsecond_place]add(voter_index)

                                                                                                          break

                                                                                                          selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                          winners = []

                                                                                                          vacancies = selfelecN_VACANCIES

                                                                                                          for candidate in reversed(selfsorted_candidates)

                                                                                                          if vacancies == 0

                                                                                                          break

                                                                                                          winnersappend(candidate[0])

                                                                                                          vacancies -= 1

                                                                                                          mean chose_best = selfelecget_mean(winners = winners)

                                                                                                          74

                                                                                                          APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                                                                                          Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                                                                                          for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                          voter_dict = dict()

                                                                                                          og_voter_dict = dict()

                                                                                                          for tup in voter

                                                                                                          voter_dict[tup[0]] = tup[1]

                                                                                                          og_voter_dict[tup[0]] = tup[1]

                                                                                                          for coalition in selfeleccoalitions

                                                                                                          for candidate in coalition

                                                                                                          add_to_score = 0

                                                                                                          for candidate2 in coalition

                                                                                                          if candidate == candidate2

                                                                                                          continue

                                                                                                          half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                                                                                          if half lt 0

                                                                                                          add_to_score += mathceil(half)

                                                                                                          else

                                                                                                          add_to_score += mathfloor(half)

                                                                                                          if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                                                                                          voter_dict[candidate[rsquovaluersquo]] = 10

                                                                                                          elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                                                                                          voter_dict[candidate[rsquovaluersquo]] = -10

                                                                                                          else

                                                                                                          voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                                                                                          selfrankings_changed[voter_index] = []

                                                                                                          for candidate in voter_dict

                                                                                                          selfrankings_changed[voter_index]append((candidate voter_dict[

                                                                                                          candidate]))

                                                                                                          selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                                                                                          voter_index] key=lambda x x[1])

                                                                                                          75

                                                                                                          APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                                                                          Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                                                                          selfelecroundsappend(selfsorted_candidates[_round])

                                                                                                          if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                          N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                                                                          N_VACANCIES - 1)

                                                                                                          return 2

                                                                                                          elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                          N_VOTERS gt 05)

                                                                                                          return 1

                                                                                                          else

                                                                                                          selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                                                                          CANDIDATE_INDEX])

                                                                                                          for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                                                                          elecCANDIDATE_INDEX]]

                                                                                                          if voter_index in selfrankings_changed

                                                                                                          for candidate in reversed(selfrankings_changed[voter_index

                                                                                                          ])

                                                                                                          if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                          excluded

                                                                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                          ]] += 1

                                                                                                          selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                          add(voter_index)

                                                                                                          break

                                                                                                          else

                                                                                                          continue

                                                                                                          else

                                                                                                          for candidate in reversed(selfelecsorted_voters[

                                                                                                          voter_index])

                                                                                                          if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                          excluded

                                                                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                          ]] += 1

                                                                                                          selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                          add(voter_index)

                                                                                                          break

                                                                                                          else

                                                                                                          continue

                                                                                                          selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                          return 0

                                                                                                          76

                                                                                                          APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                                                                          Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                                                                          for index in range(selfelecN_CANDIDATES)

                                                                                                          selfcandidates[index] = 0

                                                                                                          for voter in selfelecsorted_voters

                                                                                                          for candidate in reversed(voter)

                                                                                                          if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                          else

                                                                                                          break

                                                                                                          APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                                                                          Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                                                                          for index in range(selfelecN_CANDIDATES)

                                                                                                          selfcandidates[index] = 0

                                                                                                          for voter in selfelecsorted_voters

                                                                                                          if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                          elecCANDIDATE_INDEX]]

                                                                                                          selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                                                                          else

                                                                                                          for candidate in reversed(voter)

                                                                                                          if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                          else

                                                                                                          break

                                                                                                          77

                                                                                                          APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                                                                          Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                                                                          pos = set()

                                                                                                          for index perc in enumerate(selfelectactical_vote_percentages)

                                                                                                          if perc gt 0

                                                                                                          posadd(index)

                                                                                                          for candidate in selfeleccandidates

                                                                                                          if candidate not in selfleading_candidates

                                                                                                          for voter_index in selfvotes[candidate]

                                                                                                          raised = None

                                                                                                          for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                                                                          ])

                                                                                                          if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                                                                          leading_candidates

                                                                                                          if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                                                                          if randomrandom() lt selfelectactical_vote_percentages[

                                                                                                          candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                                                                          ranking = [None]selfelecN_CANDIDATES

                                                                                                          ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                          selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                          CANDIDATE_INDEX]])

                                                                                                          raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                          break

                                                                                                          break

                                                                                                          break

                                                                                                          if raised = None

                                                                                                          for _candidate in selfleading_candidates

                                                                                                          if _candidate = ranking[-1][0]

                                                                                                          ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                          _candidate])

                                                                                                          buried = _candidate

                                                                                                          break

                                                                                                          i = 1

                                                                                                          for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                          if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                                                                          buried]

                                                                                                          continue

                                                                                                          else

                                                                                                          ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                          selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                          CANDIDATE_INDEX]])

                                                                                                          i += 1

                                                                                                          selfrankings_changed[voter_index] = ranking

                                                                                                          78

                                                                                                          APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                                                                          Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                                                                          for voter_index in selfvotes[candidate]

                                                                                                          if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                                                                          ]

                                                                                                          for _candidate in selfleading_candidates

                                                                                                          if _candidate = candidate

                                                                                                          ranking = [None]selfelecN_CANDIDATES

                                                                                                          ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                          _candidate])

                                                                                                          buried = _candidate

                                                                                                          break

                                                                                                          i = 1

                                                                                                          for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                          if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                                                                          continue

                                                                                                          else

                                                                                                          ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                          selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                          CANDIDATE_INDEX]])

                                                                                                          i += 1

                                                                                                          selfrankings_changed[voter_index] = ranking

                                                                                                          79

                                                                                                          APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                                                                          Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                                                                          for index in range(selfelecN_CANDIDATES)

                                                                                                          selfcandidates[index] = 0

                                                                                                          for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                          score = 0

                                                                                                          if voter_index in selfrankings_changed

                                                                                                          for candidate in selfrankings_changed[voter_index]

                                                                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                          score += 1

                                                                                                          else

                                                                                                          for candidate in voter

                                                                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                          score += 1

                                                                                                          APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                                                                          Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                                                                          for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                          if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                          elecCANDIDATE_INDEX]]

                                                                                                          selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                                                                          sorted_voters[voter_index])

                                                                                                          for candidate_index candidate in enumerate(reversed(voter))

                                                                                                          if candidate_index == 0

                                                                                                          selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                          voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                                                                          else

                                                                                                          selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                          voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                                                                          80

                                                                                                          APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                                                                          Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                                                                          for index in range(selfelecN_CANDIDATES)

                                                                                                          selfcandidates[index] = 0

                                                                                                          for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                          if voter_index in selfrankings_changed

                                                                                                          for candidate in selfrankings_changed[voter_index]

                                                                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                          selfelecCANDIDATE_RANK]

                                                                                                          else

                                                                                                          for candidate in voter

                                                                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                          selfelecCANDIDATE_RANK]

                                                                                                          APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                                                                          Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                                                                          for index in range(selfelecN_CANDIDATES)

                                                                                                          selfcandidates[index] = 0

                                                                                                          for voter in selfelecsorted_voters

                                                                                                          votes = selfelecN_VACANCIES

                                                                                                          for candidate in reversed(voter)

                                                                                                          if votes == 0

                                                                                                          break

                                                                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                          votes -= 1

                                                                                                          • Folha de aprovaccedilatildeo
                                                                                                          • Agradecimentos
                                                                                                          • Epiacutegrafe
                                                                                                          • Resumo
                                                                                                          • Abstract
                                                                                                          • Lista de ilustraccedilotildees
                                                                                                          • Lista de Coacutedigos
                                                                                                          • Lista de tabelas
                                                                                                          • Lista de abreviaturas e siglas
                                                                                                          • Sumaacuterio
                                                                                                          • INTRODUCcedilAtildeO
                                                                                                            • MOTIVACcedilAtildeO E OBJETIVO
                                                                                                            • MEacuteTODO
                                                                                                            • ESTRUTURA
                                                                                                              • SISTEMAS ELEITORAIS
                                                                                                                • FISRT PAST THE POST
                                                                                                                  • Exemplo
                                                                                                                  • Vantagens e Desvantagens do FPTP
                                                                                                                  • Voto Uacutetil no FPTP
                                                                                                                    • TWO-ROUND SYSTEM
                                                                                                                      • Exemplo
                                                                                                                      • Vantagens e Desvantagens do TRS
                                                                                                                      • Voto Uacutetil no TRS
                                                                                                                        • INSTANT-RUNOFF VOTING
                                                                                                                          • Exemplo
                                                                                                                          • Vantagens e Desvantagens do IRV
                                                                                                                          • Voto Uacutetil no IRV
                                                                                                                            • APPROVAL VOTING SYSTEM
                                                                                                                              • Exemplo
                                                                                                                              • Vantagens e Desvantagens do AVS
                                                                                                                              • Voto Uacutetil no AVS
                                                                                                                                • THE BORDA COUNT
                                                                                                                                  • Exemplo
                                                                                                                                  • Vantagens e Desvantagens do BC
                                                                                                                                  • Voto Uacutetil no BC
                                                                                                                                    • SCORE VOTING SYSTEM
                                                                                                                                      • Exemplo
                                                                                                                                      • Vantagens e Desvantagens do SVS
                                                                                                                                      • Voto Uacutetil no SVS
                                                                                                                                        • BLOC VOTE
                                                                                                                                          • Exemplo
                                                                                                                                          • Voto Uacutetil no BV
                                                                                                                                              • O SIMULADOR
                                                                                                                                              • CENAacuteRIOS PERTINENTES
                                                                                                                                                • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                                                                • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                                                                • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                                                                • CENAacuteRIO 4 COALIZOtildeES
                                                                                                                                                • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                                                                • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                                                                  • COMO FUNCIONA O SIMULADOR
                                                                                                                                                    • CLASSE Elections
                                                                                                                                                    • CLASSE FirstPastThePost
                                                                                                                                                    • CLASSE TwoRoundSystem
                                                                                                                                                    • CLASSE InstantRunoffVoting
                                                                                                                                                    • CLASSE ApprovalVoting
                                                                                                                                                    • CLASSE BordaCount
                                                                                                                                                    • CLASSE ScoreVoting
                                                                                                                                                    • CLASSE BlocVote
                                                                                                                                                    • TECNOLOGIAS UTILIZADAS
                                                                                                                                                      • CONCLUSAtildeO
                                                                                                                                                      • Referecircncias
                                                                                                                                                      • Meacutetodo create_voters
                                                                                                                                                      • Meacutetodo create_candidates
                                                                                                                                                      • Meacutetodo calculate_means
                                                                                                                                                      • Meacutetodo get_mean
                                                                                                                                                      • Meacutetodo calculate_mean
                                                                                                                                                      • Meacutetodo set_leading_candidates
                                                                                                                                                      • Meacutetodo irv_set_leading_candidates
                                                                                                                                                      • Meacutetodo sort_ranks
                                                                                                                                                      • Meacutetodo fptp_count_tactical_votes
                                                                                                                                                      • Meacutetodo fptp_count_minority_votes
                                                                                                                                                      • Meacutetodo trs_second_round
                                                                                                                                                      • Meacutetodo trs_account_for_coalitions
                                                                                                                                                      • Meacutetodo irv_count_votes
                                                                                                                                                      • Meacutetodo avs_count_votes
                                                                                                                                                      • Meacutetodo avs_count_votes_with_tactical
                                                                                                                                                      • Meacutetodo irv_apply_tactical_votes
                                                                                                                                                      • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                                                                      • Meacutetodo bc_sum_candidates_scores
                                                                                                                                                      • Meacutetodo svs_apply_tactical_votes
                                                                                                                                                      • Meacutetodo svs_sum_candidates_scores
                                                                                                                                                      • Meacutetodo bv_count_votes

                                                                                                            54

                                                                                                            Figura 45 ndash estrutura voters

                                                                                                            Figura 46 ndash estrutura votes

                                                                                                            daraacute para cada candidato depende da distribuiccedilatildeo selecionada para esse A distribuiccedilatildeoneutral possui maior probabilidade da nota gerada ser zero ou proacutexima de zero a likede loved geram notas mais proacuteximas de 10 e de maneira oposta as distribuiccedilotildees disliked ehated geram notas mais proacuteximas de -10 e por fim as distribuiccedilotildees polarizer e stronglypolirizer geram notas em ambas extremidades e evitam notas proacuteximas de 0 Poreacutemtambeacutem eacute possiacutevel criar perfis de eleitores que definiratildeo para determinada porcentagemda populaccedilatildeo as notas exatas dadas a cada candidato

                                                                                                            Com as listas das devidas notas de cada candidato por eleitor eacute preciso colocaacute-lasna forma de um ranking para que fique evidente em qual candidato aquele eleitor vota-ria Para isso o meacutetodo sort_ranks (apecircndice H) ordena o ranking de cada eleitor

                                                                                                            55

                                                                                                            Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

                                                                                                            Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

                                                                                                            na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

                                                                                                            56

                                                                                                            Figura 49 ndash PDF - Distribuiccedilatildeo Liked

                                                                                                            Figura 50 ndash CDF - Distribuiccedilatildeo Liked

                                                                                                            (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

                                                                                                            Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

                                                                                                            57

                                                                                                            Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

                                                                                                            Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

                                                                                                            candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

                                                                                                            Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

                                                                                                            58

                                                                                                            Figura 53 ndash PDF - Distribuiccedilatildeo Loved

                                                                                                            Figura 54 ndash CDF - Distribuiccedilatildeo Loved

                                                                                                            funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

                                                                                                            59

                                                                                                            Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                                                                                                            Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                                                                                                            Meacutedia das Notas sumei

                                                                                                            sumvj nij

                                                                                                            etimes v

                                                                                                            Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                                                                                                            Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                                                                                                            60

                                                                                                            Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                                                                                                            Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                                                                                                            52 CLASSE FIRSTPASTTHEPOST

                                                                                                            Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                                                                                                            Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                                                                                                            61

                                                                                                            Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                                                                                                            Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                                                                                                            mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                                                                                                            62

                                                                                                            53 CLASSE TWOROUNDSYSTEM

                                                                                                            A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                                                                                                            54 CLASSE INSTANTRUNOFFVOTING

                                                                                                            A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                                                                                                            Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                                                                                                            63

                                                                                                            cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                                                                                                            55 CLASSE APPROVALVOTING

                                                                                                            Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                                                                                                            56 CLASSE BORDACOUNT

                                                                                                            Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                                                                                                            57 CLASSE SCOREVOTING

                                                                                                            De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                                                                                                            64

                                                                                                            58 CLASSE BLOCVOTE

                                                                                                            O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                                                                                                            59 TECNOLOGIAS UTILIZADAS

                                                                                                            A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                                                                                                            Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                                                                                                            O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                                                                                                            Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                                                                                                            65

                                                                                                            6 CONCLUSAtildeO

                                                                                                            Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                                                                                                            Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                                                                                                            Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                                                                                                            Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                                                                                                            Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                                                                                                            66

                                                                                                            REFEREcircNCIAS

                                                                                                            AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                                                                                                            Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                                                                                                            Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                                                                                                            Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                                                                                                            HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                                                                                                            LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                                                                                                            ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                                                                                                            Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                                                                                                            POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                                                                                                            The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                                                                                                            67

                                                                                                            APEcircNDICES

                                                                                                            APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                                                                                            Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                                                                                            if(not len(selfvoter_profiles))

                                                                                                            for voter in range(selfN_VOTERS)

                                                                                                            candidates_rank = dict()

                                                                                                            for candidate in reversed(range(selfN_CANDIDATES))

                                                                                                            if(selfBIAS_VECTOR[candidate]==4)

                                                                                                            candidates_rank[candidate] = self_sortear(selfloved)

                                                                                                            elif(selfBIAS_VECTOR[candidate]==3)

                                                                                                            candidates_rank[candidate] = self_sortear(selfliked)

                                                                                                            elif(selfBIAS_VECTOR[candidate]==2)

                                                                                                            candidates_rank[candidate] = self_sortear(selfdisliked)

                                                                                                            elif(selfBIAS_VECTOR[candidate]==1)

                                                                                                            candidates_rank[candidate] = self_sortear(selfhated)

                                                                                                            elif(selfBIAS_VECTOR[candidate]==-1)

                                                                                                            candidates_rank[candidate] = self_sortear(selfpolarizer

                                                                                                            )

                                                                                                            elif(selfBIAS_VECTOR[candidate]==-2)

                                                                                                            candidates_rank[candidate] = self_sortear(self

                                                                                                            more_polarizer)

                                                                                                            else

                                                                                                            candidates_rank[candidate] = self_sortear(selfneutral)

                                                                                                            selfvotersappend(candidates_rank)

                                                                                                            else

                                                                                                            ranges = []

                                                                                                            ranks = []

                                                                                                            for prof in selfvoter_profiles

                                                                                                            rangesappend(int(prof[pop_percentage]))

                                                                                                            rank =

                                                                                                            for index score in enumerate(prof[scores])

                                                                                                            rank[index] = score

                                                                                                            ranksappend(rank)

                                                                                                            for index _range in enumerate(ranges)

                                                                                                            for _ in range(int(selfN_VOTERS(_range100)))

                                                                                                            selfvotersappend(ranks[index])

                                                                                                            68

                                                                                                            APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                                                                                            Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                                                                                            for i in range(selfN_CANDIDATES)

                                                                                                            selfcandidates[i] = 0

                                                                                                            selfvotes[i] = set()

                                                                                                            APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                                                                                            Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                                                                                            for candidate in range(selfN_CANDIDATES)

                                                                                                            rating_sum = 0

                                                                                                            for voter in selfvoters

                                                                                                            rating_sum += voter[candidate]

                                                                                                            selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                                                                                            APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                                                                                            Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                                                                                            if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                                                                                            return selfcalculate_mean(winners)

                                                                                                            else

                                                                                                            chose_best = True if winners[0] == selfbest_candidate else

                                                                                                            False

                                                                                                            return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                                                                                            69

                                                                                                            APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                                                                                            Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                                                                                            rating_sum = 0

                                                                                                            for voter in selfvoters

                                                                                                            for candidate in winners

                                                                                                            rating_sum += voter[candidate]

                                                                                                            return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                                                                                            APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                                                                                            Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                                                                                            for i in range(1 selfN_VACANCIES + 2)

                                                                                                            selfleading_candidatesappend(selfsorted_candidates[-i][self

                                                                                                            CANDIDATE_INDEX])

                                                                                                            APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                                                                                            Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                                                                                            for leader in selfelecrounds[-1]

                                                                                                            selfleading_candidatesappend(leader[0])

                                                                                                            70

                                                                                                            APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                                                                                            Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                                                                                            self_account_for_coalitions()

                                                                                                            for voter in selfvoters

                                                                                                            selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                                                                                            (1)))

                                                                                                            temp = []

                                                                                                            for voter in selfsorted_voters

                                                                                                            new_dict = defaultdict(list)

                                                                                                            for k in voter

                                                                                                            new_dict[k[1]]append(k[0])

                                                                                                            tempappend(new_dict)

                                                                                                            selfsorted_voters = []

                                                                                                            for voter_index current_voter in enumerate(temp)

                                                                                                            new_voter = []

                                                                                                            for rating candidate_indexes in current_voteritems()

                                                                                                            if len(current_voter[rating]) gt 1

                                                                                                            shuffle(current_voter[rating])

                                                                                                            for e in candidate_indexes

                                                                                                            new_voterappend((e rating))

                                                                                                            else

                                                                                                            new_voterappend((candidate_indexes[0] rating))

                                                                                                            selfsorted_votersappend(new_voter)

                                                                                                            selfcandidates[new_voter[-1][0]] += 1

                                                                                                            selfvotes[new_voter[-1][0]]add(voter_index)

                                                                                                            71

                                                                                                            APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                                                                                            Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                                                                                            for candidate in selfvotes_copy

                                                                                                            if candidate not in selfelecleading_candidates

                                                                                                            for voter_index in selfvotes_copy[candidate]

                                                                                                            for index _candidate in enumerate(reversed(selfelec

                                                                                                            sorted_voters[voter_index]))

                                                                                                            if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                                                                                            leading_candidates

                                                                                                            if randomrandom() lt selfelec

                                                                                                            tactical_vote_percentages[_candidate[selfelec

                                                                                                            CANDIDATE_INDEX]]

                                                                                                            selfrankings_changed[voter_index] = copy

                                                                                                            deepcopy(selfelecsorted_voters[voter_index])

                                                                                                            selfrankings_changed[voter_index][-(index + 1)]

                                                                                                            selfrankings_changed[voter_index][-1] = self

                                                                                                            rankings_changed[voter_index][-1] self

                                                                                                            rankings_changed[voter_index][-(index + 1)]

                                                                                                            selfcandidates[candidate] -= 1

                                                                                                            selfcandidates[_candidate[selfelec

                                                                                                            CANDIDATE_INDEX]] += 1

                                                                                                            selfvotes[candidate]remove(voter_index)

                                                                                                            selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                                                                                            ]]add(voter_index)

                                                                                                            break

                                                                                                            break

                                                                                                            72

                                                                                                            APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                                                                                            Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                                                                                            half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                                                                                            for candidate in selfelecleading_candidates

                                                                                                            if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                                                                                            continue

                                                                                                            for voter_index in selfvotes_copy[candidate]

                                                                                                            if voter_index in selfrankings_changed

                                                                                                            ranking = selfrankings_changed[voter_index]

                                                                                                            else

                                                                                                            ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                                                                                            ])

                                                                                                            for index _candidate in enumerate(reversed(ranking))

                                                                                                            if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                            leading_candidates or (_candidate[selfelec

                                                                                                            CANDIDATE_INDEX] in selfelecleading_candidates and

                                                                                                            selfelecleading_candidatesindex(_candidate[selfelec

                                                                                                            CANDIDATE_INDEX]) gt= half_vacancies)

                                                                                                            if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                                                                                            if randomrandom() lt selfelec

                                                                                                            minority_vote_percentages[_candidate[selfelec

                                                                                                            CANDIDATE_INDEX]]

                                                                                                            selfcandidates[candidate] -= 1

                                                                                                            selfcandidates[_candidate[selfelec

                                                                                                            CANDIDATE_INDEX]] += 1

                                                                                                            break

                                                                                                            break

                                                                                                            break

                                                                                                            73

                                                                                                            APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                                                                                            Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                                                                                            self_account_for_coalitions()

                                                                                                            for candidate in selfvotes

                                                                                                            if candidate = selfwinner and candidate = selfsecond_place

                                                                                                            for voter_index in selfvotes[candidate]

                                                                                                            if voter_index in selfrankings_changed

                                                                                                            ranking = selfrankings_changed[voter_index]

                                                                                                            else

                                                                                                            ranking = copydeepcopy(selfelecsorted_voters[

                                                                                                            voter_index])

                                                                                                            for index2 candidate in enumerate(reversed(ranking))

                                                                                                            if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                                                                                            selfcandidates[selfwinner] += 1

                                                                                                            selfvotes[selfwinner]add(voter_index)

                                                                                                            break

                                                                                                            elif candidate[selfelecCANDIDATE_INDEX] == self

                                                                                                            second_place

                                                                                                            selfcandidates[selfsecond_place] += 1

                                                                                                            selfvotes[selfsecond_place]add(voter_index)

                                                                                                            break

                                                                                                            selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                            winners = []

                                                                                                            vacancies = selfelecN_VACANCIES

                                                                                                            for candidate in reversed(selfsorted_candidates)

                                                                                                            if vacancies == 0

                                                                                                            break

                                                                                                            winnersappend(candidate[0])

                                                                                                            vacancies -= 1

                                                                                                            mean chose_best = selfelecget_mean(winners = winners)

                                                                                                            74

                                                                                                            APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                                                                                            Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                                                                                            for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                            voter_dict = dict()

                                                                                                            og_voter_dict = dict()

                                                                                                            for tup in voter

                                                                                                            voter_dict[tup[0]] = tup[1]

                                                                                                            og_voter_dict[tup[0]] = tup[1]

                                                                                                            for coalition in selfeleccoalitions

                                                                                                            for candidate in coalition

                                                                                                            add_to_score = 0

                                                                                                            for candidate2 in coalition

                                                                                                            if candidate == candidate2

                                                                                                            continue

                                                                                                            half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                                                                                            if half lt 0

                                                                                                            add_to_score += mathceil(half)

                                                                                                            else

                                                                                                            add_to_score += mathfloor(half)

                                                                                                            if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                                                                                            voter_dict[candidate[rsquovaluersquo]] = 10

                                                                                                            elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                                                                                            voter_dict[candidate[rsquovaluersquo]] = -10

                                                                                                            else

                                                                                                            voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                                                                                            selfrankings_changed[voter_index] = []

                                                                                                            for candidate in voter_dict

                                                                                                            selfrankings_changed[voter_index]append((candidate voter_dict[

                                                                                                            candidate]))

                                                                                                            selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                                                                                            voter_index] key=lambda x x[1])

                                                                                                            75

                                                                                                            APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                                                                            Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                                                                            selfelecroundsappend(selfsorted_candidates[_round])

                                                                                                            if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                            N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                                                                            N_VACANCIES - 1)

                                                                                                            return 2

                                                                                                            elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                            N_VOTERS gt 05)

                                                                                                            return 1

                                                                                                            else

                                                                                                            selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                                                                            CANDIDATE_INDEX])

                                                                                                            for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                                                                            elecCANDIDATE_INDEX]]

                                                                                                            if voter_index in selfrankings_changed

                                                                                                            for candidate in reversed(selfrankings_changed[voter_index

                                                                                                            ])

                                                                                                            if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                            excluded

                                                                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                            ]] += 1

                                                                                                            selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                            add(voter_index)

                                                                                                            break

                                                                                                            else

                                                                                                            continue

                                                                                                            else

                                                                                                            for candidate in reversed(selfelecsorted_voters[

                                                                                                            voter_index])

                                                                                                            if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                            excluded

                                                                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                            ]] += 1

                                                                                                            selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                            add(voter_index)

                                                                                                            break

                                                                                                            else

                                                                                                            continue

                                                                                                            selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                            return 0

                                                                                                            76

                                                                                                            APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                                                                            Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                                                                            for index in range(selfelecN_CANDIDATES)

                                                                                                            selfcandidates[index] = 0

                                                                                                            for voter in selfelecsorted_voters

                                                                                                            for candidate in reversed(voter)

                                                                                                            if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                            else

                                                                                                            break

                                                                                                            APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                                                                            Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                                                                            for index in range(selfelecN_CANDIDATES)

                                                                                                            selfcandidates[index] = 0

                                                                                                            for voter in selfelecsorted_voters

                                                                                                            if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                            elecCANDIDATE_INDEX]]

                                                                                                            selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                                                                            else

                                                                                                            for candidate in reversed(voter)

                                                                                                            if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                            else

                                                                                                            break

                                                                                                            77

                                                                                                            APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                                                                            Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                                                                            pos = set()

                                                                                                            for index perc in enumerate(selfelectactical_vote_percentages)

                                                                                                            if perc gt 0

                                                                                                            posadd(index)

                                                                                                            for candidate in selfeleccandidates

                                                                                                            if candidate not in selfleading_candidates

                                                                                                            for voter_index in selfvotes[candidate]

                                                                                                            raised = None

                                                                                                            for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                                                                            ])

                                                                                                            if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                                                                            leading_candidates

                                                                                                            if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                                                                            if randomrandom() lt selfelectactical_vote_percentages[

                                                                                                            candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                                                                            ranking = [None]selfelecN_CANDIDATES

                                                                                                            ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                            selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                            CANDIDATE_INDEX]])

                                                                                                            raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                            break

                                                                                                            break

                                                                                                            break

                                                                                                            if raised = None

                                                                                                            for _candidate in selfleading_candidates

                                                                                                            if _candidate = ranking[-1][0]

                                                                                                            ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                            _candidate])

                                                                                                            buried = _candidate

                                                                                                            break

                                                                                                            i = 1

                                                                                                            for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                            if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                                                                            buried]

                                                                                                            continue

                                                                                                            else

                                                                                                            ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                            selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                            CANDIDATE_INDEX]])

                                                                                                            i += 1

                                                                                                            selfrankings_changed[voter_index] = ranking

                                                                                                            78

                                                                                                            APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                                                                            Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                                                                            for voter_index in selfvotes[candidate]

                                                                                                            if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                                                                            ]

                                                                                                            for _candidate in selfleading_candidates

                                                                                                            if _candidate = candidate

                                                                                                            ranking = [None]selfelecN_CANDIDATES

                                                                                                            ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                            _candidate])

                                                                                                            buried = _candidate

                                                                                                            break

                                                                                                            i = 1

                                                                                                            for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                            if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                                                                            continue

                                                                                                            else

                                                                                                            ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                            selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                            CANDIDATE_INDEX]])

                                                                                                            i += 1

                                                                                                            selfrankings_changed[voter_index] = ranking

                                                                                                            79

                                                                                                            APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                                                                            Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                                                                            for index in range(selfelecN_CANDIDATES)

                                                                                                            selfcandidates[index] = 0

                                                                                                            for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                            score = 0

                                                                                                            if voter_index in selfrankings_changed

                                                                                                            for candidate in selfrankings_changed[voter_index]

                                                                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                            score += 1

                                                                                                            else

                                                                                                            for candidate in voter

                                                                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                            score += 1

                                                                                                            APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                                                                            Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                                                                            for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                            if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                            elecCANDIDATE_INDEX]]

                                                                                                            selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                                                                            sorted_voters[voter_index])

                                                                                                            for candidate_index candidate in enumerate(reversed(voter))

                                                                                                            if candidate_index == 0

                                                                                                            selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                            voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                                                                            else

                                                                                                            selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                            voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                                                                            80

                                                                                                            APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                                                                            Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                                                                            for index in range(selfelecN_CANDIDATES)

                                                                                                            selfcandidates[index] = 0

                                                                                                            for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                            if voter_index in selfrankings_changed

                                                                                                            for candidate in selfrankings_changed[voter_index]

                                                                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                            selfelecCANDIDATE_RANK]

                                                                                                            else

                                                                                                            for candidate in voter

                                                                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                            selfelecCANDIDATE_RANK]

                                                                                                            APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                                                                            Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                                                                            for index in range(selfelecN_CANDIDATES)

                                                                                                            selfcandidates[index] = 0

                                                                                                            for voter in selfelecsorted_voters

                                                                                                            votes = selfelecN_VACANCIES

                                                                                                            for candidate in reversed(voter)

                                                                                                            if votes == 0

                                                                                                            break

                                                                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                            votes -= 1

                                                                                                            • Folha de aprovaccedilatildeo
                                                                                                            • Agradecimentos
                                                                                                            • Epiacutegrafe
                                                                                                            • Resumo
                                                                                                            • Abstract
                                                                                                            • Lista de ilustraccedilotildees
                                                                                                            • Lista de Coacutedigos
                                                                                                            • Lista de tabelas
                                                                                                            • Lista de abreviaturas e siglas
                                                                                                            • Sumaacuterio
                                                                                                            • INTRODUCcedilAtildeO
                                                                                                              • MOTIVACcedilAtildeO E OBJETIVO
                                                                                                              • MEacuteTODO
                                                                                                              • ESTRUTURA
                                                                                                                • SISTEMAS ELEITORAIS
                                                                                                                  • FISRT PAST THE POST
                                                                                                                    • Exemplo
                                                                                                                    • Vantagens e Desvantagens do FPTP
                                                                                                                    • Voto Uacutetil no FPTP
                                                                                                                      • TWO-ROUND SYSTEM
                                                                                                                        • Exemplo
                                                                                                                        • Vantagens e Desvantagens do TRS
                                                                                                                        • Voto Uacutetil no TRS
                                                                                                                          • INSTANT-RUNOFF VOTING
                                                                                                                            • Exemplo
                                                                                                                            • Vantagens e Desvantagens do IRV
                                                                                                                            • Voto Uacutetil no IRV
                                                                                                                              • APPROVAL VOTING SYSTEM
                                                                                                                                • Exemplo
                                                                                                                                • Vantagens e Desvantagens do AVS
                                                                                                                                • Voto Uacutetil no AVS
                                                                                                                                  • THE BORDA COUNT
                                                                                                                                    • Exemplo
                                                                                                                                    • Vantagens e Desvantagens do BC
                                                                                                                                    • Voto Uacutetil no BC
                                                                                                                                      • SCORE VOTING SYSTEM
                                                                                                                                        • Exemplo
                                                                                                                                        • Vantagens e Desvantagens do SVS
                                                                                                                                        • Voto Uacutetil no SVS
                                                                                                                                          • BLOC VOTE
                                                                                                                                            • Exemplo
                                                                                                                                            • Voto Uacutetil no BV
                                                                                                                                                • O SIMULADOR
                                                                                                                                                • CENAacuteRIOS PERTINENTES
                                                                                                                                                  • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                                                                  • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                                                                  • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                                                                  • CENAacuteRIO 4 COALIZOtildeES
                                                                                                                                                  • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                                                                  • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                                                                    • COMO FUNCIONA O SIMULADOR
                                                                                                                                                      • CLASSE Elections
                                                                                                                                                      • CLASSE FirstPastThePost
                                                                                                                                                      • CLASSE TwoRoundSystem
                                                                                                                                                      • CLASSE InstantRunoffVoting
                                                                                                                                                      • CLASSE ApprovalVoting
                                                                                                                                                      • CLASSE BordaCount
                                                                                                                                                      • CLASSE ScoreVoting
                                                                                                                                                      • CLASSE BlocVote
                                                                                                                                                      • TECNOLOGIAS UTILIZADAS
                                                                                                                                                        • CONCLUSAtildeO
                                                                                                                                                        • Referecircncias
                                                                                                                                                        • Meacutetodo create_voters
                                                                                                                                                        • Meacutetodo create_candidates
                                                                                                                                                        • Meacutetodo calculate_means
                                                                                                                                                        • Meacutetodo get_mean
                                                                                                                                                        • Meacutetodo calculate_mean
                                                                                                                                                        • Meacutetodo set_leading_candidates
                                                                                                                                                        • Meacutetodo irv_set_leading_candidates
                                                                                                                                                        • Meacutetodo sort_ranks
                                                                                                                                                        • Meacutetodo fptp_count_tactical_votes
                                                                                                                                                        • Meacutetodo fptp_count_minority_votes
                                                                                                                                                        • Meacutetodo trs_second_round
                                                                                                                                                        • Meacutetodo trs_account_for_coalitions
                                                                                                                                                        • Meacutetodo irv_count_votes
                                                                                                                                                        • Meacutetodo avs_count_votes
                                                                                                                                                        • Meacutetodo avs_count_votes_with_tactical
                                                                                                                                                        • Meacutetodo irv_apply_tactical_votes
                                                                                                                                                        • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                                                                        • Meacutetodo bc_sum_candidates_scores
                                                                                                                                                        • Meacutetodo svs_apply_tactical_votes
                                                                                                                                                        • Meacutetodo svs_sum_candidates_scores
                                                                                                                                                        • Meacutetodo bv_count_votes

                                                                                                              55

                                                                                                              Figura 47 ndash PDF - Distribuiccedilatildeo Neutral

                                                                                                              Figura 48 ndash CDF - Distribuiccedilatildeo Neutral

                                                                                                              na estrutura voters Poreacutem apoacutes a ordenaccedilatildeo dos rankings eacute necessaacuterio lidar com aduplicidade de notas dentro de um mesmo ranking pois se dois ou mais candidatos pos-suem a mesma nota ao chamarmos o meacutetodo de ordenaccedilatildeo do python o candidato como maior iacutendice sempre levaraacute prioridade na votaccedilatildeo o que natildeo eacute condizente com a reali-dade Entatildeo a partir dos rankings ordenados se cria um dicionaacuterio para cada um ondea chave eacute a nota e o valor eacute a lista dos candidatos com a mesma nota Em seguida cadauma dessas listas eacute embaralhada dando a cada candidato com a mesma nota uma chanceigual de ser escolhido Esses dicionaacuterios satildeo revertidos agrave estrutura voters agora comuma ordenaccedilatildeo justa Para definir o voto de cada eleitor simplesmente satildeo selecionados

                                                                                                              56

                                                                                                              Figura 49 ndash PDF - Distribuiccedilatildeo Liked

                                                                                                              Figura 50 ndash CDF - Distribuiccedilatildeo Liked

                                                                                                              (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

                                                                                                              Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

                                                                                                              57

                                                                                                              Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

                                                                                                              Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

                                                                                                              candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

                                                                                                              Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

                                                                                                              58

                                                                                                              Figura 53 ndash PDF - Distribuiccedilatildeo Loved

                                                                                                              Figura 54 ndash CDF - Distribuiccedilatildeo Loved

                                                                                                              funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

                                                                                                              59

                                                                                                              Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                                                                                                              Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                                                                                                              Meacutedia das Notas sumei

                                                                                                              sumvj nij

                                                                                                              etimes v

                                                                                                              Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                                                                                                              Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                                                                                                              60

                                                                                                              Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                                                                                                              Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                                                                                                              52 CLASSE FIRSTPASTTHEPOST

                                                                                                              Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                                                                                                              Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                                                                                                              61

                                                                                                              Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                                                                                                              Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                                                                                                              mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                                                                                                              62

                                                                                                              53 CLASSE TWOROUNDSYSTEM

                                                                                                              A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                                                                                                              54 CLASSE INSTANTRUNOFFVOTING

                                                                                                              A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                                                                                                              Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                                                                                                              63

                                                                                                              cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                                                                                                              55 CLASSE APPROVALVOTING

                                                                                                              Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                                                                                                              56 CLASSE BORDACOUNT

                                                                                                              Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                                                                                                              57 CLASSE SCOREVOTING

                                                                                                              De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                                                                                                              64

                                                                                                              58 CLASSE BLOCVOTE

                                                                                                              O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                                                                                                              59 TECNOLOGIAS UTILIZADAS

                                                                                                              A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                                                                                                              Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                                                                                                              O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                                                                                                              Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                                                                                                              65

                                                                                                              6 CONCLUSAtildeO

                                                                                                              Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                                                                                                              Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                                                                                                              Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                                                                                                              Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                                                                                                              Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                                                                                                              66

                                                                                                              REFEREcircNCIAS

                                                                                                              AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                                                                                                              Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                                                                                                              Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                                                                                                              Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                                                                                                              HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                                                                                                              LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                                                                                                              ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                                                                                                              Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                                                                                                              POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                                                                                                              The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                                                                                                              67

                                                                                                              APEcircNDICES

                                                                                                              APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                                                                                              Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                                                                                              if(not len(selfvoter_profiles))

                                                                                                              for voter in range(selfN_VOTERS)

                                                                                                              candidates_rank = dict()

                                                                                                              for candidate in reversed(range(selfN_CANDIDATES))

                                                                                                              if(selfBIAS_VECTOR[candidate]==4)

                                                                                                              candidates_rank[candidate] = self_sortear(selfloved)

                                                                                                              elif(selfBIAS_VECTOR[candidate]==3)

                                                                                                              candidates_rank[candidate] = self_sortear(selfliked)

                                                                                                              elif(selfBIAS_VECTOR[candidate]==2)

                                                                                                              candidates_rank[candidate] = self_sortear(selfdisliked)

                                                                                                              elif(selfBIAS_VECTOR[candidate]==1)

                                                                                                              candidates_rank[candidate] = self_sortear(selfhated)

                                                                                                              elif(selfBIAS_VECTOR[candidate]==-1)

                                                                                                              candidates_rank[candidate] = self_sortear(selfpolarizer

                                                                                                              )

                                                                                                              elif(selfBIAS_VECTOR[candidate]==-2)

                                                                                                              candidates_rank[candidate] = self_sortear(self

                                                                                                              more_polarizer)

                                                                                                              else

                                                                                                              candidates_rank[candidate] = self_sortear(selfneutral)

                                                                                                              selfvotersappend(candidates_rank)

                                                                                                              else

                                                                                                              ranges = []

                                                                                                              ranks = []

                                                                                                              for prof in selfvoter_profiles

                                                                                                              rangesappend(int(prof[pop_percentage]))

                                                                                                              rank =

                                                                                                              for index score in enumerate(prof[scores])

                                                                                                              rank[index] = score

                                                                                                              ranksappend(rank)

                                                                                                              for index _range in enumerate(ranges)

                                                                                                              for _ in range(int(selfN_VOTERS(_range100)))

                                                                                                              selfvotersappend(ranks[index])

                                                                                                              68

                                                                                                              APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                                                                                              Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                                                                                              for i in range(selfN_CANDIDATES)

                                                                                                              selfcandidates[i] = 0

                                                                                                              selfvotes[i] = set()

                                                                                                              APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                                                                                              Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                                                                                              for candidate in range(selfN_CANDIDATES)

                                                                                                              rating_sum = 0

                                                                                                              for voter in selfvoters

                                                                                                              rating_sum += voter[candidate]

                                                                                                              selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                                                                                              APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                                                                                              Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                                                                                              if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                                                                                              return selfcalculate_mean(winners)

                                                                                                              else

                                                                                                              chose_best = True if winners[0] == selfbest_candidate else

                                                                                                              False

                                                                                                              return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                                                                                              69

                                                                                                              APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                                                                                              Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                                                                                              rating_sum = 0

                                                                                                              for voter in selfvoters

                                                                                                              for candidate in winners

                                                                                                              rating_sum += voter[candidate]

                                                                                                              return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                                                                                              APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                                                                                              Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                                                                                              for i in range(1 selfN_VACANCIES + 2)

                                                                                                              selfleading_candidatesappend(selfsorted_candidates[-i][self

                                                                                                              CANDIDATE_INDEX])

                                                                                                              APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                                                                                              Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                                                                                              for leader in selfelecrounds[-1]

                                                                                                              selfleading_candidatesappend(leader[0])

                                                                                                              70

                                                                                                              APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                                                                                              Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                                                                                              self_account_for_coalitions()

                                                                                                              for voter in selfvoters

                                                                                                              selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                                                                                              (1)))

                                                                                                              temp = []

                                                                                                              for voter in selfsorted_voters

                                                                                                              new_dict = defaultdict(list)

                                                                                                              for k in voter

                                                                                                              new_dict[k[1]]append(k[0])

                                                                                                              tempappend(new_dict)

                                                                                                              selfsorted_voters = []

                                                                                                              for voter_index current_voter in enumerate(temp)

                                                                                                              new_voter = []

                                                                                                              for rating candidate_indexes in current_voteritems()

                                                                                                              if len(current_voter[rating]) gt 1

                                                                                                              shuffle(current_voter[rating])

                                                                                                              for e in candidate_indexes

                                                                                                              new_voterappend((e rating))

                                                                                                              else

                                                                                                              new_voterappend((candidate_indexes[0] rating))

                                                                                                              selfsorted_votersappend(new_voter)

                                                                                                              selfcandidates[new_voter[-1][0]] += 1

                                                                                                              selfvotes[new_voter[-1][0]]add(voter_index)

                                                                                                              71

                                                                                                              APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                                                                                              Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                                                                                              for candidate in selfvotes_copy

                                                                                                              if candidate not in selfelecleading_candidates

                                                                                                              for voter_index in selfvotes_copy[candidate]

                                                                                                              for index _candidate in enumerate(reversed(selfelec

                                                                                                              sorted_voters[voter_index]))

                                                                                                              if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                                                                                              leading_candidates

                                                                                                              if randomrandom() lt selfelec

                                                                                                              tactical_vote_percentages[_candidate[selfelec

                                                                                                              CANDIDATE_INDEX]]

                                                                                                              selfrankings_changed[voter_index] = copy

                                                                                                              deepcopy(selfelecsorted_voters[voter_index])

                                                                                                              selfrankings_changed[voter_index][-(index + 1)]

                                                                                                              selfrankings_changed[voter_index][-1] = self

                                                                                                              rankings_changed[voter_index][-1] self

                                                                                                              rankings_changed[voter_index][-(index + 1)]

                                                                                                              selfcandidates[candidate] -= 1

                                                                                                              selfcandidates[_candidate[selfelec

                                                                                                              CANDIDATE_INDEX]] += 1

                                                                                                              selfvotes[candidate]remove(voter_index)

                                                                                                              selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                                                                                              ]]add(voter_index)

                                                                                                              break

                                                                                                              break

                                                                                                              72

                                                                                                              APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                                                                                              Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                                                                                              half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                                                                                              for candidate in selfelecleading_candidates

                                                                                                              if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                                                                                              continue

                                                                                                              for voter_index in selfvotes_copy[candidate]

                                                                                                              if voter_index in selfrankings_changed

                                                                                                              ranking = selfrankings_changed[voter_index]

                                                                                                              else

                                                                                                              ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                                                                                              ])

                                                                                                              for index _candidate in enumerate(reversed(ranking))

                                                                                                              if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                              leading_candidates or (_candidate[selfelec

                                                                                                              CANDIDATE_INDEX] in selfelecleading_candidates and

                                                                                                              selfelecleading_candidatesindex(_candidate[selfelec

                                                                                                              CANDIDATE_INDEX]) gt= half_vacancies)

                                                                                                              if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                                                                                              if randomrandom() lt selfelec

                                                                                                              minority_vote_percentages[_candidate[selfelec

                                                                                                              CANDIDATE_INDEX]]

                                                                                                              selfcandidates[candidate] -= 1

                                                                                                              selfcandidates[_candidate[selfelec

                                                                                                              CANDIDATE_INDEX]] += 1

                                                                                                              break

                                                                                                              break

                                                                                                              break

                                                                                                              73

                                                                                                              APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                                                                                              Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                                                                                              self_account_for_coalitions()

                                                                                                              for candidate in selfvotes

                                                                                                              if candidate = selfwinner and candidate = selfsecond_place

                                                                                                              for voter_index in selfvotes[candidate]

                                                                                                              if voter_index in selfrankings_changed

                                                                                                              ranking = selfrankings_changed[voter_index]

                                                                                                              else

                                                                                                              ranking = copydeepcopy(selfelecsorted_voters[

                                                                                                              voter_index])

                                                                                                              for index2 candidate in enumerate(reversed(ranking))

                                                                                                              if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                                                                                              selfcandidates[selfwinner] += 1

                                                                                                              selfvotes[selfwinner]add(voter_index)

                                                                                                              break

                                                                                                              elif candidate[selfelecCANDIDATE_INDEX] == self

                                                                                                              second_place

                                                                                                              selfcandidates[selfsecond_place] += 1

                                                                                                              selfvotes[selfsecond_place]add(voter_index)

                                                                                                              break

                                                                                                              selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                              winners = []

                                                                                                              vacancies = selfelecN_VACANCIES

                                                                                                              for candidate in reversed(selfsorted_candidates)

                                                                                                              if vacancies == 0

                                                                                                              break

                                                                                                              winnersappend(candidate[0])

                                                                                                              vacancies -= 1

                                                                                                              mean chose_best = selfelecget_mean(winners = winners)

                                                                                                              74

                                                                                                              APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                                                                                              Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                                                                                              for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                              voter_dict = dict()

                                                                                                              og_voter_dict = dict()

                                                                                                              for tup in voter

                                                                                                              voter_dict[tup[0]] = tup[1]

                                                                                                              og_voter_dict[tup[0]] = tup[1]

                                                                                                              for coalition in selfeleccoalitions

                                                                                                              for candidate in coalition

                                                                                                              add_to_score = 0

                                                                                                              for candidate2 in coalition

                                                                                                              if candidate == candidate2

                                                                                                              continue

                                                                                                              half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                                                                                              if half lt 0

                                                                                                              add_to_score += mathceil(half)

                                                                                                              else

                                                                                                              add_to_score += mathfloor(half)

                                                                                                              if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                                                                                              voter_dict[candidate[rsquovaluersquo]] = 10

                                                                                                              elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                                                                                              voter_dict[candidate[rsquovaluersquo]] = -10

                                                                                                              else

                                                                                                              voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                                                                                              selfrankings_changed[voter_index] = []

                                                                                                              for candidate in voter_dict

                                                                                                              selfrankings_changed[voter_index]append((candidate voter_dict[

                                                                                                              candidate]))

                                                                                                              selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                                                                                              voter_index] key=lambda x x[1])

                                                                                                              75

                                                                                                              APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                                                                              Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                                                                              selfelecroundsappend(selfsorted_candidates[_round])

                                                                                                              if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                              N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                                                                              N_VACANCIES - 1)

                                                                                                              return 2

                                                                                                              elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                              N_VOTERS gt 05)

                                                                                                              return 1

                                                                                                              else

                                                                                                              selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                                                                              CANDIDATE_INDEX])

                                                                                                              for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                                                                              elecCANDIDATE_INDEX]]

                                                                                                              if voter_index in selfrankings_changed

                                                                                                              for candidate in reversed(selfrankings_changed[voter_index

                                                                                                              ])

                                                                                                              if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                              excluded

                                                                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                              ]] += 1

                                                                                                              selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                              add(voter_index)

                                                                                                              break

                                                                                                              else

                                                                                                              continue

                                                                                                              else

                                                                                                              for candidate in reversed(selfelecsorted_voters[

                                                                                                              voter_index])

                                                                                                              if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                              excluded

                                                                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                              ]] += 1

                                                                                                              selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                              add(voter_index)

                                                                                                              break

                                                                                                              else

                                                                                                              continue

                                                                                                              selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                              return 0

                                                                                                              76

                                                                                                              APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                                                                              Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                                                                              for index in range(selfelecN_CANDIDATES)

                                                                                                              selfcandidates[index] = 0

                                                                                                              for voter in selfelecsorted_voters

                                                                                                              for candidate in reversed(voter)

                                                                                                              if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                              else

                                                                                                              break

                                                                                                              APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                                                                              Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                                                                              for index in range(selfelecN_CANDIDATES)

                                                                                                              selfcandidates[index] = 0

                                                                                                              for voter in selfelecsorted_voters

                                                                                                              if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                              elecCANDIDATE_INDEX]]

                                                                                                              selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                                                                              else

                                                                                                              for candidate in reversed(voter)

                                                                                                              if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                              else

                                                                                                              break

                                                                                                              77

                                                                                                              APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                                                                              Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                                                                              pos = set()

                                                                                                              for index perc in enumerate(selfelectactical_vote_percentages)

                                                                                                              if perc gt 0

                                                                                                              posadd(index)

                                                                                                              for candidate in selfeleccandidates

                                                                                                              if candidate not in selfleading_candidates

                                                                                                              for voter_index in selfvotes[candidate]

                                                                                                              raised = None

                                                                                                              for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                                                                              ])

                                                                                                              if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                                                                              leading_candidates

                                                                                                              if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                                                                              if randomrandom() lt selfelectactical_vote_percentages[

                                                                                                              candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                                                                              ranking = [None]selfelecN_CANDIDATES

                                                                                                              ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                              selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                              CANDIDATE_INDEX]])

                                                                                                              raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                              break

                                                                                                              break

                                                                                                              break

                                                                                                              if raised = None

                                                                                                              for _candidate in selfleading_candidates

                                                                                                              if _candidate = ranking[-1][0]

                                                                                                              ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                              _candidate])

                                                                                                              buried = _candidate

                                                                                                              break

                                                                                                              i = 1

                                                                                                              for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                              if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                                                                              buried]

                                                                                                              continue

                                                                                                              else

                                                                                                              ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                              selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                              CANDIDATE_INDEX]])

                                                                                                              i += 1

                                                                                                              selfrankings_changed[voter_index] = ranking

                                                                                                              78

                                                                                                              APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                                                                              Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                                                                              for voter_index in selfvotes[candidate]

                                                                                                              if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                                                                              ]

                                                                                                              for _candidate in selfleading_candidates

                                                                                                              if _candidate = candidate

                                                                                                              ranking = [None]selfelecN_CANDIDATES

                                                                                                              ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                              _candidate])

                                                                                                              buried = _candidate

                                                                                                              break

                                                                                                              i = 1

                                                                                                              for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                              if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                                                                              continue

                                                                                                              else

                                                                                                              ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                              selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                              CANDIDATE_INDEX]])

                                                                                                              i += 1

                                                                                                              selfrankings_changed[voter_index] = ranking

                                                                                                              79

                                                                                                              APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                                                                              Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                                                                              for index in range(selfelecN_CANDIDATES)

                                                                                                              selfcandidates[index] = 0

                                                                                                              for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                              score = 0

                                                                                                              if voter_index in selfrankings_changed

                                                                                                              for candidate in selfrankings_changed[voter_index]

                                                                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                              score += 1

                                                                                                              else

                                                                                                              for candidate in voter

                                                                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                              score += 1

                                                                                                              APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                                                                              Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                                                                              for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                              if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                              elecCANDIDATE_INDEX]]

                                                                                                              selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                                                                              sorted_voters[voter_index])

                                                                                                              for candidate_index candidate in enumerate(reversed(voter))

                                                                                                              if candidate_index == 0

                                                                                                              selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                              voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                                                                              else

                                                                                                              selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                              voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                                                                              80

                                                                                                              APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                                                                              Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                                                                              for index in range(selfelecN_CANDIDATES)

                                                                                                              selfcandidates[index] = 0

                                                                                                              for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                              if voter_index in selfrankings_changed

                                                                                                              for candidate in selfrankings_changed[voter_index]

                                                                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                              selfelecCANDIDATE_RANK]

                                                                                                              else

                                                                                                              for candidate in voter

                                                                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                              selfelecCANDIDATE_RANK]

                                                                                                              APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                                                                              Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                                                                              for index in range(selfelecN_CANDIDATES)

                                                                                                              selfcandidates[index] = 0

                                                                                                              for voter in selfelecsorted_voters

                                                                                                              votes = selfelecN_VACANCIES

                                                                                                              for candidate in reversed(voter)

                                                                                                              if votes == 0

                                                                                                              break

                                                                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                              votes -= 1

                                                                                                              • Folha de aprovaccedilatildeo
                                                                                                              • Agradecimentos
                                                                                                              • Epiacutegrafe
                                                                                                              • Resumo
                                                                                                              • Abstract
                                                                                                              • Lista de ilustraccedilotildees
                                                                                                              • Lista de Coacutedigos
                                                                                                              • Lista de tabelas
                                                                                                              • Lista de abreviaturas e siglas
                                                                                                              • Sumaacuterio
                                                                                                              • INTRODUCcedilAtildeO
                                                                                                                • MOTIVACcedilAtildeO E OBJETIVO
                                                                                                                • MEacuteTODO
                                                                                                                • ESTRUTURA
                                                                                                                  • SISTEMAS ELEITORAIS
                                                                                                                    • FISRT PAST THE POST
                                                                                                                      • Exemplo
                                                                                                                      • Vantagens e Desvantagens do FPTP
                                                                                                                      • Voto Uacutetil no FPTP
                                                                                                                        • TWO-ROUND SYSTEM
                                                                                                                          • Exemplo
                                                                                                                          • Vantagens e Desvantagens do TRS
                                                                                                                          • Voto Uacutetil no TRS
                                                                                                                            • INSTANT-RUNOFF VOTING
                                                                                                                              • Exemplo
                                                                                                                              • Vantagens e Desvantagens do IRV
                                                                                                                              • Voto Uacutetil no IRV
                                                                                                                                • APPROVAL VOTING SYSTEM
                                                                                                                                  • Exemplo
                                                                                                                                  • Vantagens e Desvantagens do AVS
                                                                                                                                  • Voto Uacutetil no AVS
                                                                                                                                    • THE BORDA COUNT
                                                                                                                                      • Exemplo
                                                                                                                                      • Vantagens e Desvantagens do BC
                                                                                                                                      • Voto Uacutetil no BC
                                                                                                                                        • SCORE VOTING SYSTEM
                                                                                                                                          • Exemplo
                                                                                                                                          • Vantagens e Desvantagens do SVS
                                                                                                                                          • Voto Uacutetil no SVS
                                                                                                                                            • BLOC VOTE
                                                                                                                                              • Exemplo
                                                                                                                                              • Voto Uacutetil no BV
                                                                                                                                                  • O SIMULADOR
                                                                                                                                                  • CENAacuteRIOS PERTINENTES
                                                                                                                                                    • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                                                                    • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                                                                    • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                                                                    • CENAacuteRIO 4 COALIZOtildeES
                                                                                                                                                    • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                                                                    • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                                                                      • COMO FUNCIONA O SIMULADOR
                                                                                                                                                        • CLASSE Elections
                                                                                                                                                        • CLASSE FirstPastThePost
                                                                                                                                                        • CLASSE TwoRoundSystem
                                                                                                                                                        • CLASSE InstantRunoffVoting
                                                                                                                                                        • CLASSE ApprovalVoting
                                                                                                                                                        • CLASSE BordaCount
                                                                                                                                                        • CLASSE ScoreVoting
                                                                                                                                                        • CLASSE BlocVote
                                                                                                                                                        • TECNOLOGIAS UTILIZADAS
                                                                                                                                                          • CONCLUSAtildeO
                                                                                                                                                          • Referecircncias
                                                                                                                                                          • Meacutetodo create_voters
                                                                                                                                                          • Meacutetodo create_candidates
                                                                                                                                                          • Meacutetodo calculate_means
                                                                                                                                                          • Meacutetodo get_mean
                                                                                                                                                          • Meacutetodo calculate_mean
                                                                                                                                                          • Meacutetodo set_leading_candidates
                                                                                                                                                          • Meacutetodo irv_set_leading_candidates
                                                                                                                                                          • Meacutetodo sort_ranks
                                                                                                                                                          • Meacutetodo fptp_count_tactical_votes
                                                                                                                                                          • Meacutetodo fptp_count_minority_votes
                                                                                                                                                          • Meacutetodo trs_second_round
                                                                                                                                                          • Meacutetodo trs_account_for_coalitions
                                                                                                                                                          • Meacutetodo irv_count_votes
                                                                                                                                                          • Meacutetodo avs_count_votes
                                                                                                                                                          • Meacutetodo avs_count_votes_with_tactical
                                                                                                                                                          • Meacutetodo irv_apply_tactical_votes
                                                                                                                                                          • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                                                                          • Meacutetodo bc_sum_candidates_scores
                                                                                                                                                          • Meacutetodo svs_apply_tactical_votes
                                                                                                                                                          • Meacutetodo svs_sum_candidates_scores
                                                                                                                                                          • Meacutetodo bv_count_votes

                                                                                                                56

                                                                                                                Figura 49 ndash PDF - Distribuiccedilatildeo Liked

                                                                                                                Figura 50 ndash CDF - Distribuiccedilatildeo Liked

                                                                                                                (dependendo do nuacutemero de vagas da eleiccedilatildeo) os candidatos no topo de cada ranking oque tambeacutem eacute feito no meacutetodo sort_ranks Esses rankings no entanto natildeo satildeo fixosainda existe a possibilidade da alteraccedilatildeo deles apoacutes a contabilizaccedilatildeo dos votos uacuteteis oque eacute feito de maneira diferente para cada sistema eleitoral e portanto cada um possuimeacutetodos proacuteprios Eacute importante ressaltar tambeacutem que os votos de todos os eleitores satildeocontabilizados ou seja no simulador natildeo existe a possibilidade de voto nulo ou voto embranco mesmo que um eleitor natildeo aprove nenhum candidato

                                                                                                                Apoacutes essa contabilizaccedilatildeo eacute necessaacuterio definir os candidatos que estatildeo na lideranccedila daseleiccedilotildees Isso eacute feito para definir quais candidatos seratildeo os alvos dos votos taacuteticos Os

                                                                                                                57

                                                                                                                Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

                                                                                                                Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

                                                                                                                candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

                                                                                                                Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

                                                                                                                58

                                                                                                                Figura 53 ndash PDF - Distribuiccedilatildeo Loved

                                                                                                                Figura 54 ndash CDF - Distribuiccedilatildeo Loved

                                                                                                                funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

                                                                                                                59

                                                                                                                Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                                                                                                                Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                                                                                                                Meacutedia das Notas sumei

                                                                                                                sumvj nij

                                                                                                                etimes v

                                                                                                                Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                                                                                                                Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                                                                                                                60

                                                                                                                Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                                                                                                                Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                                                                                                                52 CLASSE FIRSTPASTTHEPOST

                                                                                                                Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                                                                                                                Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                                                                                                                61

                                                                                                                Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                                                                                                                Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                                                                                                                mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                                                                                                                62

                                                                                                                53 CLASSE TWOROUNDSYSTEM

                                                                                                                A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                                                                                                                54 CLASSE INSTANTRUNOFFVOTING

                                                                                                                A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                                                                                                                Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                                                                                                                63

                                                                                                                cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                                                                                                                55 CLASSE APPROVALVOTING

                                                                                                                Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                                                                                                                56 CLASSE BORDACOUNT

                                                                                                                Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                                                                                                                57 CLASSE SCOREVOTING

                                                                                                                De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                                                                                                                64

                                                                                                                58 CLASSE BLOCVOTE

                                                                                                                O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                                                                                                                59 TECNOLOGIAS UTILIZADAS

                                                                                                                A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                                                                                                                Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                                                                                                                O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                                                                                                                Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                                                                                                                65

                                                                                                                6 CONCLUSAtildeO

                                                                                                                Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                                                                                                                Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                                                                                                                Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                                                                                                                Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                                                                                                                Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                                                                                                                66

                                                                                                                REFEREcircNCIAS

                                                                                                                AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                                                                                                                Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                                                                                                                Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                                                                                                                Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                                                                                                                HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                                                                                                                LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                                                                                                                ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                                                                                                                Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                                                                                                                POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                                                                                                                The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                                                                                                                67

                                                                                                                APEcircNDICES

                                                                                                                APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                                                                                                Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                                                                                                if(not len(selfvoter_profiles))

                                                                                                                for voter in range(selfN_VOTERS)

                                                                                                                candidates_rank = dict()

                                                                                                                for candidate in reversed(range(selfN_CANDIDATES))

                                                                                                                if(selfBIAS_VECTOR[candidate]==4)

                                                                                                                candidates_rank[candidate] = self_sortear(selfloved)

                                                                                                                elif(selfBIAS_VECTOR[candidate]==3)

                                                                                                                candidates_rank[candidate] = self_sortear(selfliked)

                                                                                                                elif(selfBIAS_VECTOR[candidate]==2)

                                                                                                                candidates_rank[candidate] = self_sortear(selfdisliked)

                                                                                                                elif(selfBIAS_VECTOR[candidate]==1)

                                                                                                                candidates_rank[candidate] = self_sortear(selfhated)

                                                                                                                elif(selfBIAS_VECTOR[candidate]==-1)

                                                                                                                candidates_rank[candidate] = self_sortear(selfpolarizer

                                                                                                                )

                                                                                                                elif(selfBIAS_VECTOR[candidate]==-2)

                                                                                                                candidates_rank[candidate] = self_sortear(self

                                                                                                                more_polarizer)

                                                                                                                else

                                                                                                                candidates_rank[candidate] = self_sortear(selfneutral)

                                                                                                                selfvotersappend(candidates_rank)

                                                                                                                else

                                                                                                                ranges = []

                                                                                                                ranks = []

                                                                                                                for prof in selfvoter_profiles

                                                                                                                rangesappend(int(prof[pop_percentage]))

                                                                                                                rank =

                                                                                                                for index score in enumerate(prof[scores])

                                                                                                                rank[index] = score

                                                                                                                ranksappend(rank)

                                                                                                                for index _range in enumerate(ranges)

                                                                                                                for _ in range(int(selfN_VOTERS(_range100)))

                                                                                                                selfvotersappend(ranks[index])

                                                                                                                68

                                                                                                                APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                                                                                                Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                                                                                                for i in range(selfN_CANDIDATES)

                                                                                                                selfcandidates[i] = 0

                                                                                                                selfvotes[i] = set()

                                                                                                                APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                                                                                                Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                                                                                                for candidate in range(selfN_CANDIDATES)

                                                                                                                rating_sum = 0

                                                                                                                for voter in selfvoters

                                                                                                                rating_sum += voter[candidate]

                                                                                                                selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                                                                                                APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                                                                                                Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                                                                                                if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                                                                                                return selfcalculate_mean(winners)

                                                                                                                else

                                                                                                                chose_best = True if winners[0] == selfbest_candidate else

                                                                                                                False

                                                                                                                return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                                                                                                69

                                                                                                                APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                                                                                                Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                                                                                                rating_sum = 0

                                                                                                                for voter in selfvoters

                                                                                                                for candidate in winners

                                                                                                                rating_sum += voter[candidate]

                                                                                                                return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                                                                                                APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                                                                                                Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                                                                                                for i in range(1 selfN_VACANCIES + 2)

                                                                                                                selfleading_candidatesappend(selfsorted_candidates[-i][self

                                                                                                                CANDIDATE_INDEX])

                                                                                                                APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                                                                                                Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                                                                                                for leader in selfelecrounds[-1]

                                                                                                                selfleading_candidatesappend(leader[0])

                                                                                                                70

                                                                                                                APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                                                                                                Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                                                                                                self_account_for_coalitions()

                                                                                                                for voter in selfvoters

                                                                                                                selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                                                                                                (1)))

                                                                                                                temp = []

                                                                                                                for voter in selfsorted_voters

                                                                                                                new_dict = defaultdict(list)

                                                                                                                for k in voter

                                                                                                                new_dict[k[1]]append(k[0])

                                                                                                                tempappend(new_dict)

                                                                                                                selfsorted_voters = []

                                                                                                                for voter_index current_voter in enumerate(temp)

                                                                                                                new_voter = []

                                                                                                                for rating candidate_indexes in current_voteritems()

                                                                                                                if len(current_voter[rating]) gt 1

                                                                                                                shuffle(current_voter[rating])

                                                                                                                for e in candidate_indexes

                                                                                                                new_voterappend((e rating))

                                                                                                                else

                                                                                                                new_voterappend((candidate_indexes[0] rating))

                                                                                                                selfsorted_votersappend(new_voter)

                                                                                                                selfcandidates[new_voter[-1][0]] += 1

                                                                                                                selfvotes[new_voter[-1][0]]add(voter_index)

                                                                                                                71

                                                                                                                APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                                                                                                Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                                                                                                for candidate in selfvotes_copy

                                                                                                                if candidate not in selfelecleading_candidates

                                                                                                                for voter_index in selfvotes_copy[candidate]

                                                                                                                for index _candidate in enumerate(reversed(selfelec

                                                                                                                sorted_voters[voter_index]))

                                                                                                                if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                                                                                                leading_candidates

                                                                                                                if randomrandom() lt selfelec

                                                                                                                tactical_vote_percentages[_candidate[selfelec

                                                                                                                CANDIDATE_INDEX]]

                                                                                                                selfrankings_changed[voter_index] = copy

                                                                                                                deepcopy(selfelecsorted_voters[voter_index])

                                                                                                                selfrankings_changed[voter_index][-(index + 1)]

                                                                                                                selfrankings_changed[voter_index][-1] = self

                                                                                                                rankings_changed[voter_index][-1] self

                                                                                                                rankings_changed[voter_index][-(index + 1)]

                                                                                                                selfcandidates[candidate] -= 1

                                                                                                                selfcandidates[_candidate[selfelec

                                                                                                                CANDIDATE_INDEX]] += 1

                                                                                                                selfvotes[candidate]remove(voter_index)

                                                                                                                selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                                                                                                ]]add(voter_index)

                                                                                                                break

                                                                                                                break

                                                                                                                72

                                                                                                                APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                                                                                                Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                                                                                                half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                                                                                                for candidate in selfelecleading_candidates

                                                                                                                if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                                                                                                continue

                                                                                                                for voter_index in selfvotes_copy[candidate]

                                                                                                                if voter_index in selfrankings_changed

                                                                                                                ranking = selfrankings_changed[voter_index]

                                                                                                                else

                                                                                                                ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                                                                                                ])

                                                                                                                for index _candidate in enumerate(reversed(ranking))

                                                                                                                if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                leading_candidates or (_candidate[selfelec

                                                                                                                CANDIDATE_INDEX] in selfelecleading_candidates and

                                                                                                                selfelecleading_candidatesindex(_candidate[selfelec

                                                                                                                CANDIDATE_INDEX]) gt= half_vacancies)

                                                                                                                if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                                                                                                if randomrandom() lt selfelec

                                                                                                                minority_vote_percentages[_candidate[selfelec

                                                                                                                CANDIDATE_INDEX]]

                                                                                                                selfcandidates[candidate] -= 1

                                                                                                                selfcandidates[_candidate[selfelec

                                                                                                                CANDIDATE_INDEX]] += 1

                                                                                                                break

                                                                                                                break

                                                                                                                break

                                                                                                                73

                                                                                                                APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                                                                                                Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                                                                                                self_account_for_coalitions()

                                                                                                                for candidate in selfvotes

                                                                                                                if candidate = selfwinner and candidate = selfsecond_place

                                                                                                                for voter_index in selfvotes[candidate]

                                                                                                                if voter_index in selfrankings_changed

                                                                                                                ranking = selfrankings_changed[voter_index]

                                                                                                                else

                                                                                                                ranking = copydeepcopy(selfelecsorted_voters[

                                                                                                                voter_index])

                                                                                                                for index2 candidate in enumerate(reversed(ranking))

                                                                                                                if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                                                                                                selfcandidates[selfwinner] += 1

                                                                                                                selfvotes[selfwinner]add(voter_index)

                                                                                                                break

                                                                                                                elif candidate[selfelecCANDIDATE_INDEX] == self

                                                                                                                second_place

                                                                                                                selfcandidates[selfsecond_place] += 1

                                                                                                                selfvotes[selfsecond_place]add(voter_index)

                                                                                                                break

                                                                                                                selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                                winners = []

                                                                                                                vacancies = selfelecN_VACANCIES

                                                                                                                for candidate in reversed(selfsorted_candidates)

                                                                                                                if vacancies == 0

                                                                                                                break

                                                                                                                winnersappend(candidate[0])

                                                                                                                vacancies -= 1

                                                                                                                mean chose_best = selfelecget_mean(winners = winners)

                                                                                                                74

                                                                                                                APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                                                                                                Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                                                                                                for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                voter_dict = dict()

                                                                                                                og_voter_dict = dict()

                                                                                                                for tup in voter

                                                                                                                voter_dict[tup[0]] = tup[1]

                                                                                                                og_voter_dict[tup[0]] = tup[1]

                                                                                                                for coalition in selfeleccoalitions

                                                                                                                for candidate in coalition

                                                                                                                add_to_score = 0

                                                                                                                for candidate2 in coalition

                                                                                                                if candidate == candidate2

                                                                                                                continue

                                                                                                                half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                                                                                                if half lt 0

                                                                                                                add_to_score += mathceil(half)

                                                                                                                else

                                                                                                                add_to_score += mathfloor(half)

                                                                                                                if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                                                                                                voter_dict[candidate[rsquovaluersquo]] = 10

                                                                                                                elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                                                                                                voter_dict[candidate[rsquovaluersquo]] = -10

                                                                                                                else

                                                                                                                voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                                                                                                selfrankings_changed[voter_index] = []

                                                                                                                for candidate in voter_dict

                                                                                                                selfrankings_changed[voter_index]append((candidate voter_dict[

                                                                                                                candidate]))

                                                                                                                selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                                                                                                voter_index] key=lambda x x[1])

                                                                                                                75

                                                                                                                APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                                                                                Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                                                                                selfelecroundsappend(selfsorted_candidates[_round])

                                                                                                                if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                                N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                                                                                N_VACANCIES - 1)

                                                                                                                return 2

                                                                                                                elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                                N_VOTERS gt 05)

                                                                                                                return 1

                                                                                                                else

                                                                                                                selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                                                                                CANDIDATE_INDEX])

                                                                                                                for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                                                                                elecCANDIDATE_INDEX]]

                                                                                                                if voter_index in selfrankings_changed

                                                                                                                for candidate in reversed(selfrankings_changed[voter_index

                                                                                                                ])

                                                                                                                if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                excluded

                                                                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                                ]] += 1

                                                                                                                selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                                add(voter_index)

                                                                                                                break

                                                                                                                else

                                                                                                                continue

                                                                                                                else

                                                                                                                for candidate in reversed(selfelecsorted_voters[

                                                                                                                voter_index])

                                                                                                                if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                excluded

                                                                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                                ]] += 1

                                                                                                                selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                                add(voter_index)

                                                                                                                break

                                                                                                                else

                                                                                                                continue

                                                                                                                selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                                return 0

                                                                                                                76

                                                                                                                APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                                                                                Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                                                                                for index in range(selfelecN_CANDIDATES)

                                                                                                                selfcandidates[index] = 0

                                                                                                                for voter in selfelecsorted_voters

                                                                                                                for candidate in reversed(voter)

                                                                                                                if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                else

                                                                                                                break

                                                                                                                APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                                                                                Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                                                                                for index in range(selfelecN_CANDIDATES)

                                                                                                                selfcandidates[index] = 0

                                                                                                                for voter in selfelecsorted_voters

                                                                                                                if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                                elecCANDIDATE_INDEX]]

                                                                                                                selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                                                                                else

                                                                                                                for candidate in reversed(voter)

                                                                                                                if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                else

                                                                                                                break

                                                                                                                77

                                                                                                                APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                                                                                Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                                                                                pos = set()

                                                                                                                for index perc in enumerate(selfelectactical_vote_percentages)

                                                                                                                if perc gt 0

                                                                                                                posadd(index)

                                                                                                                for candidate in selfeleccandidates

                                                                                                                if candidate not in selfleading_candidates

                                                                                                                for voter_index in selfvotes[candidate]

                                                                                                                raised = None

                                                                                                                for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                                                                                ])

                                                                                                                if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                                                                                leading_candidates

                                                                                                                if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                                                                                if randomrandom() lt selfelectactical_vote_percentages[

                                                                                                                candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                                                                                ranking = [None]selfelecN_CANDIDATES

                                                                                                                ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                CANDIDATE_INDEX]])

                                                                                                                raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                break

                                                                                                                break

                                                                                                                break

                                                                                                                if raised = None

                                                                                                                for _candidate in selfleading_candidates

                                                                                                                if _candidate = ranking[-1][0]

                                                                                                                ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                                _candidate])

                                                                                                                buried = _candidate

                                                                                                                break

                                                                                                                i = 1

                                                                                                                for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                                if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                                                                                buried]

                                                                                                                continue

                                                                                                                else

                                                                                                                ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                CANDIDATE_INDEX]])

                                                                                                                i += 1

                                                                                                                selfrankings_changed[voter_index] = ranking

                                                                                                                78

                                                                                                                APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                                                                                Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                                                                                for voter_index in selfvotes[candidate]

                                                                                                                if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                                                                                ]

                                                                                                                for _candidate in selfleading_candidates

                                                                                                                if _candidate = candidate

                                                                                                                ranking = [None]selfelecN_CANDIDATES

                                                                                                                ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                                _candidate])

                                                                                                                buried = _candidate

                                                                                                                break

                                                                                                                i = 1

                                                                                                                for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                                if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                                                                                continue

                                                                                                                else

                                                                                                                ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                CANDIDATE_INDEX]])

                                                                                                                i += 1

                                                                                                                selfrankings_changed[voter_index] = ranking

                                                                                                                79

                                                                                                                APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                                                                                Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                                                                                for index in range(selfelecN_CANDIDATES)

                                                                                                                selfcandidates[index] = 0

                                                                                                                for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                score = 0

                                                                                                                if voter_index in selfrankings_changed

                                                                                                                for candidate in selfrankings_changed[voter_index]

                                                                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                                score += 1

                                                                                                                else

                                                                                                                for candidate in voter

                                                                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                                score += 1

                                                                                                                APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                                                                                Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                                                                                for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                                elecCANDIDATE_INDEX]]

                                                                                                                selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                                                                                sorted_voters[voter_index])

                                                                                                                for candidate_index candidate in enumerate(reversed(voter))

                                                                                                                if candidate_index == 0

                                                                                                                selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                                voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                                                                                else

                                                                                                                selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                                voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                                                                                80

                                                                                                                APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                                                                                Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                                                                                for index in range(selfelecN_CANDIDATES)

                                                                                                                selfcandidates[index] = 0

                                                                                                                for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                if voter_index in selfrankings_changed

                                                                                                                for candidate in selfrankings_changed[voter_index]

                                                                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                                selfelecCANDIDATE_RANK]

                                                                                                                else

                                                                                                                for candidate in voter

                                                                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                                selfelecCANDIDATE_RANK]

                                                                                                                APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                                                                                Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                                                                                for index in range(selfelecN_CANDIDATES)

                                                                                                                selfcandidates[index] = 0

                                                                                                                for voter in selfelecsorted_voters

                                                                                                                votes = selfelecN_VACANCIES

                                                                                                                for candidate in reversed(voter)

                                                                                                                if votes == 0

                                                                                                                break

                                                                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                votes -= 1

                                                                                                                • Folha de aprovaccedilatildeo
                                                                                                                • Agradecimentos
                                                                                                                • Epiacutegrafe
                                                                                                                • Resumo
                                                                                                                • Abstract
                                                                                                                • Lista de ilustraccedilotildees
                                                                                                                • Lista de Coacutedigos
                                                                                                                • Lista de tabelas
                                                                                                                • Lista de abreviaturas e siglas
                                                                                                                • Sumaacuterio
                                                                                                                • INTRODUCcedilAtildeO
                                                                                                                  • MOTIVACcedilAtildeO E OBJETIVO
                                                                                                                  • MEacuteTODO
                                                                                                                  • ESTRUTURA
                                                                                                                    • SISTEMAS ELEITORAIS
                                                                                                                      • FISRT PAST THE POST
                                                                                                                        • Exemplo
                                                                                                                        • Vantagens e Desvantagens do FPTP
                                                                                                                        • Voto Uacutetil no FPTP
                                                                                                                          • TWO-ROUND SYSTEM
                                                                                                                            • Exemplo
                                                                                                                            • Vantagens e Desvantagens do TRS
                                                                                                                            • Voto Uacutetil no TRS
                                                                                                                              • INSTANT-RUNOFF VOTING
                                                                                                                                • Exemplo
                                                                                                                                • Vantagens e Desvantagens do IRV
                                                                                                                                • Voto Uacutetil no IRV
                                                                                                                                  • APPROVAL VOTING SYSTEM
                                                                                                                                    • Exemplo
                                                                                                                                    • Vantagens e Desvantagens do AVS
                                                                                                                                    • Voto Uacutetil no AVS
                                                                                                                                      • THE BORDA COUNT
                                                                                                                                        • Exemplo
                                                                                                                                        • Vantagens e Desvantagens do BC
                                                                                                                                        • Voto Uacutetil no BC
                                                                                                                                          • SCORE VOTING SYSTEM
                                                                                                                                            • Exemplo
                                                                                                                                            • Vantagens e Desvantagens do SVS
                                                                                                                                            • Voto Uacutetil no SVS
                                                                                                                                              • BLOC VOTE
                                                                                                                                                • Exemplo
                                                                                                                                                • Voto Uacutetil no BV
                                                                                                                                                    • O SIMULADOR
                                                                                                                                                    • CENAacuteRIOS PERTINENTES
                                                                                                                                                      • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                                                                      • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                                                                      • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                                                                      • CENAacuteRIO 4 COALIZOtildeES
                                                                                                                                                      • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                                                                      • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                                                                        • COMO FUNCIONA O SIMULADOR
                                                                                                                                                          • CLASSE Elections
                                                                                                                                                          • CLASSE FirstPastThePost
                                                                                                                                                          • CLASSE TwoRoundSystem
                                                                                                                                                          • CLASSE InstantRunoffVoting
                                                                                                                                                          • CLASSE ApprovalVoting
                                                                                                                                                          • CLASSE BordaCount
                                                                                                                                                          • CLASSE ScoreVoting
                                                                                                                                                          • CLASSE BlocVote
                                                                                                                                                          • TECNOLOGIAS UTILIZADAS
                                                                                                                                                            • CONCLUSAtildeO
                                                                                                                                                            • Referecircncias
                                                                                                                                                            • Meacutetodo create_voters
                                                                                                                                                            • Meacutetodo create_candidates
                                                                                                                                                            • Meacutetodo calculate_means
                                                                                                                                                            • Meacutetodo get_mean
                                                                                                                                                            • Meacutetodo calculate_mean
                                                                                                                                                            • Meacutetodo set_leading_candidates
                                                                                                                                                            • Meacutetodo irv_set_leading_candidates
                                                                                                                                                            • Meacutetodo sort_ranks
                                                                                                                                                            • Meacutetodo fptp_count_tactical_votes
                                                                                                                                                            • Meacutetodo fptp_count_minority_votes
                                                                                                                                                            • Meacutetodo trs_second_round
                                                                                                                                                            • Meacutetodo trs_account_for_coalitions
                                                                                                                                                            • Meacutetodo irv_count_votes
                                                                                                                                                            • Meacutetodo avs_count_votes
                                                                                                                                                            • Meacutetodo avs_count_votes_with_tactical
                                                                                                                                                            • Meacutetodo irv_apply_tactical_votes
                                                                                                                                                            • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                                                                            • Meacutetodo bc_sum_candidates_scores
                                                                                                                                                            • Meacutetodo svs_apply_tactical_votes
                                                                                                                                                            • Meacutetodo svs_sum_candidates_scores
                                                                                                                                                            • Meacutetodo bv_count_votes

                                                                                                                  57

                                                                                                                  Figura 51 ndash PDF - Distribuiccedilatildeo Disliked

                                                                                                                  Figura 52 ndash CDF - Distribuiccedilatildeo Disliked

                                                                                                                  candidatos que satildeo considerados como liacutederes satildeo iguais aos primeiros n+1 candidatosonde n eacute o nuacutemero de vagas ofertadas A definiccedilatildeo dos liacutederes eacute feita com o meacutetodoset_leading_candidates (apecircndice F) Com isso a simulaccedilatildeo do sistema FPTPestaacute quase completa e a classe FirstPastThePost apenas lidaraacute com os votos uacuteteis

                                                                                                                  Para cada sistema o simulador notifica se ele elegeu o melhor candidato Apoacutes acriaccedilatildeo dos eleitores o meacutetodo calculate_means (apecircndice C) calcula as meacutedia dasnotas de cada candidato e as guarda em um dicionaacuterio chamado stats Quando umsistema escolhe um candidato esse dicionaacuterio eacute checado e o meacutetodo get_mean (apecircndiceD) retorna a proacutepria meacutedia e True se esta eacute a maior meacutedia entre os candidatos Essa

                                                                                                                  58

                                                                                                                  Figura 53 ndash PDF - Distribuiccedilatildeo Loved

                                                                                                                  Figura 54 ndash CDF - Distribuiccedilatildeo Loved

                                                                                                                  funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

                                                                                                                  59

                                                                                                                  Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                                                                                                                  Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                                                                                                                  Meacutedia das Notas sumei

                                                                                                                  sumvj nij

                                                                                                                  etimes v

                                                                                                                  Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                                                                                                                  Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                                                                                                                  60

                                                                                                                  Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                                                                                                                  Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                                                                                                                  52 CLASSE FIRSTPASTTHEPOST

                                                                                                                  Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                                                                                                                  Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                                                                                                                  61

                                                                                                                  Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                                                                                                                  Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                                                                                                                  mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                                                                                                                  62

                                                                                                                  53 CLASSE TWOROUNDSYSTEM

                                                                                                                  A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                                                                                                                  54 CLASSE INSTANTRUNOFFVOTING

                                                                                                                  A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                                                                                                                  Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                                                                                                                  63

                                                                                                                  cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                                                                                                                  55 CLASSE APPROVALVOTING

                                                                                                                  Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                                                                                                                  56 CLASSE BORDACOUNT

                                                                                                                  Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                                                                                                                  57 CLASSE SCOREVOTING

                                                                                                                  De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                                                                                                                  64

                                                                                                                  58 CLASSE BLOCVOTE

                                                                                                                  O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                                                                                                                  59 TECNOLOGIAS UTILIZADAS

                                                                                                                  A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                                                                                                                  Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                                                                                                                  O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                                                                                                                  Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                                                                                                                  65

                                                                                                                  6 CONCLUSAtildeO

                                                                                                                  Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                                                                                                                  Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                                                                                                                  Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                                                                                                                  Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                                                                                                                  Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                                                                                                                  66

                                                                                                                  REFEREcircNCIAS

                                                                                                                  AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                                                                                                                  Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                                                                                                                  Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                                                                                                                  Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                                                                                                                  HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                                                                                                                  LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                                                                                                                  ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                                                                                                                  Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                                                                                                                  POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                                                                                                                  The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                                                                                                                  67

                                                                                                                  APEcircNDICES

                                                                                                                  APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                                                                                                  Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                                                                                                  if(not len(selfvoter_profiles))

                                                                                                                  for voter in range(selfN_VOTERS)

                                                                                                                  candidates_rank = dict()

                                                                                                                  for candidate in reversed(range(selfN_CANDIDATES))

                                                                                                                  if(selfBIAS_VECTOR[candidate]==4)

                                                                                                                  candidates_rank[candidate] = self_sortear(selfloved)

                                                                                                                  elif(selfBIAS_VECTOR[candidate]==3)

                                                                                                                  candidates_rank[candidate] = self_sortear(selfliked)

                                                                                                                  elif(selfBIAS_VECTOR[candidate]==2)

                                                                                                                  candidates_rank[candidate] = self_sortear(selfdisliked)

                                                                                                                  elif(selfBIAS_VECTOR[candidate]==1)

                                                                                                                  candidates_rank[candidate] = self_sortear(selfhated)

                                                                                                                  elif(selfBIAS_VECTOR[candidate]==-1)

                                                                                                                  candidates_rank[candidate] = self_sortear(selfpolarizer

                                                                                                                  )

                                                                                                                  elif(selfBIAS_VECTOR[candidate]==-2)

                                                                                                                  candidates_rank[candidate] = self_sortear(self

                                                                                                                  more_polarizer)

                                                                                                                  else

                                                                                                                  candidates_rank[candidate] = self_sortear(selfneutral)

                                                                                                                  selfvotersappend(candidates_rank)

                                                                                                                  else

                                                                                                                  ranges = []

                                                                                                                  ranks = []

                                                                                                                  for prof in selfvoter_profiles

                                                                                                                  rangesappend(int(prof[pop_percentage]))

                                                                                                                  rank =

                                                                                                                  for index score in enumerate(prof[scores])

                                                                                                                  rank[index] = score

                                                                                                                  ranksappend(rank)

                                                                                                                  for index _range in enumerate(ranges)

                                                                                                                  for _ in range(int(selfN_VOTERS(_range100)))

                                                                                                                  selfvotersappend(ranks[index])

                                                                                                                  68

                                                                                                                  APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                                                                                                  Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                                                                                                  for i in range(selfN_CANDIDATES)

                                                                                                                  selfcandidates[i] = 0

                                                                                                                  selfvotes[i] = set()

                                                                                                                  APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                                                                                                  Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                                                                                                  for candidate in range(selfN_CANDIDATES)

                                                                                                                  rating_sum = 0

                                                                                                                  for voter in selfvoters

                                                                                                                  rating_sum += voter[candidate]

                                                                                                                  selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                                                                                                  APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                                                                                                  Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                                                                                                  if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                                                                                                  return selfcalculate_mean(winners)

                                                                                                                  else

                                                                                                                  chose_best = True if winners[0] == selfbest_candidate else

                                                                                                                  False

                                                                                                                  return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                                                                                                  69

                                                                                                                  APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                                                                                                  Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                                                                                                  rating_sum = 0

                                                                                                                  for voter in selfvoters

                                                                                                                  for candidate in winners

                                                                                                                  rating_sum += voter[candidate]

                                                                                                                  return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                                                                                                  APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                                                                                                  Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                                                                                                  for i in range(1 selfN_VACANCIES + 2)

                                                                                                                  selfleading_candidatesappend(selfsorted_candidates[-i][self

                                                                                                                  CANDIDATE_INDEX])

                                                                                                                  APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                                                                                                  Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                                                                                                  for leader in selfelecrounds[-1]

                                                                                                                  selfleading_candidatesappend(leader[0])

                                                                                                                  70

                                                                                                                  APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                                                                                                  Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                                                                                                  self_account_for_coalitions()

                                                                                                                  for voter in selfvoters

                                                                                                                  selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                                                                                                  (1)))

                                                                                                                  temp = []

                                                                                                                  for voter in selfsorted_voters

                                                                                                                  new_dict = defaultdict(list)

                                                                                                                  for k in voter

                                                                                                                  new_dict[k[1]]append(k[0])

                                                                                                                  tempappend(new_dict)

                                                                                                                  selfsorted_voters = []

                                                                                                                  for voter_index current_voter in enumerate(temp)

                                                                                                                  new_voter = []

                                                                                                                  for rating candidate_indexes in current_voteritems()

                                                                                                                  if len(current_voter[rating]) gt 1

                                                                                                                  shuffle(current_voter[rating])

                                                                                                                  for e in candidate_indexes

                                                                                                                  new_voterappend((e rating))

                                                                                                                  else

                                                                                                                  new_voterappend((candidate_indexes[0] rating))

                                                                                                                  selfsorted_votersappend(new_voter)

                                                                                                                  selfcandidates[new_voter[-1][0]] += 1

                                                                                                                  selfvotes[new_voter[-1][0]]add(voter_index)

                                                                                                                  71

                                                                                                                  APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                                                                                                  Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                                                                                                  for candidate in selfvotes_copy

                                                                                                                  if candidate not in selfelecleading_candidates

                                                                                                                  for voter_index in selfvotes_copy[candidate]

                                                                                                                  for index _candidate in enumerate(reversed(selfelec

                                                                                                                  sorted_voters[voter_index]))

                                                                                                                  if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                                                                                                  leading_candidates

                                                                                                                  if randomrandom() lt selfelec

                                                                                                                  tactical_vote_percentages[_candidate[selfelec

                                                                                                                  CANDIDATE_INDEX]]

                                                                                                                  selfrankings_changed[voter_index] = copy

                                                                                                                  deepcopy(selfelecsorted_voters[voter_index])

                                                                                                                  selfrankings_changed[voter_index][-(index + 1)]

                                                                                                                  selfrankings_changed[voter_index][-1] = self

                                                                                                                  rankings_changed[voter_index][-1] self

                                                                                                                  rankings_changed[voter_index][-(index + 1)]

                                                                                                                  selfcandidates[candidate] -= 1

                                                                                                                  selfcandidates[_candidate[selfelec

                                                                                                                  CANDIDATE_INDEX]] += 1

                                                                                                                  selfvotes[candidate]remove(voter_index)

                                                                                                                  selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                                                                                                  ]]add(voter_index)

                                                                                                                  break

                                                                                                                  break

                                                                                                                  72

                                                                                                                  APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                                                                                                  Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                                                                                                  half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                                                                                                  for candidate in selfelecleading_candidates

                                                                                                                  if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                                                                                                  continue

                                                                                                                  for voter_index in selfvotes_copy[candidate]

                                                                                                                  if voter_index in selfrankings_changed

                                                                                                                  ranking = selfrankings_changed[voter_index]

                                                                                                                  else

                                                                                                                  ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                                                                                                  ])

                                                                                                                  for index _candidate in enumerate(reversed(ranking))

                                                                                                                  if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                  leading_candidates or (_candidate[selfelec

                                                                                                                  CANDIDATE_INDEX] in selfelecleading_candidates and

                                                                                                                  selfelecleading_candidatesindex(_candidate[selfelec

                                                                                                                  CANDIDATE_INDEX]) gt= half_vacancies)

                                                                                                                  if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                                                                                                  if randomrandom() lt selfelec

                                                                                                                  minority_vote_percentages[_candidate[selfelec

                                                                                                                  CANDIDATE_INDEX]]

                                                                                                                  selfcandidates[candidate] -= 1

                                                                                                                  selfcandidates[_candidate[selfelec

                                                                                                                  CANDIDATE_INDEX]] += 1

                                                                                                                  break

                                                                                                                  break

                                                                                                                  break

                                                                                                                  73

                                                                                                                  APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                                                                                                  Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                                                                                                  self_account_for_coalitions()

                                                                                                                  for candidate in selfvotes

                                                                                                                  if candidate = selfwinner and candidate = selfsecond_place

                                                                                                                  for voter_index in selfvotes[candidate]

                                                                                                                  if voter_index in selfrankings_changed

                                                                                                                  ranking = selfrankings_changed[voter_index]

                                                                                                                  else

                                                                                                                  ranking = copydeepcopy(selfelecsorted_voters[

                                                                                                                  voter_index])

                                                                                                                  for index2 candidate in enumerate(reversed(ranking))

                                                                                                                  if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                                                                                                  selfcandidates[selfwinner] += 1

                                                                                                                  selfvotes[selfwinner]add(voter_index)

                                                                                                                  break

                                                                                                                  elif candidate[selfelecCANDIDATE_INDEX] == self

                                                                                                                  second_place

                                                                                                                  selfcandidates[selfsecond_place] += 1

                                                                                                                  selfvotes[selfsecond_place]add(voter_index)

                                                                                                                  break

                                                                                                                  selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                                  winners = []

                                                                                                                  vacancies = selfelecN_VACANCIES

                                                                                                                  for candidate in reversed(selfsorted_candidates)

                                                                                                                  if vacancies == 0

                                                                                                                  break

                                                                                                                  winnersappend(candidate[0])

                                                                                                                  vacancies -= 1

                                                                                                                  mean chose_best = selfelecget_mean(winners = winners)

                                                                                                                  74

                                                                                                                  APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                                                                                                  Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                                                                                                  for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                  voter_dict = dict()

                                                                                                                  og_voter_dict = dict()

                                                                                                                  for tup in voter

                                                                                                                  voter_dict[tup[0]] = tup[1]

                                                                                                                  og_voter_dict[tup[0]] = tup[1]

                                                                                                                  for coalition in selfeleccoalitions

                                                                                                                  for candidate in coalition

                                                                                                                  add_to_score = 0

                                                                                                                  for candidate2 in coalition

                                                                                                                  if candidate == candidate2

                                                                                                                  continue

                                                                                                                  half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                                                                                                  if half lt 0

                                                                                                                  add_to_score += mathceil(half)

                                                                                                                  else

                                                                                                                  add_to_score += mathfloor(half)

                                                                                                                  if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                                                                                                  voter_dict[candidate[rsquovaluersquo]] = 10

                                                                                                                  elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                                                                                                  voter_dict[candidate[rsquovaluersquo]] = -10

                                                                                                                  else

                                                                                                                  voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                                                                                                  selfrankings_changed[voter_index] = []

                                                                                                                  for candidate in voter_dict

                                                                                                                  selfrankings_changed[voter_index]append((candidate voter_dict[

                                                                                                                  candidate]))

                                                                                                                  selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                                                                                                  voter_index] key=lambda x x[1])

                                                                                                                  75

                                                                                                                  APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                                                                                  Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                                                                                  selfelecroundsappend(selfsorted_candidates[_round])

                                                                                                                  if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                                  N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                                                                                  N_VACANCIES - 1)

                                                                                                                  return 2

                                                                                                                  elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                                  N_VOTERS gt 05)

                                                                                                                  return 1

                                                                                                                  else

                                                                                                                  selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                                                                                  CANDIDATE_INDEX])

                                                                                                                  for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                                                                                  elecCANDIDATE_INDEX]]

                                                                                                                  if voter_index in selfrankings_changed

                                                                                                                  for candidate in reversed(selfrankings_changed[voter_index

                                                                                                                  ])

                                                                                                                  if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                  excluded

                                                                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                                  ]] += 1

                                                                                                                  selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                                  add(voter_index)

                                                                                                                  break

                                                                                                                  else

                                                                                                                  continue

                                                                                                                  else

                                                                                                                  for candidate in reversed(selfelecsorted_voters[

                                                                                                                  voter_index])

                                                                                                                  if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                  excluded

                                                                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                                  ]] += 1

                                                                                                                  selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                                  add(voter_index)

                                                                                                                  break

                                                                                                                  else

                                                                                                                  continue

                                                                                                                  selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                                  return 0

                                                                                                                  76

                                                                                                                  APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                                                                                  Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                                                                                  for index in range(selfelecN_CANDIDATES)

                                                                                                                  selfcandidates[index] = 0

                                                                                                                  for voter in selfelecsorted_voters

                                                                                                                  for candidate in reversed(voter)

                                                                                                                  if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                  else

                                                                                                                  break

                                                                                                                  APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                                                                                  Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                                                                                  for index in range(selfelecN_CANDIDATES)

                                                                                                                  selfcandidates[index] = 0

                                                                                                                  for voter in selfelecsorted_voters

                                                                                                                  if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                                  elecCANDIDATE_INDEX]]

                                                                                                                  selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                                                                                  else

                                                                                                                  for candidate in reversed(voter)

                                                                                                                  if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                  else

                                                                                                                  break

                                                                                                                  77

                                                                                                                  APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                                                                                  Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                                                                                  pos = set()

                                                                                                                  for index perc in enumerate(selfelectactical_vote_percentages)

                                                                                                                  if perc gt 0

                                                                                                                  posadd(index)

                                                                                                                  for candidate in selfeleccandidates

                                                                                                                  if candidate not in selfleading_candidates

                                                                                                                  for voter_index in selfvotes[candidate]

                                                                                                                  raised = None

                                                                                                                  for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                                                                                  ])

                                                                                                                  if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                                                                                  leading_candidates

                                                                                                                  if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                                                                                  if randomrandom() lt selfelectactical_vote_percentages[

                                                                                                                  candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                                                                                  ranking = [None]selfelecN_CANDIDATES

                                                                                                                  ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                  selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                  CANDIDATE_INDEX]])

                                                                                                                  raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                  break

                                                                                                                  break

                                                                                                                  break

                                                                                                                  if raised = None

                                                                                                                  for _candidate in selfleading_candidates

                                                                                                                  if _candidate = ranking[-1][0]

                                                                                                                  ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                                  _candidate])

                                                                                                                  buried = _candidate

                                                                                                                  break

                                                                                                                  i = 1

                                                                                                                  for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                                  if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                                                                                  buried]

                                                                                                                  continue

                                                                                                                  else

                                                                                                                  ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                  selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                  CANDIDATE_INDEX]])

                                                                                                                  i += 1

                                                                                                                  selfrankings_changed[voter_index] = ranking

                                                                                                                  78

                                                                                                                  APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                                                                                  Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                                                                                  for voter_index in selfvotes[candidate]

                                                                                                                  if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                                                                                  ]

                                                                                                                  for _candidate in selfleading_candidates

                                                                                                                  if _candidate = candidate

                                                                                                                  ranking = [None]selfelecN_CANDIDATES

                                                                                                                  ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                                  _candidate])

                                                                                                                  buried = _candidate

                                                                                                                  break

                                                                                                                  i = 1

                                                                                                                  for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                                  if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                                                                                  continue

                                                                                                                  else

                                                                                                                  ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                  selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                  CANDIDATE_INDEX]])

                                                                                                                  i += 1

                                                                                                                  selfrankings_changed[voter_index] = ranking

                                                                                                                  79

                                                                                                                  APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                                                                                  Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                                                                                  for index in range(selfelecN_CANDIDATES)

                                                                                                                  selfcandidates[index] = 0

                                                                                                                  for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                  score = 0

                                                                                                                  if voter_index in selfrankings_changed

                                                                                                                  for candidate in selfrankings_changed[voter_index]

                                                                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                                  score += 1

                                                                                                                  else

                                                                                                                  for candidate in voter

                                                                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                                  score += 1

                                                                                                                  APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                                                                                  Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                                                                                  for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                  if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                                  elecCANDIDATE_INDEX]]

                                                                                                                  selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                                                                                  sorted_voters[voter_index])

                                                                                                                  for candidate_index candidate in enumerate(reversed(voter))

                                                                                                                  if candidate_index == 0

                                                                                                                  selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                                  voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                                                                                  else

                                                                                                                  selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                                  voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                                                                                  80

                                                                                                                  APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                                                                                  Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                                                                                  for index in range(selfelecN_CANDIDATES)

                                                                                                                  selfcandidates[index] = 0

                                                                                                                  for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                  if voter_index in selfrankings_changed

                                                                                                                  for candidate in selfrankings_changed[voter_index]

                                                                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                                  selfelecCANDIDATE_RANK]

                                                                                                                  else

                                                                                                                  for candidate in voter

                                                                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                                  selfelecCANDIDATE_RANK]

                                                                                                                  APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                                                                                  Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                                                                                  for index in range(selfelecN_CANDIDATES)

                                                                                                                  selfcandidates[index] = 0

                                                                                                                  for voter in selfelecsorted_voters

                                                                                                                  votes = selfelecN_VACANCIES

                                                                                                                  for candidate in reversed(voter)

                                                                                                                  if votes == 0

                                                                                                                  break

                                                                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                  votes -= 1

                                                                                                                  • Folha de aprovaccedilatildeo
                                                                                                                  • Agradecimentos
                                                                                                                  • Epiacutegrafe
                                                                                                                  • Resumo
                                                                                                                  • Abstract
                                                                                                                  • Lista de ilustraccedilotildees
                                                                                                                  • Lista de Coacutedigos
                                                                                                                  • Lista de tabelas
                                                                                                                  • Lista de abreviaturas e siglas
                                                                                                                  • Sumaacuterio
                                                                                                                  • INTRODUCcedilAtildeO
                                                                                                                    • MOTIVACcedilAtildeO E OBJETIVO
                                                                                                                    • MEacuteTODO
                                                                                                                    • ESTRUTURA
                                                                                                                      • SISTEMAS ELEITORAIS
                                                                                                                        • FISRT PAST THE POST
                                                                                                                          • Exemplo
                                                                                                                          • Vantagens e Desvantagens do FPTP
                                                                                                                          • Voto Uacutetil no FPTP
                                                                                                                            • TWO-ROUND SYSTEM
                                                                                                                              • Exemplo
                                                                                                                              • Vantagens e Desvantagens do TRS
                                                                                                                              • Voto Uacutetil no TRS
                                                                                                                                • INSTANT-RUNOFF VOTING
                                                                                                                                  • Exemplo
                                                                                                                                  • Vantagens e Desvantagens do IRV
                                                                                                                                  • Voto Uacutetil no IRV
                                                                                                                                    • APPROVAL VOTING SYSTEM
                                                                                                                                      • Exemplo
                                                                                                                                      • Vantagens e Desvantagens do AVS
                                                                                                                                      • Voto Uacutetil no AVS
                                                                                                                                        • THE BORDA COUNT
                                                                                                                                          • Exemplo
                                                                                                                                          • Vantagens e Desvantagens do BC
                                                                                                                                          • Voto Uacutetil no BC
                                                                                                                                            • SCORE VOTING SYSTEM
                                                                                                                                              • Exemplo
                                                                                                                                              • Vantagens e Desvantagens do SVS
                                                                                                                                              • Voto Uacutetil no SVS
                                                                                                                                                • BLOC VOTE
                                                                                                                                                  • Exemplo
                                                                                                                                                  • Voto Uacutetil no BV
                                                                                                                                                      • O SIMULADOR
                                                                                                                                                      • CENAacuteRIOS PERTINENTES
                                                                                                                                                        • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                                                                        • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                                                                        • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                                                                        • CENAacuteRIO 4 COALIZOtildeES
                                                                                                                                                        • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                                                                        • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                                                                          • COMO FUNCIONA O SIMULADOR
                                                                                                                                                            • CLASSE Elections
                                                                                                                                                            • CLASSE FirstPastThePost
                                                                                                                                                            • CLASSE TwoRoundSystem
                                                                                                                                                            • CLASSE InstantRunoffVoting
                                                                                                                                                            • CLASSE ApprovalVoting
                                                                                                                                                            • CLASSE BordaCount
                                                                                                                                                            • CLASSE ScoreVoting
                                                                                                                                                            • CLASSE BlocVote
                                                                                                                                                            • TECNOLOGIAS UTILIZADAS
                                                                                                                                                              • CONCLUSAtildeO
                                                                                                                                                              • Referecircncias
                                                                                                                                                              • Meacutetodo create_voters
                                                                                                                                                              • Meacutetodo create_candidates
                                                                                                                                                              • Meacutetodo calculate_means
                                                                                                                                                              • Meacutetodo get_mean
                                                                                                                                                              • Meacutetodo calculate_mean
                                                                                                                                                              • Meacutetodo set_leading_candidates
                                                                                                                                                              • Meacutetodo irv_set_leading_candidates
                                                                                                                                                              • Meacutetodo sort_ranks
                                                                                                                                                              • Meacutetodo fptp_count_tactical_votes
                                                                                                                                                              • Meacutetodo fptp_count_minority_votes
                                                                                                                                                              • Meacutetodo trs_second_round
                                                                                                                                                              • Meacutetodo trs_account_for_coalitions
                                                                                                                                                              • Meacutetodo irv_count_votes
                                                                                                                                                              • Meacutetodo avs_count_votes
                                                                                                                                                              • Meacutetodo avs_count_votes_with_tactical
                                                                                                                                                              • Meacutetodo irv_apply_tactical_votes
                                                                                                                                                              • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                                                                              • Meacutetodo bc_sum_candidates_scores
                                                                                                                                                              • Meacutetodo svs_apply_tactical_votes
                                                                                                                                                              • Meacutetodo svs_sum_candidates_scores
                                                                                                                                                              • Meacutetodo bv_count_votes

                                                                                                                    58

                                                                                                                    Figura 53 ndash PDF - Distribuiccedilatildeo Loved

                                                                                                                    Figura 54 ndash CDF - Distribuiccedilatildeo Loved

                                                                                                                    funcionalidade soacute existe para eleiccedilotildees com 10 candidatos ou menos e para eleiccedilotildees de 1 vagasenatildeo ficaria custoso guardar todas as combinaccedilotildees de meacutedias para candidatos vitoriososNo entanto para esses outros casos existe o meacutetodo calculate_mean (apecircndice E) quecalcula apenas a meacutedia do(s) candidato(s) vitorioso(s) A meacutedia das notas eacute simplesmenteo somatoacuterio das notas dos candidatos dividido pelo nuacutemero de eleitores e pelo nuacutemero devagas da eleiccedilatildeo

                                                                                                                    59

                                                                                                                    Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                                                                                                                    Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                                                                                                                    Meacutedia das Notas sumei

                                                                                                                    sumvj nij

                                                                                                                    etimes v

                                                                                                                    Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                                                                                                                    Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                                                                                                                    60

                                                                                                                    Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                                                                                                                    Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                                                                                                                    52 CLASSE FIRSTPASTTHEPOST

                                                                                                                    Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                                                                                                                    Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                                                                                                                    61

                                                                                                                    Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                                                                                                                    Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                                                                                                                    mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                                                                                                                    62

                                                                                                                    53 CLASSE TWOROUNDSYSTEM

                                                                                                                    A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                                                                                                                    54 CLASSE INSTANTRUNOFFVOTING

                                                                                                                    A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                                                                                                                    Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                                                                                                                    63

                                                                                                                    cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                                                                                                                    55 CLASSE APPROVALVOTING

                                                                                                                    Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                                                                                                                    56 CLASSE BORDACOUNT

                                                                                                                    Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                                                                                                                    57 CLASSE SCOREVOTING

                                                                                                                    De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                                                                                                                    64

                                                                                                                    58 CLASSE BLOCVOTE

                                                                                                                    O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                                                                                                                    59 TECNOLOGIAS UTILIZADAS

                                                                                                                    A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                                                                                                                    Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                                                                                                                    O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                                                                                                                    Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                                                                                                                    65

                                                                                                                    6 CONCLUSAtildeO

                                                                                                                    Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                                                                                                                    Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                                                                                                                    Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                                                                                                                    Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                                                                                                                    Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                                                                                                                    66

                                                                                                                    REFEREcircNCIAS

                                                                                                                    AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                                                                                                                    Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                                                                                                                    Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                                                                                                                    Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                                                                                                                    HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                                                                                                                    LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                                                                                                                    ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                                                                                                                    Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                                                                                                                    POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                                                                                                                    The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                                                                                                                    67

                                                                                                                    APEcircNDICES

                                                                                                                    APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                                                                                                    Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                                                                                                    if(not len(selfvoter_profiles))

                                                                                                                    for voter in range(selfN_VOTERS)

                                                                                                                    candidates_rank = dict()

                                                                                                                    for candidate in reversed(range(selfN_CANDIDATES))

                                                                                                                    if(selfBIAS_VECTOR[candidate]==4)

                                                                                                                    candidates_rank[candidate] = self_sortear(selfloved)

                                                                                                                    elif(selfBIAS_VECTOR[candidate]==3)

                                                                                                                    candidates_rank[candidate] = self_sortear(selfliked)

                                                                                                                    elif(selfBIAS_VECTOR[candidate]==2)

                                                                                                                    candidates_rank[candidate] = self_sortear(selfdisliked)

                                                                                                                    elif(selfBIAS_VECTOR[candidate]==1)

                                                                                                                    candidates_rank[candidate] = self_sortear(selfhated)

                                                                                                                    elif(selfBIAS_VECTOR[candidate]==-1)

                                                                                                                    candidates_rank[candidate] = self_sortear(selfpolarizer

                                                                                                                    )

                                                                                                                    elif(selfBIAS_VECTOR[candidate]==-2)

                                                                                                                    candidates_rank[candidate] = self_sortear(self

                                                                                                                    more_polarizer)

                                                                                                                    else

                                                                                                                    candidates_rank[candidate] = self_sortear(selfneutral)

                                                                                                                    selfvotersappend(candidates_rank)

                                                                                                                    else

                                                                                                                    ranges = []

                                                                                                                    ranks = []

                                                                                                                    for prof in selfvoter_profiles

                                                                                                                    rangesappend(int(prof[pop_percentage]))

                                                                                                                    rank =

                                                                                                                    for index score in enumerate(prof[scores])

                                                                                                                    rank[index] = score

                                                                                                                    ranksappend(rank)

                                                                                                                    for index _range in enumerate(ranges)

                                                                                                                    for _ in range(int(selfN_VOTERS(_range100)))

                                                                                                                    selfvotersappend(ranks[index])

                                                                                                                    68

                                                                                                                    APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                                                                                                    Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                                                                                                    for i in range(selfN_CANDIDATES)

                                                                                                                    selfcandidates[i] = 0

                                                                                                                    selfvotes[i] = set()

                                                                                                                    APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                                                                                                    Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                                                                                                    for candidate in range(selfN_CANDIDATES)

                                                                                                                    rating_sum = 0

                                                                                                                    for voter in selfvoters

                                                                                                                    rating_sum += voter[candidate]

                                                                                                                    selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                                                                                                    APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                                                                                                    Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                                                                                                    if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                                                                                                    return selfcalculate_mean(winners)

                                                                                                                    else

                                                                                                                    chose_best = True if winners[0] == selfbest_candidate else

                                                                                                                    False

                                                                                                                    return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                                                                                                    69

                                                                                                                    APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                                                                                                    Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                                                                                                    rating_sum = 0

                                                                                                                    for voter in selfvoters

                                                                                                                    for candidate in winners

                                                                                                                    rating_sum += voter[candidate]

                                                                                                                    return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                                                                                                    APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                                                                                                    Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                                                                                                    for i in range(1 selfN_VACANCIES + 2)

                                                                                                                    selfleading_candidatesappend(selfsorted_candidates[-i][self

                                                                                                                    CANDIDATE_INDEX])

                                                                                                                    APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                                                                                                    Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                                                                                                    for leader in selfelecrounds[-1]

                                                                                                                    selfleading_candidatesappend(leader[0])

                                                                                                                    70

                                                                                                                    APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                                                                                                    Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                                                                                                    self_account_for_coalitions()

                                                                                                                    for voter in selfvoters

                                                                                                                    selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                                                                                                    (1)))

                                                                                                                    temp = []

                                                                                                                    for voter in selfsorted_voters

                                                                                                                    new_dict = defaultdict(list)

                                                                                                                    for k in voter

                                                                                                                    new_dict[k[1]]append(k[0])

                                                                                                                    tempappend(new_dict)

                                                                                                                    selfsorted_voters = []

                                                                                                                    for voter_index current_voter in enumerate(temp)

                                                                                                                    new_voter = []

                                                                                                                    for rating candidate_indexes in current_voteritems()

                                                                                                                    if len(current_voter[rating]) gt 1

                                                                                                                    shuffle(current_voter[rating])

                                                                                                                    for e in candidate_indexes

                                                                                                                    new_voterappend((e rating))

                                                                                                                    else

                                                                                                                    new_voterappend((candidate_indexes[0] rating))

                                                                                                                    selfsorted_votersappend(new_voter)

                                                                                                                    selfcandidates[new_voter[-1][0]] += 1

                                                                                                                    selfvotes[new_voter[-1][0]]add(voter_index)

                                                                                                                    71

                                                                                                                    APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                                                                                                    Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                                                                                                    for candidate in selfvotes_copy

                                                                                                                    if candidate not in selfelecleading_candidates

                                                                                                                    for voter_index in selfvotes_copy[candidate]

                                                                                                                    for index _candidate in enumerate(reversed(selfelec

                                                                                                                    sorted_voters[voter_index]))

                                                                                                                    if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                                                                                                    leading_candidates

                                                                                                                    if randomrandom() lt selfelec

                                                                                                                    tactical_vote_percentages[_candidate[selfelec

                                                                                                                    CANDIDATE_INDEX]]

                                                                                                                    selfrankings_changed[voter_index] = copy

                                                                                                                    deepcopy(selfelecsorted_voters[voter_index])

                                                                                                                    selfrankings_changed[voter_index][-(index + 1)]

                                                                                                                    selfrankings_changed[voter_index][-1] = self

                                                                                                                    rankings_changed[voter_index][-1] self

                                                                                                                    rankings_changed[voter_index][-(index + 1)]

                                                                                                                    selfcandidates[candidate] -= 1

                                                                                                                    selfcandidates[_candidate[selfelec

                                                                                                                    CANDIDATE_INDEX]] += 1

                                                                                                                    selfvotes[candidate]remove(voter_index)

                                                                                                                    selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                                                                                                    ]]add(voter_index)

                                                                                                                    break

                                                                                                                    break

                                                                                                                    72

                                                                                                                    APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                                                                                                    Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                                                                                                    half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                                                                                                    for candidate in selfelecleading_candidates

                                                                                                                    if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                                                                                                    continue

                                                                                                                    for voter_index in selfvotes_copy[candidate]

                                                                                                                    if voter_index in selfrankings_changed

                                                                                                                    ranking = selfrankings_changed[voter_index]

                                                                                                                    else

                                                                                                                    ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                                                                                                    ])

                                                                                                                    for index _candidate in enumerate(reversed(ranking))

                                                                                                                    if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                    leading_candidates or (_candidate[selfelec

                                                                                                                    CANDIDATE_INDEX] in selfelecleading_candidates and

                                                                                                                    selfelecleading_candidatesindex(_candidate[selfelec

                                                                                                                    CANDIDATE_INDEX]) gt= half_vacancies)

                                                                                                                    if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                                                                                                    if randomrandom() lt selfelec

                                                                                                                    minority_vote_percentages[_candidate[selfelec

                                                                                                                    CANDIDATE_INDEX]]

                                                                                                                    selfcandidates[candidate] -= 1

                                                                                                                    selfcandidates[_candidate[selfelec

                                                                                                                    CANDIDATE_INDEX]] += 1

                                                                                                                    break

                                                                                                                    break

                                                                                                                    break

                                                                                                                    73

                                                                                                                    APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                                                                                                    Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                                                                                                    self_account_for_coalitions()

                                                                                                                    for candidate in selfvotes

                                                                                                                    if candidate = selfwinner and candidate = selfsecond_place

                                                                                                                    for voter_index in selfvotes[candidate]

                                                                                                                    if voter_index in selfrankings_changed

                                                                                                                    ranking = selfrankings_changed[voter_index]

                                                                                                                    else

                                                                                                                    ranking = copydeepcopy(selfelecsorted_voters[

                                                                                                                    voter_index])

                                                                                                                    for index2 candidate in enumerate(reversed(ranking))

                                                                                                                    if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                                                                                                    selfcandidates[selfwinner] += 1

                                                                                                                    selfvotes[selfwinner]add(voter_index)

                                                                                                                    break

                                                                                                                    elif candidate[selfelecCANDIDATE_INDEX] == self

                                                                                                                    second_place

                                                                                                                    selfcandidates[selfsecond_place] += 1

                                                                                                                    selfvotes[selfsecond_place]add(voter_index)

                                                                                                                    break

                                                                                                                    selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                                    winners = []

                                                                                                                    vacancies = selfelecN_VACANCIES

                                                                                                                    for candidate in reversed(selfsorted_candidates)

                                                                                                                    if vacancies == 0

                                                                                                                    break

                                                                                                                    winnersappend(candidate[0])

                                                                                                                    vacancies -= 1

                                                                                                                    mean chose_best = selfelecget_mean(winners = winners)

                                                                                                                    74

                                                                                                                    APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                                                                                                    Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                                                                                                    for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                    voter_dict = dict()

                                                                                                                    og_voter_dict = dict()

                                                                                                                    for tup in voter

                                                                                                                    voter_dict[tup[0]] = tup[1]

                                                                                                                    og_voter_dict[tup[0]] = tup[1]

                                                                                                                    for coalition in selfeleccoalitions

                                                                                                                    for candidate in coalition

                                                                                                                    add_to_score = 0

                                                                                                                    for candidate2 in coalition

                                                                                                                    if candidate == candidate2

                                                                                                                    continue

                                                                                                                    half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                                                                                                    if half lt 0

                                                                                                                    add_to_score += mathceil(half)

                                                                                                                    else

                                                                                                                    add_to_score += mathfloor(half)

                                                                                                                    if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                                                                                                    voter_dict[candidate[rsquovaluersquo]] = 10

                                                                                                                    elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                                                                                                    voter_dict[candidate[rsquovaluersquo]] = -10

                                                                                                                    else

                                                                                                                    voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                                                                                                    selfrankings_changed[voter_index] = []

                                                                                                                    for candidate in voter_dict

                                                                                                                    selfrankings_changed[voter_index]append((candidate voter_dict[

                                                                                                                    candidate]))

                                                                                                                    selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                                                                                                    voter_index] key=lambda x x[1])

                                                                                                                    75

                                                                                                                    APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                                                                                    Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                                                                                    selfelecroundsappend(selfsorted_candidates[_round])

                                                                                                                    if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                                    N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                                                                                    N_VACANCIES - 1)

                                                                                                                    return 2

                                                                                                                    elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                                    N_VOTERS gt 05)

                                                                                                                    return 1

                                                                                                                    else

                                                                                                                    selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                                                                                    CANDIDATE_INDEX])

                                                                                                                    for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                                                                                    elecCANDIDATE_INDEX]]

                                                                                                                    if voter_index in selfrankings_changed

                                                                                                                    for candidate in reversed(selfrankings_changed[voter_index

                                                                                                                    ])

                                                                                                                    if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                    excluded

                                                                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                                    ]] += 1

                                                                                                                    selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                                    add(voter_index)

                                                                                                                    break

                                                                                                                    else

                                                                                                                    continue

                                                                                                                    else

                                                                                                                    for candidate in reversed(selfelecsorted_voters[

                                                                                                                    voter_index])

                                                                                                                    if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                    excluded

                                                                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                                    ]] += 1

                                                                                                                    selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                                    add(voter_index)

                                                                                                                    break

                                                                                                                    else

                                                                                                                    continue

                                                                                                                    selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                                    return 0

                                                                                                                    76

                                                                                                                    APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                                                                                    Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                                                                                    for index in range(selfelecN_CANDIDATES)

                                                                                                                    selfcandidates[index] = 0

                                                                                                                    for voter in selfelecsorted_voters

                                                                                                                    for candidate in reversed(voter)

                                                                                                                    if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                    else

                                                                                                                    break

                                                                                                                    APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                                                                                    Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                                                                                    for index in range(selfelecN_CANDIDATES)

                                                                                                                    selfcandidates[index] = 0

                                                                                                                    for voter in selfelecsorted_voters

                                                                                                                    if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                                    elecCANDIDATE_INDEX]]

                                                                                                                    selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                                                                                    else

                                                                                                                    for candidate in reversed(voter)

                                                                                                                    if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                    else

                                                                                                                    break

                                                                                                                    77

                                                                                                                    APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                                                                                    Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                                                                                    pos = set()

                                                                                                                    for index perc in enumerate(selfelectactical_vote_percentages)

                                                                                                                    if perc gt 0

                                                                                                                    posadd(index)

                                                                                                                    for candidate in selfeleccandidates

                                                                                                                    if candidate not in selfleading_candidates

                                                                                                                    for voter_index in selfvotes[candidate]

                                                                                                                    raised = None

                                                                                                                    for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                                                                                    ])

                                                                                                                    if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                                                                                    leading_candidates

                                                                                                                    if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                                                                                    if randomrandom() lt selfelectactical_vote_percentages[

                                                                                                                    candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                                                                                    ranking = [None]selfelecN_CANDIDATES

                                                                                                                    ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                    selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                    CANDIDATE_INDEX]])

                                                                                                                    raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                    break

                                                                                                                    break

                                                                                                                    break

                                                                                                                    if raised = None

                                                                                                                    for _candidate in selfleading_candidates

                                                                                                                    if _candidate = ranking[-1][0]

                                                                                                                    ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                                    _candidate])

                                                                                                                    buried = _candidate

                                                                                                                    break

                                                                                                                    i = 1

                                                                                                                    for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                                    if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                                                                                    buried]

                                                                                                                    continue

                                                                                                                    else

                                                                                                                    ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                    selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                    CANDIDATE_INDEX]])

                                                                                                                    i += 1

                                                                                                                    selfrankings_changed[voter_index] = ranking

                                                                                                                    78

                                                                                                                    APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                                                                                    Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                                                                                    for voter_index in selfvotes[candidate]

                                                                                                                    if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                                                                                    ]

                                                                                                                    for _candidate in selfleading_candidates

                                                                                                                    if _candidate = candidate

                                                                                                                    ranking = [None]selfelecN_CANDIDATES

                                                                                                                    ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                                    _candidate])

                                                                                                                    buried = _candidate

                                                                                                                    break

                                                                                                                    i = 1

                                                                                                                    for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                                    if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                                                                                    continue

                                                                                                                    else

                                                                                                                    ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                    selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                    CANDIDATE_INDEX]])

                                                                                                                    i += 1

                                                                                                                    selfrankings_changed[voter_index] = ranking

                                                                                                                    79

                                                                                                                    APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                                                                                    Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                                                                                    for index in range(selfelecN_CANDIDATES)

                                                                                                                    selfcandidates[index] = 0

                                                                                                                    for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                    score = 0

                                                                                                                    if voter_index in selfrankings_changed

                                                                                                                    for candidate in selfrankings_changed[voter_index]

                                                                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                                    score += 1

                                                                                                                    else

                                                                                                                    for candidate in voter

                                                                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                                    score += 1

                                                                                                                    APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                                                                                    Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                                                                                    for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                    if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                                    elecCANDIDATE_INDEX]]

                                                                                                                    selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                                                                                    sorted_voters[voter_index])

                                                                                                                    for candidate_index candidate in enumerate(reversed(voter))

                                                                                                                    if candidate_index == 0

                                                                                                                    selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                                    voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                                                                                    else

                                                                                                                    selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                                    voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                                                                                    80

                                                                                                                    APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                                                                                    Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                                                                                    for index in range(selfelecN_CANDIDATES)

                                                                                                                    selfcandidates[index] = 0

                                                                                                                    for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                    if voter_index in selfrankings_changed

                                                                                                                    for candidate in selfrankings_changed[voter_index]

                                                                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                                    selfelecCANDIDATE_RANK]

                                                                                                                    else

                                                                                                                    for candidate in voter

                                                                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                                    selfelecCANDIDATE_RANK]

                                                                                                                    APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                                                                                    Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                                                                                    for index in range(selfelecN_CANDIDATES)

                                                                                                                    selfcandidates[index] = 0

                                                                                                                    for voter in selfelecsorted_voters

                                                                                                                    votes = selfelecN_VACANCIES

                                                                                                                    for candidate in reversed(voter)

                                                                                                                    if votes == 0

                                                                                                                    break

                                                                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                    votes -= 1

                                                                                                                    • Folha de aprovaccedilatildeo
                                                                                                                    • Agradecimentos
                                                                                                                    • Epiacutegrafe
                                                                                                                    • Resumo
                                                                                                                    • Abstract
                                                                                                                    • Lista de ilustraccedilotildees
                                                                                                                    • Lista de Coacutedigos
                                                                                                                    • Lista de tabelas
                                                                                                                    • Lista de abreviaturas e siglas
                                                                                                                    • Sumaacuterio
                                                                                                                    • INTRODUCcedilAtildeO
                                                                                                                      • MOTIVACcedilAtildeO E OBJETIVO
                                                                                                                      • MEacuteTODO
                                                                                                                      • ESTRUTURA
                                                                                                                        • SISTEMAS ELEITORAIS
                                                                                                                          • FISRT PAST THE POST
                                                                                                                            • Exemplo
                                                                                                                            • Vantagens e Desvantagens do FPTP
                                                                                                                            • Voto Uacutetil no FPTP
                                                                                                                              • TWO-ROUND SYSTEM
                                                                                                                                • Exemplo
                                                                                                                                • Vantagens e Desvantagens do TRS
                                                                                                                                • Voto Uacutetil no TRS
                                                                                                                                  • INSTANT-RUNOFF VOTING
                                                                                                                                    • Exemplo
                                                                                                                                    • Vantagens e Desvantagens do IRV
                                                                                                                                    • Voto Uacutetil no IRV
                                                                                                                                      • APPROVAL VOTING SYSTEM
                                                                                                                                        • Exemplo
                                                                                                                                        • Vantagens e Desvantagens do AVS
                                                                                                                                        • Voto Uacutetil no AVS
                                                                                                                                          • THE BORDA COUNT
                                                                                                                                            • Exemplo
                                                                                                                                            • Vantagens e Desvantagens do BC
                                                                                                                                            • Voto Uacutetil no BC
                                                                                                                                              • SCORE VOTING SYSTEM
                                                                                                                                                • Exemplo
                                                                                                                                                • Vantagens e Desvantagens do SVS
                                                                                                                                                • Voto Uacutetil no SVS
                                                                                                                                                  • BLOC VOTE
                                                                                                                                                    • Exemplo
                                                                                                                                                    • Voto Uacutetil no BV
                                                                                                                                                        • O SIMULADOR
                                                                                                                                                        • CENAacuteRIOS PERTINENTES
                                                                                                                                                          • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                                                                          • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                                                                          • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                                                                          • CENAacuteRIO 4 COALIZOtildeES
                                                                                                                                                          • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                                                                          • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                                                                            • COMO FUNCIONA O SIMULADOR
                                                                                                                                                              • CLASSE Elections
                                                                                                                                                              • CLASSE FirstPastThePost
                                                                                                                                                              • CLASSE TwoRoundSystem
                                                                                                                                                              • CLASSE InstantRunoffVoting
                                                                                                                                                              • CLASSE ApprovalVoting
                                                                                                                                                              • CLASSE BordaCount
                                                                                                                                                              • CLASSE ScoreVoting
                                                                                                                                                              • CLASSE BlocVote
                                                                                                                                                              • TECNOLOGIAS UTILIZADAS
                                                                                                                                                                • CONCLUSAtildeO
                                                                                                                                                                • Referecircncias
                                                                                                                                                                • Meacutetodo create_voters
                                                                                                                                                                • Meacutetodo create_candidates
                                                                                                                                                                • Meacutetodo calculate_means
                                                                                                                                                                • Meacutetodo get_mean
                                                                                                                                                                • Meacutetodo calculate_mean
                                                                                                                                                                • Meacutetodo set_leading_candidates
                                                                                                                                                                • Meacutetodo irv_set_leading_candidates
                                                                                                                                                                • Meacutetodo sort_ranks
                                                                                                                                                                • Meacutetodo fptp_count_tactical_votes
                                                                                                                                                                • Meacutetodo fptp_count_minority_votes
                                                                                                                                                                • Meacutetodo trs_second_round
                                                                                                                                                                • Meacutetodo trs_account_for_coalitions
                                                                                                                                                                • Meacutetodo irv_count_votes
                                                                                                                                                                • Meacutetodo avs_count_votes
                                                                                                                                                                • Meacutetodo avs_count_votes_with_tactical
                                                                                                                                                                • Meacutetodo irv_apply_tactical_votes
                                                                                                                                                                • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                                                                                • Meacutetodo bc_sum_candidates_scores
                                                                                                                                                                • Meacutetodo svs_apply_tactical_votes
                                                                                                                                                                • Meacutetodo svs_sum_candidates_scores
                                                                                                                                                                • Meacutetodo bv_count_votes

                                                                                                                      59

                                                                                                                      Figura 55 ndash PDF - Distribuiccedilatildeo Hated

                                                                                                                      Figura 56 ndash CDF - Distribuiccedilatildeo Hated

                                                                                                                      Meacutedia das Notas sumei

                                                                                                                      sumvj nij

                                                                                                                      etimes v

                                                                                                                      Sendo v igual ao nuacutemero de vagas e o nuacutemero de eleitores e n ij a nota dada peloeleitor i ao candidato eleito para a vaga j

                                                                                                                      Nas proacuteximas seccedilotildees seratildeo comentados os coacutedigos das classes que representam cadasistema eleitoral implementado

                                                                                                                      60

                                                                                                                      Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                                                                                                                      Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                                                                                                                      52 CLASSE FIRSTPASTTHEPOST

                                                                                                                      Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                                                                                                                      Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                                                                                                                      61

                                                                                                                      Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                                                                                                                      Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                                                                                                                      mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                                                                                                                      62

                                                                                                                      53 CLASSE TWOROUNDSYSTEM

                                                                                                                      A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                                                                                                                      54 CLASSE INSTANTRUNOFFVOTING

                                                                                                                      A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                                                                                                                      Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                                                                                                                      63

                                                                                                                      cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                                                                                                                      55 CLASSE APPROVALVOTING

                                                                                                                      Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                                                                                                                      56 CLASSE BORDACOUNT

                                                                                                                      Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                                                                                                                      57 CLASSE SCOREVOTING

                                                                                                                      De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                                                                                                                      64

                                                                                                                      58 CLASSE BLOCVOTE

                                                                                                                      O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                                                                                                                      59 TECNOLOGIAS UTILIZADAS

                                                                                                                      A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                                                                                                                      Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                                                                                                                      O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                                                                                                                      Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                                                                                                                      65

                                                                                                                      6 CONCLUSAtildeO

                                                                                                                      Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                                                                                                                      Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                                                                                                                      Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                                                                                                                      Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                                                                                                                      Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                                                                                                                      66

                                                                                                                      REFEREcircNCIAS

                                                                                                                      AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                                                                                                                      Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                                                                                                                      Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                                                                                                                      Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                                                                                                                      HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                                                                                                                      LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                                                                                                                      ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                                                                                                                      Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                                                                                                                      POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                                                                                                                      The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                                                                                                                      67

                                                                                                                      APEcircNDICES

                                                                                                                      APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                                                                                                      Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                                                                                                      if(not len(selfvoter_profiles))

                                                                                                                      for voter in range(selfN_VOTERS)

                                                                                                                      candidates_rank = dict()

                                                                                                                      for candidate in reversed(range(selfN_CANDIDATES))

                                                                                                                      if(selfBIAS_VECTOR[candidate]==4)

                                                                                                                      candidates_rank[candidate] = self_sortear(selfloved)

                                                                                                                      elif(selfBIAS_VECTOR[candidate]==3)

                                                                                                                      candidates_rank[candidate] = self_sortear(selfliked)

                                                                                                                      elif(selfBIAS_VECTOR[candidate]==2)

                                                                                                                      candidates_rank[candidate] = self_sortear(selfdisliked)

                                                                                                                      elif(selfBIAS_VECTOR[candidate]==1)

                                                                                                                      candidates_rank[candidate] = self_sortear(selfhated)

                                                                                                                      elif(selfBIAS_VECTOR[candidate]==-1)

                                                                                                                      candidates_rank[candidate] = self_sortear(selfpolarizer

                                                                                                                      )

                                                                                                                      elif(selfBIAS_VECTOR[candidate]==-2)

                                                                                                                      candidates_rank[candidate] = self_sortear(self

                                                                                                                      more_polarizer)

                                                                                                                      else

                                                                                                                      candidates_rank[candidate] = self_sortear(selfneutral)

                                                                                                                      selfvotersappend(candidates_rank)

                                                                                                                      else

                                                                                                                      ranges = []

                                                                                                                      ranks = []

                                                                                                                      for prof in selfvoter_profiles

                                                                                                                      rangesappend(int(prof[pop_percentage]))

                                                                                                                      rank =

                                                                                                                      for index score in enumerate(prof[scores])

                                                                                                                      rank[index] = score

                                                                                                                      ranksappend(rank)

                                                                                                                      for index _range in enumerate(ranges)

                                                                                                                      for _ in range(int(selfN_VOTERS(_range100)))

                                                                                                                      selfvotersappend(ranks[index])

                                                                                                                      68

                                                                                                                      APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                                                                                                      Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                                                                                                      for i in range(selfN_CANDIDATES)

                                                                                                                      selfcandidates[i] = 0

                                                                                                                      selfvotes[i] = set()

                                                                                                                      APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                                                                                                      Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                                                                                                      for candidate in range(selfN_CANDIDATES)

                                                                                                                      rating_sum = 0

                                                                                                                      for voter in selfvoters

                                                                                                                      rating_sum += voter[candidate]

                                                                                                                      selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                                                                                                      APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                                                                                                      Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                                                                                                      if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                                                                                                      return selfcalculate_mean(winners)

                                                                                                                      else

                                                                                                                      chose_best = True if winners[0] == selfbest_candidate else

                                                                                                                      False

                                                                                                                      return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                                                                                                      69

                                                                                                                      APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                                                                                                      Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                                                                                                      rating_sum = 0

                                                                                                                      for voter in selfvoters

                                                                                                                      for candidate in winners

                                                                                                                      rating_sum += voter[candidate]

                                                                                                                      return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                                                                                                      APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                                                                                                      Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                                                                                                      for i in range(1 selfN_VACANCIES + 2)

                                                                                                                      selfleading_candidatesappend(selfsorted_candidates[-i][self

                                                                                                                      CANDIDATE_INDEX])

                                                                                                                      APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                                                                                                      Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                                                                                                      for leader in selfelecrounds[-1]

                                                                                                                      selfleading_candidatesappend(leader[0])

                                                                                                                      70

                                                                                                                      APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                                                                                                      Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                                                                                                      self_account_for_coalitions()

                                                                                                                      for voter in selfvoters

                                                                                                                      selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                                                                                                      (1)))

                                                                                                                      temp = []

                                                                                                                      for voter in selfsorted_voters

                                                                                                                      new_dict = defaultdict(list)

                                                                                                                      for k in voter

                                                                                                                      new_dict[k[1]]append(k[0])

                                                                                                                      tempappend(new_dict)

                                                                                                                      selfsorted_voters = []

                                                                                                                      for voter_index current_voter in enumerate(temp)

                                                                                                                      new_voter = []

                                                                                                                      for rating candidate_indexes in current_voteritems()

                                                                                                                      if len(current_voter[rating]) gt 1

                                                                                                                      shuffle(current_voter[rating])

                                                                                                                      for e in candidate_indexes

                                                                                                                      new_voterappend((e rating))

                                                                                                                      else

                                                                                                                      new_voterappend((candidate_indexes[0] rating))

                                                                                                                      selfsorted_votersappend(new_voter)

                                                                                                                      selfcandidates[new_voter[-1][0]] += 1

                                                                                                                      selfvotes[new_voter[-1][0]]add(voter_index)

                                                                                                                      71

                                                                                                                      APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                                                                                                      Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                                                                                                      for candidate in selfvotes_copy

                                                                                                                      if candidate not in selfelecleading_candidates

                                                                                                                      for voter_index in selfvotes_copy[candidate]

                                                                                                                      for index _candidate in enumerate(reversed(selfelec

                                                                                                                      sorted_voters[voter_index]))

                                                                                                                      if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                                                                                                      leading_candidates

                                                                                                                      if randomrandom() lt selfelec

                                                                                                                      tactical_vote_percentages[_candidate[selfelec

                                                                                                                      CANDIDATE_INDEX]]

                                                                                                                      selfrankings_changed[voter_index] = copy

                                                                                                                      deepcopy(selfelecsorted_voters[voter_index])

                                                                                                                      selfrankings_changed[voter_index][-(index + 1)]

                                                                                                                      selfrankings_changed[voter_index][-1] = self

                                                                                                                      rankings_changed[voter_index][-1] self

                                                                                                                      rankings_changed[voter_index][-(index + 1)]

                                                                                                                      selfcandidates[candidate] -= 1

                                                                                                                      selfcandidates[_candidate[selfelec

                                                                                                                      CANDIDATE_INDEX]] += 1

                                                                                                                      selfvotes[candidate]remove(voter_index)

                                                                                                                      selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                                                                                                      ]]add(voter_index)

                                                                                                                      break

                                                                                                                      break

                                                                                                                      72

                                                                                                                      APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                                                                                                      Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                                                                                                      half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                                                                                                      for candidate in selfelecleading_candidates

                                                                                                                      if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                                                                                                      continue

                                                                                                                      for voter_index in selfvotes_copy[candidate]

                                                                                                                      if voter_index in selfrankings_changed

                                                                                                                      ranking = selfrankings_changed[voter_index]

                                                                                                                      else

                                                                                                                      ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                                                                                                      ])

                                                                                                                      for index _candidate in enumerate(reversed(ranking))

                                                                                                                      if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                      leading_candidates or (_candidate[selfelec

                                                                                                                      CANDIDATE_INDEX] in selfelecleading_candidates and

                                                                                                                      selfelecleading_candidatesindex(_candidate[selfelec

                                                                                                                      CANDIDATE_INDEX]) gt= half_vacancies)

                                                                                                                      if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                                                                                                      if randomrandom() lt selfelec

                                                                                                                      minority_vote_percentages[_candidate[selfelec

                                                                                                                      CANDIDATE_INDEX]]

                                                                                                                      selfcandidates[candidate] -= 1

                                                                                                                      selfcandidates[_candidate[selfelec

                                                                                                                      CANDIDATE_INDEX]] += 1

                                                                                                                      break

                                                                                                                      break

                                                                                                                      break

                                                                                                                      73

                                                                                                                      APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                                                                                                      Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                                                                                                      self_account_for_coalitions()

                                                                                                                      for candidate in selfvotes

                                                                                                                      if candidate = selfwinner and candidate = selfsecond_place

                                                                                                                      for voter_index in selfvotes[candidate]

                                                                                                                      if voter_index in selfrankings_changed

                                                                                                                      ranking = selfrankings_changed[voter_index]

                                                                                                                      else

                                                                                                                      ranking = copydeepcopy(selfelecsorted_voters[

                                                                                                                      voter_index])

                                                                                                                      for index2 candidate in enumerate(reversed(ranking))

                                                                                                                      if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                                                                                                      selfcandidates[selfwinner] += 1

                                                                                                                      selfvotes[selfwinner]add(voter_index)

                                                                                                                      break

                                                                                                                      elif candidate[selfelecCANDIDATE_INDEX] == self

                                                                                                                      second_place

                                                                                                                      selfcandidates[selfsecond_place] += 1

                                                                                                                      selfvotes[selfsecond_place]add(voter_index)

                                                                                                                      break

                                                                                                                      selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                                      winners = []

                                                                                                                      vacancies = selfelecN_VACANCIES

                                                                                                                      for candidate in reversed(selfsorted_candidates)

                                                                                                                      if vacancies == 0

                                                                                                                      break

                                                                                                                      winnersappend(candidate[0])

                                                                                                                      vacancies -= 1

                                                                                                                      mean chose_best = selfelecget_mean(winners = winners)

                                                                                                                      74

                                                                                                                      APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                                                                                                      Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                                                                                                      for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                      voter_dict = dict()

                                                                                                                      og_voter_dict = dict()

                                                                                                                      for tup in voter

                                                                                                                      voter_dict[tup[0]] = tup[1]

                                                                                                                      og_voter_dict[tup[0]] = tup[1]

                                                                                                                      for coalition in selfeleccoalitions

                                                                                                                      for candidate in coalition

                                                                                                                      add_to_score = 0

                                                                                                                      for candidate2 in coalition

                                                                                                                      if candidate == candidate2

                                                                                                                      continue

                                                                                                                      half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                                                                                                      if half lt 0

                                                                                                                      add_to_score += mathceil(half)

                                                                                                                      else

                                                                                                                      add_to_score += mathfloor(half)

                                                                                                                      if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                                                                                                      voter_dict[candidate[rsquovaluersquo]] = 10

                                                                                                                      elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                                                                                                      voter_dict[candidate[rsquovaluersquo]] = -10

                                                                                                                      else

                                                                                                                      voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                                                                                                      selfrankings_changed[voter_index] = []

                                                                                                                      for candidate in voter_dict

                                                                                                                      selfrankings_changed[voter_index]append((candidate voter_dict[

                                                                                                                      candidate]))

                                                                                                                      selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                                                                                                      voter_index] key=lambda x x[1])

                                                                                                                      75

                                                                                                                      APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                                                                                      Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                                                                                      selfelecroundsappend(selfsorted_candidates[_round])

                                                                                                                      if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                                      N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                                                                                      N_VACANCIES - 1)

                                                                                                                      return 2

                                                                                                                      elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                                      N_VOTERS gt 05)

                                                                                                                      return 1

                                                                                                                      else

                                                                                                                      selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                                                                                      CANDIDATE_INDEX])

                                                                                                                      for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                                                                                      elecCANDIDATE_INDEX]]

                                                                                                                      if voter_index in selfrankings_changed

                                                                                                                      for candidate in reversed(selfrankings_changed[voter_index

                                                                                                                      ])

                                                                                                                      if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                      excluded

                                                                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                                      ]] += 1

                                                                                                                      selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                                      add(voter_index)

                                                                                                                      break

                                                                                                                      else

                                                                                                                      continue

                                                                                                                      else

                                                                                                                      for candidate in reversed(selfelecsorted_voters[

                                                                                                                      voter_index])

                                                                                                                      if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                      excluded

                                                                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                                      ]] += 1

                                                                                                                      selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                                      add(voter_index)

                                                                                                                      break

                                                                                                                      else

                                                                                                                      continue

                                                                                                                      selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                                      return 0

                                                                                                                      76

                                                                                                                      APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                                                                                      Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                                                                                      for index in range(selfelecN_CANDIDATES)

                                                                                                                      selfcandidates[index] = 0

                                                                                                                      for voter in selfelecsorted_voters

                                                                                                                      for candidate in reversed(voter)

                                                                                                                      if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                      else

                                                                                                                      break

                                                                                                                      APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                                                                                      Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                                                                                      for index in range(selfelecN_CANDIDATES)

                                                                                                                      selfcandidates[index] = 0

                                                                                                                      for voter in selfelecsorted_voters

                                                                                                                      if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                                      elecCANDIDATE_INDEX]]

                                                                                                                      selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                                                                                      else

                                                                                                                      for candidate in reversed(voter)

                                                                                                                      if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                      else

                                                                                                                      break

                                                                                                                      77

                                                                                                                      APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                                                                                      Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                                                                                      pos = set()

                                                                                                                      for index perc in enumerate(selfelectactical_vote_percentages)

                                                                                                                      if perc gt 0

                                                                                                                      posadd(index)

                                                                                                                      for candidate in selfeleccandidates

                                                                                                                      if candidate not in selfleading_candidates

                                                                                                                      for voter_index in selfvotes[candidate]

                                                                                                                      raised = None

                                                                                                                      for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                                                                                      ])

                                                                                                                      if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                                                                                      leading_candidates

                                                                                                                      if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                                                                                      if randomrandom() lt selfelectactical_vote_percentages[

                                                                                                                      candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                                                                                      ranking = [None]selfelecN_CANDIDATES

                                                                                                                      ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                      selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                      CANDIDATE_INDEX]])

                                                                                                                      raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                      break

                                                                                                                      break

                                                                                                                      break

                                                                                                                      if raised = None

                                                                                                                      for _candidate in selfleading_candidates

                                                                                                                      if _candidate = ranking[-1][0]

                                                                                                                      ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                                      _candidate])

                                                                                                                      buried = _candidate

                                                                                                                      break

                                                                                                                      i = 1

                                                                                                                      for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                                      if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                                                                                      buried]

                                                                                                                      continue

                                                                                                                      else

                                                                                                                      ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                      selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                      CANDIDATE_INDEX]])

                                                                                                                      i += 1

                                                                                                                      selfrankings_changed[voter_index] = ranking

                                                                                                                      78

                                                                                                                      APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                                                                                      Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                                                                                      for voter_index in selfvotes[candidate]

                                                                                                                      if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                                                                                      ]

                                                                                                                      for _candidate in selfleading_candidates

                                                                                                                      if _candidate = candidate

                                                                                                                      ranking = [None]selfelecN_CANDIDATES

                                                                                                                      ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                                      _candidate])

                                                                                                                      buried = _candidate

                                                                                                                      break

                                                                                                                      i = 1

                                                                                                                      for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                                      if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                                                                                      continue

                                                                                                                      else

                                                                                                                      ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                      selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                      CANDIDATE_INDEX]])

                                                                                                                      i += 1

                                                                                                                      selfrankings_changed[voter_index] = ranking

                                                                                                                      79

                                                                                                                      APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                                                                                      Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                                                                                      for index in range(selfelecN_CANDIDATES)

                                                                                                                      selfcandidates[index] = 0

                                                                                                                      for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                      score = 0

                                                                                                                      if voter_index in selfrankings_changed

                                                                                                                      for candidate in selfrankings_changed[voter_index]

                                                                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                                      score += 1

                                                                                                                      else

                                                                                                                      for candidate in voter

                                                                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                                      score += 1

                                                                                                                      APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                                                                                      Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                                                                                      for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                      if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                                      elecCANDIDATE_INDEX]]

                                                                                                                      selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                                                                                      sorted_voters[voter_index])

                                                                                                                      for candidate_index candidate in enumerate(reversed(voter))

                                                                                                                      if candidate_index == 0

                                                                                                                      selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                                      voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                                                                                      else

                                                                                                                      selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                                      voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                                                                                      80

                                                                                                                      APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                                                                                      Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                                                                                      for index in range(selfelecN_CANDIDATES)

                                                                                                                      selfcandidates[index] = 0

                                                                                                                      for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                      if voter_index in selfrankings_changed

                                                                                                                      for candidate in selfrankings_changed[voter_index]

                                                                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                                      selfelecCANDIDATE_RANK]

                                                                                                                      else

                                                                                                                      for candidate in voter

                                                                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                                      selfelecCANDIDATE_RANK]

                                                                                                                      APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                                                                                      Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                                                                                      for index in range(selfelecN_CANDIDATES)

                                                                                                                      selfcandidates[index] = 0

                                                                                                                      for voter in selfelecsorted_voters

                                                                                                                      votes = selfelecN_VACANCIES

                                                                                                                      for candidate in reversed(voter)

                                                                                                                      if votes == 0

                                                                                                                      break

                                                                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                      votes -= 1

                                                                                                                      • Folha de aprovaccedilatildeo
                                                                                                                      • Agradecimentos
                                                                                                                      • Epiacutegrafe
                                                                                                                      • Resumo
                                                                                                                      • Abstract
                                                                                                                      • Lista de ilustraccedilotildees
                                                                                                                      • Lista de Coacutedigos
                                                                                                                      • Lista de tabelas
                                                                                                                      • Lista de abreviaturas e siglas
                                                                                                                      • Sumaacuterio
                                                                                                                      • INTRODUCcedilAtildeO
                                                                                                                        • MOTIVACcedilAtildeO E OBJETIVO
                                                                                                                        • MEacuteTODO
                                                                                                                        • ESTRUTURA
                                                                                                                          • SISTEMAS ELEITORAIS
                                                                                                                            • FISRT PAST THE POST
                                                                                                                              • Exemplo
                                                                                                                              • Vantagens e Desvantagens do FPTP
                                                                                                                              • Voto Uacutetil no FPTP
                                                                                                                                • TWO-ROUND SYSTEM
                                                                                                                                  • Exemplo
                                                                                                                                  • Vantagens e Desvantagens do TRS
                                                                                                                                  • Voto Uacutetil no TRS
                                                                                                                                    • INSTANT-RUNOFF VOTING
                                                                                                                                      • Exemplo
                                                                                                                                      • Vantagens e Desvantagens do IRV
                                                                                                                                      • Voto Uacutetil no IRV
                                                                                                                                        • APPROVAL VOTING SYSTEM
                                                                                                                                          • Exemplo
                                                                                                                                          • Vantagens e Desvantagens do AVS
                                                                                                                                          • Voto Uacutetil no AVS
                                                                                                                                            • THE BORDA COUNT
                                                                                                                                              • Exemplo
                                                                                                                                              • Vantagens e Desvantagens do BC
                                                                                                                                              • Voto Uacutetil no BC
                                                                                                                                                • SCORE VOTING SYSTEM
                                                                                                                                                  • Exemplo
                                                                                                                                                  • Vantagens e Desvantagens do SVS
                                                                                                                                                  • Voto Uacutetil no SVS
                                                                                                                                                    • BLOC VOTE
                                                                                                                                                      • Exemplo
                                                                                                                                                      • Voto Uacutetil no BV
                                                                                                                                                          • O SIMULADOR
                                                                                                                                                          • CENAacuteRIOS PERTINENTES
                                                                                                                                                            • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                                                                            • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                                                                            • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                                                                            • CENAacuteRIO 4 COALIZOtildeES
                                                                                                                                                            • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                                                                            • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                                                                              • COMO FUNCIONA O SIMULADOR
                                                                                                                                                                • CLASSE Elections
                                                                                                                                                                • CLASSE FirstPastThePost
                                                                                                                                                                • CLASSE TwoRoundSystem
                                                                                                                                                                • CLASSE InstantRunoffVoting
                                                                                                                                                                • CLASSE ApprovalVoting
                                                                                                                                                                • CLASSE BordaCount
                                                                                                                                                                • CLASSE ScoreVoting
                                                                                                                                                                • CLASSE BlocVote
                                                                                                                                                                • TECNOLOGIAS UTILIZADAS
                                                                                                                                                                  • CONCLUSAtildeO
                                                                                                                                                                  • Referecircncias
                                                                                                                                                                  • Meacutetodo create_voters
                                                                                                                                                                  • Meacutetodo create_candidates
                                                                                                                                                                  • Meacutetodo calculate_means
                                                                                                                                                                  • Meacutetodo get_mean
                                                                                                                                                                  • Meacutetodo calculate_mean
                                                                                                                                                                  • Meacutetodo set_leading_candidates
                                                                                                                                                                  • Meacutetodo irv_set_leading_candidates
                                                                                                                                                                  • Meacutetodo sort_ranks
                                                                                                                                                                  • Meacutetodo fptp_count_tactical_votes
                                                                                                                                                                  • Meacutetodo fptp_count_minority_votes
                                                                                                                                                                  • Meacutetodo trs_second_round
                                                                                                                                                                  • Meacutetodo trs_account_for_coalitions
                                                                                                                                                                  • Meacutetodo irv_count_votes
                                                                                                                                                                  • Meacutetodo avs_count_votes
                                                                                                                                                                  • Meacutetodo avs_count_votes_with_tactical
                                                                                                                                                                  • Meacutetodo irv_apply_tactical_votes
                                                                                                                                                                  • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                                                                                  • Meacutetodo bc_sum_candidates_scores
                                                                                                                                                                  • Meacutetodo svs_apply_tactical_votes
                                                                                                                                                                  • Meacutetodo svs_sum_candidates_scores
                                                                                                                                                                  • Meacutetodo bv_count_votes

                                                                                                                        60

                                                                                                                        Figura 57 ndash PDF - Distribuiccedilatildeo Polarizer

                                                                                                                        Figura 58 ndash CDF - Distribuiccedilatildeo Polarizer

                                                                                                                        52 CLASSE FIRSTPASTTHEPOST

                                                                                                                        Existem dois tipos de votos uacuteteis implementados neste simulador o voto taacutetico eo voto de minoria Em ambas as situaccedilotildees a decisatildeo de um eleitor mudar de votono entanto natildeo eacute certa A probabilidade da mudanccedila taacutetica de voto eacute definida por doisparacircmetros por candidato (um para cada tipo de voto uacutetil) Ou seja para cada candidatoeacute possiacutevel definir a porcentagem da populaccedilatildeo de seus eleitores que optaraacute tanto pelovoto taacutetico quanto pelo voto de minoria

                                                                                                                        Foi mencionado anteriormente que os rankings de cada eleitor natildeo satildeo fixos e que nacontabilizaccedilatildeo dos votos uacuteteis eles poderiam ser alterados poreacutem isso natildeo eacute completa-

                                                                                                                        61

                                                                                                                        Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                                                                                                                        Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                                                                                                                        mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                                                                                                                        62

                                                                                                                        53 CLASSE TWOROUNDSYSTEM

                                                                                                                        A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                                                                                                                        54 CLASSE INSTANTRUNOFFVOTING

                                                                                                                        A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                                                                                                                        Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                                                                                                                        63

                                                                                                                        cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                                                                                                                        55 CLASSE APPROVALVOTING

                                                                                                                        Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                                                                                                                        56 CLASSE BORDACOUNT

                                                                                                                        Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                                                                                                                        57 CLASSE SCOREVOTING

                                                                                                                        De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                                                                                                                        64

                                                                                                                        58 CLASSE BLOCVOTE

                                                                                                                        O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                                                                                                                        59 TECNOLOGIAS UTILIZADAS

                                                                                                                        A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                                                                                                                        Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                                                                                                                        O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                                                                                                                        Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                                                                                                                        65

                                                                                                                        6 CONCLUSAtildeO

                                                                                                                        Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                                                                                                                        Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                                                                                                                        Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                                                                                                                        Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                                                                                                                        Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                                                                                                                        66

                                                                                                                        REFEREcircNCIAS

                                                                                                                        AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                                                                                                                        Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                                                                                                                        Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                                                                                                                        Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                                                                                                                        HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                                                                                                                        LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                                                                                                                        ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                                                                                                                        Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                                                                                                                        POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                                                                                                                        The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                                                                                                                        67

                                                                                                                        APEcircNDICES

                                                                                                                        APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                                                                                                        Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                                                                                                        if(not len(selfvoter_profiles))

                                                                                                                        for voter in range(selfN_VOTERS)

                                                                                                                        candidates_rank = dict()

                                                                                                                        for candidate in reversed(range(selfN_CANDIDATES))

                                                                                                                        if(selfBIAS_VECTOR[candidate]==4)

                                                                                                                        candidates_rank[candidate] = self_sortear(selfloved)

                                                                                                                        elif(selfBIAS_VECTOR[candidate]==3)

                                                                                                                        candidates_rank[candidate] = self_sortear(selfliked)

                                                                                                                        elif(selfBIAS_VECTOR[candidate]==2)

                                                                                                                        candidates_rank[candidate] = self_sortear(selfdisliked)

                                                                                                                        elif(selfBIAS_VECTOR[candidate]==1)

                                                                                                                        candidates_rank[candidate] = self_sortear(selfhated)

                                                                                                                        elif(selfBIAS_VECTOR[candidate]==-1)

                                                                                                                        candidates_rank[candidate] = self_sortear(selfpolarizer

                                                                                                                        )

                                                                                                                        elif(selfBIAS_VECTOR[candidate]==-2)

                                                                                                                        candidates_rank[candidate] = self_sortear(self

                                                                                                                        more_polarizer)

                                                                                                                        else

                                                                                                                        candidates_rank[candidate] = self_sortear(selfneutral)

                                                                                                                        selfvotersappend(candidates_rank)

                                                                                                                        else

                                                                                                                        ranges = []

                                                                                                                        ranks = []

                                                                                                                        for prof in selfvoter_profiles

                                                                                                                        rangesappend(int(prof[pop_percentage]))

                                                                                                                        rank =

                                                                                                                        for index score in enumerate(prof[scores])

                                                                                                                        rank[index] = score

                                                                                                                        ranksappend(rank)

                                                                                                                        for index _range in enumerate(ranges)

                                                                                                                        for _ in range(int(selfN_VOTERS(_range100)))

                                                                                                                        selfvotersappend(ranks[index])

                                                                                                                        68

                                                                                                                        APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                                                                                                        Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                                                                                                        for i in range(selfN_CANDIDATES)

                                                                                                                        selfcandidates[i] = 0

                                                                                                                        selfvotes[i] = set()

                                                                                                                        APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                                                                                                        Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                                                                                                        for candidate in range(selfN_CANDIDATES)

                                                                                                                        rating_sum = 0

                                                                                                                        for voter in selfvoters

                                                                                                                        rating_sum += voter[candidate]

                                                                                                                        selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                                                                                                        APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                                                                                                        Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                                                                                                        if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                                                                                                        return selfcalculate_mean(winners)

                                                                                                                        else

                                                                                                                        chose_best = True if winners[0] == selfbest_candidate else

                                                                                                                        False

                                                                                                                        return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                                                                                                        69

                                                                                                                        APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                                                                                                        Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                                                                                                        rating_sum = 0

                                                                                                                        for voter in selfvoters

                                                                                                                        for candidate in winners

                                                                                                                        rating_sum += voter[candidate]

                                                                                                                        return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                                                                                                        APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                                                                                                        Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                                                                                                        for i in range(1 selfN_VACANCIES + 2)

                                                                                                                        selfleading_candidatesappend(selfsorted_candidates[-i][self

                                                                                                                        CANDIDATE_INDEX])

                                                                                                                        APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                                                                                                        Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                                                                                                        for leader in selfelecrounds[-1]

                                                                                                                        selfleading_candidatesappend(leader[0])

                                                                                                                        70

                                                                                                                        APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                                                                                                        Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                                                                                                        self_account_for_coalitions()

                                                                                                                        for voter in selfvoters

                                                                                                                        selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                                                                                                        (1)))

                                                                                                                        temp = []

                                                                                                                        for voter in selfsorted_voters

                                                                                                                        new_dict = defaultdict(list)

                                                                                                                        for k in voter

                                                                                                                        new_dict[k[1]]append(k[0])

                                                                                                                        tempappend(new_dict)

                                                                                                                        selfsorted_voters = []

                                                                                                                        for voter_index current_voter in enumerate(temp)

                                                                                                                        new_voter = []

                                                                                                                        for rating candidate_indexes in current_voteritems()

                                                                                                                        if len(current_voter[rating]) gt 1

                                                                                                                        shuffle(current_voter[rating])

                                                                                                                        for e in candidate_indexes

                                                                                                                        new_voterappend((e rating))

                                                                                                                        else

                                                                                                                        new_voterappend((candidate_indexes[0] rating))

                                                                                                                        selfsorted_votersappend(new_voter)

                                                                                                                        selfcandidates[new_voter[-1][0]] += 1

                                                                                                                        selfvotes[new_voter[-1][0]]add(voter_index)

                                                                                                                        71

                                                                                                                        APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                                                                                                        Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                                                                                                        for candidate in selfvotes_copy

                                                                                                                        if candidate not in selfelecleading_candidates

                                                                                                                        for voter_index in selfvotes_copy[candidate]

                                                                                                                        for index _candidate in enumerate(reversed(selfelec

                                                                                                                        sorted_voters[voter_index]))

                                                                                                                        if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                                                                                                        leading_candidates

                                                                                                                        if randomrandom() lt selfelec

                                                                                                                        tactical_vote_percentages[_candidate[selfelec

                                                                                                                        CANDIDATE_INDEX]]

                                                                                                                        selfrankings_changed[voter_index] = copy

                                                                                                                        deepcopy(selfelecsorted_voters[voter_index])

                                                                                                                        selfrankings_changed[voter_index][-(index + 1)]

                                                                                                                        selfrankings_changed[voter_index][-1] = self

                                                                                                                        rankings_changed[voter_index][-1] self

                                                                                                                        rankings_changed[voter_index][-(index + 1)]

                                                                                                                        selfcandidates[candidate] -= 1

                                                                                                                        selfcandidates[_candidate[selfelec

                                                                                                                        CANDIDATE_INDEX]] += 1

                                                                                                                        selfvotes[candidate]remove(voter_index)

                                                                                                                        selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                                                                                                        ]]add(voter_index)

                                                                                                                        break

                                                                                                                        break

                                                                                                                        72

                                                                                                                        APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                                                                                                        Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                                                                                                        half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                                                                                                        for candidate in selfelecleading_candidates

                                                                                                                        if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                                                                                                        continue

                                                                                                                        for voter_index in selfvotes_copy[candidate]

                                                                                                                        if voter_index in selfrankings_changed

                                                                                                                        ranking = selfrankings_changed[voter_index]

                                                                                                                        else

                                                                                                                        ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                                                                                                        ])

                                                                                                                        for index _candidate in enumerate(reversed(ranking))

                                                                                                                        if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                        leading_candidates or (_candidate[selfelec

                                                                                                                        CANDIDATE_INDEX] in selfelecleading_candidates and

                                                                                                                        selfelecleading_candidatesindex(_candidate[selfelec

                                                                                                                        CANDIDATE_INDEX]) gt= half_vacancies)

                                                                                                                        if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                                                                                                        if randomrandom() lt selfelec

                                                                                                                        minority_vote_percentages[_candidate[selfelec

                                                                                                                        CANDIDATE_INDEX]]

                                                                                                                        selfcandidates[candidate] -= 1

                                                                                                                        selfcandidates[_candidate[selfelec

                                                                                                                        CANDIDATE_INDEX]] += 1

                                                                                                                        break

                                                                                                                        break

                                                                                                                        break

                                                                                                                        73

                                                                                                                        APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                                                                                                        Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                                                                                                        self_account_for_coalitions()

                                                                                                                        for candidate in selfvotes

                                                                                                                        if candidate = selfwinner and candidate = selfsecond_place

                                                                                                                        for voter_index in selfvotes[candidate]

                                                                                                                        if voter_index in selfrankings_changed

                                                                                                                        ranking = selfrankings_changed[voter_index]

                                                                                                                        else

                                                                                                                        ranking = copydeepcopy(selfelecsorted_voters[

                                                                                                                        voter_index])

                                                                                                                        for index2 candidate in enumerate(reversed(ranking))

                                                                                                                        if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                                                                                                        selfcandidates[selfwinner] += 1

                                                                                                                        selfvotes[selfwinner]add(voter_index)

                                                                                                                        break

                                                                                                                        elif candidate[selfelecCANDIDATE_INDEX] == self

                                                                                                                        second_place

                                                                                                                        selfcandidates[selfsecond_place] += 1

                                                                                                                        selfvotes[selfsecond_place]add(voter_index)

                                                                                                                        break

                                                                                                                        selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                                        winners = []

                                                                                                                        vacancies = selfelecN_VACANCIES

                                                                                                                        for candidate in reversed(selfsorted_candidates)

                                                                                                                        if vacancies == 0

                                                                                                                        break

                                                                                                                        winnersappend(candidate[0])

                                                                                                                        vacancies -= 1

                                                                                                                        mean chose_best = selfelecget_mean(winners = winners)

                                                                                                                        74

                                                                                                                        APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                                                                                                        Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                                                                                                        for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                        voter_dict = dict()

                                                                                                                        og_voter_dict = dict()

                                                                                                                        for tup in voter

                                                                                                                        voter_dict[tup[0]] = tup[1]

                                                                                                                        og_voter_dict[tup[0]] = tup[1]

                                                                                                                        for coalition in selfeleccoalitions

                                                                                                                        for candidate in coalition

                                                                                                                        add_to_score = 0

                                                                                                                        for candidate2 in coalition

                                                                                                                        if candidate == candidate2

                                                                                                                        continue

                                                                                                                        half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                                                                                                        if half lt 0

                                                                                                                        add_to_score += mathceil(half)

                                                                                                                        else

                                                                                                                        add_to_score += mathfloor(half)

                                                                                                                        if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                                                                                                        voter_dict[candidate[rsquovaluersquo]] = 10

                                                                                                                        elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                                                                                                        voter_dict[candidate[rsquovaluersquo]] = -10

                                                                                                                        else

                                                                                                                        voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                                                                                                        selfrankings_changed[voter_index] = []

                                                                                                                        for candidate in voter_dict

                                                                                                                        selfrankings_changed[voter_index]append((candidate voter_dict[

                                                                                                                        candidate]))

                                                                                                                        selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                                                                                                        voter_index] key=lambda x x[1])

                                                                                                                        75

                                                                                                                        APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                                                                                        Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                                                                                        selfelecroundsappend(selfsorted_candidates[_round])

                                                                                                                        if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                                        N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                                                                                        N_VACANCIES - 1)

                                                                                                                        return 2

                                                                                                                        elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                                        N_VOTERS gt 05)

                                                                                                                        return 1

                                                                                                                        else

                                                                                                                        selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                                                                                        CANDIDATE_INDEX])

                                                                                                                        for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                                                                                        elecCANDIDATE_INDEX]]

                                                                                                                        if voter_index in selfrankings_changed

                                                                                                                        for candidate in reversed(selfrankings_changed[voter_index

                                                                                                                        ])

                                                                                                                        if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                        excluded

                                                                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                                        ]] += 1

                                                                                                                        selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                                        add(voter_index)

                                                                                                                        break

                                                                                                                        else

                                                                                                                        continue

                                                                                                                        else

                                                                                                                        for candidate in reversed(selfelecsorted_voters[

                                                                                                                        voter_index])

                                                                                                                        if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                        excluded

                                                                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                                        ]] += 1

                                                                                                                        selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                                        add(voter_index)

                                                                                                                        break

                                                                                                                        else

                                                                                                                        continue

                                                                                                                        selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                                        return 0

                                                                                                                        76

                                                                                                                        APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                                                                                        Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                                                                                        for index in range(selfelecN_CANDIDATES)

                                                                                                                        selfcandidates[index] = 0

                                                                                                                        for voter in selfelecsorted_voters

                                                                                                                        for candidate in reversed(voter)

                                                                                                                        if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                        else

                                                                                                                        break

                                                                                                                        APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                                                                                        Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                                                                                        for index in range(selfelecN_CANDIDATES)

                                                                                                                        selfcandidates[index] = 0

                                                                                                                        for voter in selfelecsorted_voters

                                                                                                                        if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                                        elecCANDIDATE_INDEX]]

                                                                                                                        selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                                                                                        else

                                                                                                                        for candidate in reversed(voter)

                                                                                                                        if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                        else

                                                                                                                        break

                                                                                                                        77

                                                                                                                        APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                                                                                        Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                                                                                        pos = set()

                                                                                                                        for index perc in enumerate(selfelectactical_vote_percentages)

                                                                                                                        if perc gt 0

                                                                                                                        posadd(index)

                                                                                                                        for candidate in selfeleccandidates

                                                                                                                        if candidate not in selfleading_candidates

                                                                                                                        for voter_index in selfvotes[candidate]

                                                                                                                        raised = None

                                                                                                                        for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                                                                                        ])

                                                                                                                        if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                                                                                        leading_candidates

                                                                                                                        if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                                                                                        if randomrandom() lt selfelectactical_vote_percentages[

                                                                                                                        candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                                                                                        ranking = [None]selfelecN_CANDIDATES

                                                                                                                        ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                        selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                        CANDIDATE_INDEX]])

                                                                                                                        raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                        break

                                                                                                                        break

                                                                                                                        break

                                                                                                                        if raised = None

                                                                                                                        for _candidate in selfleading_candidates

                                                                                                                        if _candidate = ranking[-1][0]

                                                                                                                        ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                                        _candidate])

                                                                                                                        buried = _candidate

                                                                                                                        break

                                                                                                                        i = 1

                                                                                                                        for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                                        if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                                                                                        buried]

                                                                                                                        continue

                                                                                                                        else

                                                                                                                        ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                        selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                        CANDIDATE_INDEX]])

                                                                                                                        i += 1

                                                                                                                        selfrankings_changed[voter_index] = ranking

                                                                                                                        78

                                                                                                                        APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                                                                                        Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                                                                                        for voter_index in selfvotes[candidate]

                                                                                                                        if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                                                                                        ]

                                                                                                                        for _candidate in selfleading_candidates

                                                                                                                        if _candidate = candidate

                                                                                                                        ranking = [None]selfelecN_CANDIDATES

                                                                                                                        ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                                        _candidate])

                                                                                                                        buried = _candidate

                                                                                                                        break

                                                                                                                        i = 1

                                                                                                                        for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                                        if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                                                                                        continue

                                                                                                                        else

                                                                                                                        ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                        selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                        CANDIDATE_INDEX]])

                                                                                                                        i += 1

                                                                                                                        selfrankings_changed[voter_index] = ranking

                                                                                                                        79

                                                                                                                        APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                                                                                        Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                                                                                        for index in range(selfelecN_CANDIDATES)

                                                                                                                        selfcandidates[index] = 0

                                                                                                                        for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                        score = 0

                                                                                                                        if voter_index in selfrankings_changed

                                                                                                                        for candidate in selfrankings_changed[voter_index]

                                                                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                                        score += 1

                                                                                                                        else

                                                                                                                        for candidate in voter

                                                                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                                        score += 1

                                                                                                                        APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                                                                                        Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                                                                                        for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                        if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                                        elecCANDIDATE_INDEX]]

                                                                                                                        selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                                                                                        sorted_voters[voter_index])

                                                                                                                        for candidate_index candidate in enumerate(reversed(voter))

                                                                                                                        if candidate_index == 0

                                                                                                                        selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                                        voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                                                                                        else

                                                                                                                        selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                                        voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                                                                                        80

                                                                                                                        APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                                                                                        Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                                                                                        for index in range(selfelecN_CANDIDATES)

                                                                                                                        selfcandidates[index] = 0

                                                                                                                        for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                        if voter_index in selfrankings_changed

                                                                                                                        for candidate in selfrankings_changed[voter_index]

                                                                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                                        selfelecCANDIDATE_RANK]

                                                                                                                        else

                                                                                                                        for candidate in voter

                                                                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                                        selfelecCANDIDATE_RANK]

                                                                                                                        APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                                                                                        Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                                                                                        for index in range(selfelecN_CANDIDATES)

                                                                                                                        selfcandidates[index] = 0

                                                                                                                        for voter in selfelecsorted_voters

                                                                                                                        votes = selfelecN_VACANCIES

                                                                                                                        for candidate in reversed(voter)

                                                                                                                        if votes == 0

                                                                                                                        break

                                                                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                        votes -= 1

                                                                                                                        • Folha de aprovaccedilatildeo
                                                                                                                        • Agradecimentos
                                                                                                                        • Epiacutegrafe
                                                                                                                        • Resumo
                                                                                                                        • Abstract
                                                                                                                        • Lista de ilustraccedilotildees
                                                                                                                        • Lista de Coacutedigos
                                                                                                                        • Lista de tabelas
                                                                                                                        • Lista de abreviaturas e siglas
                                                                                                                        • Sumaacuterio
                                                                                                                        • INTRODUCcedilAtildeO
                                                                                                                          • MOTIVACcedilAtildeO E OBJETIVO
                                                                                                                          • MEacuteTODO
                                                                                                                          • ESTRUTURA
                                                                                                                            • SISTEMAS ELEITORAIS
                                                                                                                              • FISRT PAST THE POST
                                                                                                                                • Exemplo
                                                                                                                                • Vantagens e Desvantagens do FPTP
                                                                                                                                • Voto Uacutetil no FPTP
                                                                                                                                  • TWO-ROUND SYSTEM
                                                                                                                                    • Exemplo
                                                                                                                                    • Vantagens e Desvantagens do TRS
                                                                                                                                    • Voto Uacutetil no TRS
                                                                                                                                      • INSTANT-RUNOFF VOTING
                                                                                                                                        • Exemplo
                                                                                                                                        • Vantagens e Desvantagens do IRV
                                                                                                                                        • Voto Uacutetil no IRV
                                                                                                                                          • APPROVAL VOTING SYSTEM
                                                                                                                                            • Exemplo
                                                                                                                                            • Vantagens e Desvantagens do AVS
                                                                                                                                            • Voto Uacutetil no AVS
                                                                                                                                              • THE BORDA COUNT
                                                                                                                                                • Exemplo
                                                                                                                                                • Vantagens e Desvantagens do BC
                                                                                                                                                • Voto Uacutetil no BC
                                                                                                                                                  • SCORE VOTING SYSTEM
                                                                                                                                                    • Exemplo
                                                                                                                                                    • Vantagens e Desvantagens do SVS
                                                                                                                                                    • Voto Uacutetil no SVS
                                                                                                                                                      • BLOC VOTE
                                                                                                                                                        • Exemplo
                                                                                                                                                        • Voto Uacutetil no BV
                                                                                                                                                            • O SIMULADOR
                                                                                                                                                            • CENAacuteRIOS PERTINENTES
                                                                                                                                                              • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                                                                              • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                                                                              • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                                                                              • CENAacuteRIO 4 COALIZOtildeES
                                                                                                                                                              • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                                                                              • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                                                                                • COMO FUNCIONA O SIMULADOR
                                                                                                                                                                  • CLASSE Elections
                                                                                                                                                                  • CLASSE FirstPastThePost
                                                                                                                                                                  • CLASSE TwoRoundSystem
                                                                                                                                                                  • CLASSE InstantRunoffVoting
                                                                                                                                                                  • CLASSE ApprovalVoting
                                                                                                                                                                  • CLASSE BordaCount
                                                                                                                                                                  • CLASSE ScoreVoting
                                                                                                                                                                  • CLASSE BlocVote
                                                                                                                                                                  • TECNOLOGIAS UTILIZADAS
                                                                                                                                                                    • CONCLUSAtildeO
                                                                                                                                                                    • Referecircncias
                                                                                                                                                                    • Meacutetodo create_voters
                                                                                                                                                                    • Meacutetodo create_candidates
                                                                                                                                                                    • Meacutetodo calculate_means
                                                                                                                                                                    • Meacutetodo get_mean
                                                                                                                                                                    • Meacutetodo calculate_mean
                                                                                                                                                                    • Meacutetodo set_leading_candidates
                                                                                                                                                                    • Meacutetodo irv_set_leading_candidates
                                                                                                                                                                    • Meacutetodo sort_ranks
                                                                                                                                                                    • Meacutetodo fptp_count_tactical_votes
                                                                                                                                                                    • Meacutetodo fptp_count_minority_votes
                                                                                                                                                                    • Meacutetodo trs_second_round
                                                                                                                                                                    • Meacutetodo trs_account_for_coalitions
                                                                                                                                                                    • Meacutetodo irv_count_votes
                                                                                                                                                                    • Meacutetodo avs_count_votes
                                                                                                                                                                    • Meacutetodo avs_count_votes_with_tactical
                                                                                                                                                                    • Meacutetodo irv_apply_tactical_votes
                                                                                                                                                                    • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                                                                                    • Meacutetodo bc_sum_candidates_scores
                                                                                                                                                                    • Meacutetodo svs_apply_tactical_votes
                                                                                                                                                                    • Meacutetodo svs_sum_candidates_scores
                                                                                                                                                                    • Meacutetodo bv_count_votes

                                                                                                                          61

                                                                                                                          Figura 59 ndash PDF - Distribuiccedilatildeo Strongly Polarizer

                                                                                                                          Figura 60 ndash CDF - Distribuiccedilatildeo Strongly Polarizer

                                                                                                                          mente verdade A estrutura que guarda esses rankings denominada sorted_voterseacute o resultado do meacutetodo sort_ranks da classe Elections Essa estrutura eacute fixa du-rante toda a simulaccedilatildeo e os meacutetodos correspondentes ao voto uacutetil natildeo a modificam poiscada sistema eleitoral aplica suas mudanccedilas de maneira distinta e para um nuacutemero grandede eleitores fica muito custoso fazer uma coacutepia dessa estrutura para cada um deles Aoinveacutes disso cada classe guarda uma lista separada contendo apenas os rankings modifica-dos Essa lista eacute verificada durante a contabilizaccedilatildeo dos votos taacuteticos e dos votos deminoria que satildeo feitas pelos meacutetodos fptp_count_tactical_votes (apecircndice I) efptp_count_minority_votes (apecircndice J) respectivamente

                                                                                                                          62

                                                                                                                          53 CLASSE TWOROUNDSYSTEM

                                                                                                                          A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                                                                                                                          54 CLASSE INSTANTRUNOFFVOTING

                                                                                                                          A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                                                                                                                          Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                                                                                                                          63

                                                                                                                          cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                                                                                                                          55 CLASSE APPROVALVOTING

                                                                                                                          Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                                                                                                                          56 CLASSE BORDACOUNT

                                                                                                                          Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                                                                                                                          57 CLASSE SCOREVOTING

                                                                                                                          De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                                                                                                                          64

                                                                                                                          58 CLASSE BLOCVOTE

                                                                                                                          O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                                                                                                                          59 TECNOLOGIAS UTILIZADAS

                                                                                                                          A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                                                                                                                          Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                                                                                                                          O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                                                                                                                          Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                                                                                                                          65

                                                                                                                          6 CONCLUSAtildeO

                                                                                                                          Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                                                                                                                          Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                                                                                                                          Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                                                                                                                          Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                                                                                                                          Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                                                                                                                          66

                                                                                                                          REFEREcircNCIAS

                                                                                                                          AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                                                                                                                          Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                                                                                                                          Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                                                                                                                          Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                                                                                                                          HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                                                                                                                          LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                                                                                                                          ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                                                                                                                          Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                                                                                                                          POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                                                                                                                          The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                                                                                                                          67

                                                                                                                          APEcircNDICES

                                                                                                                          APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                                                                                                          Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                                                                                                          if(not len(selfvoter_profiles))

                                                                                                                          for voter in range(selfN_VOTERS)

                                                                                                                          candidates_rank = dict()

                                                                                                                          for candidate in reversed(range(selfN_CANDIDATES))

                                                                                                                          if(selfBIAS_VECTOR[candidate]==4)

                                                                                                                          candidates_rank[candidate] = self_sortear(selfloved)

                                                                                                                          elif(selfBIAS_VECTOR[candidate]==3)

                                                                                                                          candidates_rank[candidate] = self_sortear(selfliked)

                                                                                                                          elif(selfBIAS_VECTOR[candidate]==2)

                                                                                                                          candidates_rank[candidate] = self_sortear(selfdisliked)

                                                                                                                          elif(selfBIAS_VECTOR[candidate]==1)

                                                                                                                          candidates_rank[candidate] = self_sortear(selfhated)

                                                                                                                          elif(selfBIAS_VECTOR[candidate]==-1)

                                                                                                                          candidates_rank[candidate] = self_sortear(selfpolarizer

                                                                                                                          )

                                                                                                                          elif(selfBIAS_VECTOR[candidate]==-2)

                                                                                                                          candidates_rank[candidate] = self_sortear(self

                                                                                                                          more_polarizer)

                                                                                                                          else

                                                                                                                          candidates_rank[candidate] = self_sortear(selfneutral)

                                                                                                                          selfvotersappend(candidates_rank)

                                                                                                                          else

                                                                                                                          ranges = []

                                                                                                                          ranks = []

                                                                                                                          for prof in selfvoter_profiles

                                                                                                                          rangesappend(int(prof[pop_percentage]))

                                                                                                                          rank =

                                                                                                                          for index score in enumerate(prof[scores])

                                                                                                                          rank[index] = score

                                                                                                                          ranksappend(rank)

                                                                                                                          for index _range in enumerate(ranges)

                                                                                                                          for _ in range(int(selfN_VOTERS(_range100)))

                                                                                                                          selfvotersappend(ranks[index])

                                                                                                                          68

                                                                                                                          APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                                                                                                          Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                                                                                                          for i in range(selfN_CANDIDATES)

                                                                                                                          selfcandidates[i] = 0

                                                                                                                          selfvotes[i] = set()

                                                                                                                          APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                                                                                                          Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                                                                                                          for candidate in range(selfN_CANDIDATES)

                                                                                                                          rating_sum = 0

                                                                                                                          for voter in selfvoters

                                                                                                                          rating_sum += voter[candidate]

                                                                                                                          selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                                                                                                          APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                                                                                                          Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                                                                                                          if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                                                                                                          return selfcalculate_mean(winners)

                                                                                                                          else

                                                                                                                          chose_best = True if winners[0] == selfbest_candidate else

                                                                                                                          False

                                                                                                                          return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                                                                                                          69

                                                                                                                          APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                                                                                                          Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                                                                                                          rating_sum = 0

                                                                                                                          for voter in selfvoters

                                                                                                                          for candidate in winners

                                                                                                                          rating_sum += voter[candidate]

                                                                                                                          return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                                                                                                          APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                                                                                                          Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                                                                                                          for i in range(1 selfN_VACANCIES + 2)

                                                                                                                          selfleading_candidatesappend(selfsorted_candidates[-i][self

                                                                                                                          CANDIDATE_INDEX])

                                                                                                                          APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                                                                                                          Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                                                                                                          for leader in selfelecrounds[-1]

                                                                                                                          selfleading_candidatesappend(leader[0])

                                                                                                                          70

                                                                                                                          APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                                                                                                          Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                                                                                                          self_account_for_coalitions()

                                                                                                                          for voter in selfvoters

                                                                                                                          selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                                                                                                          (1)))

                                                                                                                          temp = []

                                                                                                                          for voter in selfsorted_voters

                                                                                                                          new_dict = defaultdict(list)

                                                                                                                          for k in voter

                                                                                                                          new_dict[k[1]]append(k[0])

                                                                                                                          tempappend(new_dict)

                                                                                                                          selfsorted_voters = []

                                                                                                                          for voter_index current_voter in enumerate(temp)

                                                                                                                          new_voter = []

                                                                                                                          for rating candidate_indexes in current_voteritems()

                                                                                                                          if len(current_voter[rating]) gt 1

                                                                                                                          shuffle(current_voter[rating])

                                                                                                                          for e in candidate_indexes

                                                                                                                          new_voterappend((e rating))

                                                                                                                          else

                                                                                                                          new_voterappend((candidate_indexes[0] rating))

                                                                                                                          selfsorted_votersappend(new_voter)

                                                                                                                          selfcandidates[new_voter[-1][0]] += 1

                                                                                                                          selfvotes[new_voter[-1][0]]add(voter_index)

                                                                                                                          71

                                                                                                                          APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                                                                                                          Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                                                                                                          for candidate in selfvotes_copy

                                                                                                                          if candidate not in selfelecleading_candidates

                                                                                                                          for voter_index in selfvotes_copy[candidate]

                                                                                                                          for index _candidate in enumerate(reversed(selfelec

                                                                                                                          sorted_voters[voter_index]))

                                                                                                                          if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                                                                                                          leading_candidates

                                                                                                                          if randomrandom() lt selfelec

                                                                                                                          tactical_vote_percentages[_candidate[selfelec

                                                                                                                          CANDIDATE_INDEX]]

                                                                                                                          selfrankings_changed[voter_index] = copy

                                                                                                                          deepcopy(selfelecsorted_voters[voter_index])

                                                                                                                          selfrankings_changed[voter_index][-(index + 1)]

                                                                                                                          selfrankings_changed[voter_index][-1] = self

                                                                                                                          rankings_changed[voter_index][-1] self

                                                                                                                          rankings_changed[voter_index][-(index + 1)]

                                                                                                                          selfcandidates[candidate] -= 1

                                                                                                                          selfcandidates[_candidate[selfelec

                                                                                                                          CANDIDATE_INDEX]] += 1

                                                                                                                          selfvotes[candidate]remove(voter_index)

                                                                                                                          selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                                                                                                          ]]add(voter_index)

                                                                                                                          break

                                                                                                                          break

                                                                                                                          72

                                                                                                                          APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                                                                                                          Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                                                                                                          half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                                                                                                          for candidate in selfelecleading_candidates

                                                                                                                          if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                                                                                                          continue

                                                                                                                          for voter_index in selfvotes_copy[candidate]

                                                                                                                          if voter_index in selfrankings_changed

                                                                                                                          ranking = selfrankings_changed[voter_index]

                                                                                                                          else

                                                                                                                          ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                                                                                                          ])

                                                                                                                          for index _candidate in enumerate(reversed(ranking))

                                                                                                                          if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                          leading_candidates or (_candidate[selfelec

                                                                                                                          CANDIDATE_INDEX] in selfelecleading_candidates and

                                                                                                                          selfelecleading_candidatesindex(_candidate[selfelec

                                                                                                                          CANDIDATE_INDEX]) gt= half_vacancies)

                                                                                                                          if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                                                                                                          if randomrandom() lt selfelec

                                                                                                                          minority_vote_percentages[_candidate[selfelec

                                                                                                                          CANDIDATE_INDEX]]

                                                                                                                          selfcandidates[candidate] -= 1

                                                                                                                          selfcandidates[_candidate[selfelec

                                                                                                                          CANDIDATE_INDEX]] += 1

                                                                                                                          break

                                                                                                                          break

                                                                                                                          break

                                                                                                                          73

                                                                                                                          APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                                                                                                          Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                                                                                                          self_account_for_coalitions()

                                                                                                                          for candidate in selfvotes

                                                                                                                          if candidate = selfwinner and candidate = selfsecond_place

                                                                                                                          for voter_index in selfvotes[candidate]

                                                                                                                          if voter_index in selfrankings_changed

                                                                                                                          ranking = selfrankings_changed[voter_index]

                                                                                                                          else

                                                                                                                          ranking = copydeepcopy(selfelecsorted_voters[

                                                                                                                          voter_index])

                                                                                                                          for index2 candidate in enumerate(reversed(ranking))

                                                                                                                          if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                                                                                                          selfcandidates[selfwinner] += 1

                                                                                                                          selfvotes[selfwinner]add(voter_index)

                                                                                                                          break

                                                                                                                          elif candidate[selfelecCANDIDATE_INDEX] == self

                                                                                                                          second_place

                                                                                                                          selfcandidates[selfsecond_place] += 1

                                                                                                                          selfvotes[selfsecond_place]add(voter_index)

                                                                                                                          break

                                                                                                                          selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                                          winners = []

                                                                                                                          vacancies = selfelecN_VACANCIES

                                                                                                                          for candidate in reversed(selfsorted_candidates)

                                                                                                                          if vacancies == 0

                                                                                                                          break

                                                                                                                          winnersappend(candidate[0])

                                                                                                                          vacancies -= 1

                                                                                                                          mean chose_best = selfelecget_mean(winners = winners)

                                                                                                                          74

                                                                                                                          APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                                                                                                          Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                                                                                                          for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                          voter_dict = dict()

                                                                                                                          og_voter_dict = dict()

                                                                                                                          for tup in voter

                                                                                                                          voter_dict[tup[0]] = tup[1]

                                                                                                                          og_voter_dict[tup[0]] = tup[1]

                                                                                                                          for coalition in selfeleccoalitions

                                                                                                                          for candidate in coalition

                                                                                                                          add_to_score = 0

                                                                                                                          for candidate2 in coalition

                                                                                                                          if candidate == candidate2

                                                                                                                          continue

                                                                                                                          half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                                                                                                          if half lt 0

                                                                                                                          add_to_score += mathceil(half)

                                                                                                                          else

                                                                                                                          add_to_score += mathfloor(half)

                                                                                                                          if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                                                                                                          voter_dict[candidate[rsquovaluersquo]] = 10

                                                                                                                          elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                                                                                                          voter_dict[candidate[rsquovaluersquo]] = -10

                                                                                                                          else

                                                                                                                          voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                                                                                                          selfrankings_changed[voter_index] = []

                                                                                                                          for candidate in voter_dict

                                                                                                                          selfrankings_changed[voter_index]append((candidate voter_dict[

                                                                                                                          candidate]))

                                                                                                                          selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                                                                                                          voter_index] key=lambda x x[1])

                                                                                                                          75

                                                                                                                          APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                                                                                          Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                                                                                          selfelecroundsappend(selfsorted_candidates[_round])

                                                                                                                          if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                                          N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                                                                                          N_VACANCIES - 1)

                                                                                                                          return 2

                                                                                                                          elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                                          N_VOTERS gt 05)

                                                                                                                          return 1

                                                                                                                          else

                                                                                                                          selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                                                                                          CANDIDATE_INDEX])

                                                                                                                          for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                                                                                          elecCANDIDATE_INDEX]]

                                                                                                                          if voter_index in selfrankings_changed

                                                                                                                          for candidate in reversed(selfrankings_changed[voter_index

                                                                                                                          ])

                                                                                                                          if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                          excluded

                                                                                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                                          ]] += 1

                                                                                                                          selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                                          add(voter_index)

                                                                                                                          break

                                                                                                                          else

                                                                                                                          continue

                                                                                                                          else

                                                                                                                          for candidate in reversed(selfelecsorted_voters[

                                                                                                                          voter_index])

                                                                                                                          if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                          excluded

                                                                                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                                          ]] += 1

                                                                                                                          selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                                          add(voter_index)

                                                                                                                          break

                                                                                                                          else

                                                                                                                          continue

                                                                                                                          selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                                          return 0

                                                                                                                          76

                                                                                                                          APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                                                                                          Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                                                                                          for index in range(selfelecN_CANDIDATES)

                                                                                                                          selfcandidates[index] = 0

                                                                                                                          for voter in selfelecsorted_voters

                                                                                                                          for candidate in reversed(voter)

                                                                                                                          if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                          else

                                                                                                                          break

                                                                                                                          APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                                                                                          Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                                                                                          for index in range(selfelecN_CANDIDATES)

                                                                                                                          selfcandidates[index] = 0

                                                                                                                          for voter in selfelecsorted_voters

                                                                                                                          if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                                          elecCANDIDATE_INDEX]]

                                                                                                                          selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                                                                                          else

                                                                                                                          for candidate in reversed(voter)

                                                                                                                          if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                          else

                                                                                                                          break

                                                                                                                          77

                                                                                                                          APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                                                                                          Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                                                                                          pos = set()

                                                                                                                          for index perc in enumerate(selfelectactical_vote_percentages)

                                                                                                                          if perc gt 0

                                                                                                                          posadd(index)

                                                                                                                          for candidate in selfeleccandidates

                                                                                                                          if candidate not in selfleading_candidates

                                                                                                                          for voter_index in selfvotes[candidate]

                                                                                                                          raised = None

                                                                                                                          for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                                                                                          ])

                                                                                                                          if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                                                                                          leading_candidates

                                                                                                                          if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                                                                                          if randomrandom() lt selfelectactical_vote_percentages[

                                                                                                                          candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                                                                                          ranking = [None]selfelecN_CANDIDATES

                                                                                                                          ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                          selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                          CANDIDATE_INDEX]])

                                                                                                                          raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                          break

                                                                                                                          break

                                                                                                                          break

                                                                                                                          if raised = None

                                                                                                                          for _candidate in selfleading_candidates

                                                                                                                          if _candidate = ranking[-1][0]

                                                                                                                          ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                                          _candidate])

                                                                                                                          buried = _candidate

                                                                                                                          break

                                                                                                                          i = 1

                                                                                                                          for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                                          if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                                                                                          buried]

                                                                                                                          continue

                                                                                                                          else

                                                                                                                          ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                          selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                          CANDIDATE_INDEX]])

                                                                                                                          i += 1

                                                                                                                          selfrankings_changed[voter_index] = ranking

                                                                                                                          78

                                                                                                                          APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                                                                                          Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                                                                                          for voter_index in selfvotes[candidate]

                                                                                                                          if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                                                                                          ]

                                                                                                                          for _candidate in selfleading_candidates

                                                                                                                          if _candidate = candidate

                                                                                                                          ranking = [None]selfelecN_CANDIDATES

                                                                                                                          ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                                          _candidate])

                                                                                                                          buried = _candidate

                                                                                                                          break

                                                                                                                          i = 1

                                                                                                                          for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                                          if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                                                                                          continue

                                                                                                                          else

                                                                                                                          ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                          selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                          CANDIDATE_INDEX]])

                                                                                                                          i += 1

                                                                                                                          selfrankings_changed[voter_index] = ranking

                                                                                                                          79

                                                                                                                          APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                                                                                          Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                                                                                          for index in range(selfelecN_CANDIDATES)

                                                                                                                          selfcandidates[index] = 0

                                                                                                                          for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                          score = 0

                                                                                                                          if voter_index in selfrankings_changed

                                                                                                                          for candidate in selfrankings_changed[voter_index]

                                                                                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                                          score += 1

                                                                                                                          else

                                                                                                                          for candidate in voter

                                                                                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                                          score += 1

                                                                                                                          APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                                                                                          Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                                                                                          for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                          if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                                          elecCANDIDATE_INDEX]]

                                                                                                                          selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                                                                                          sorted_voters[voter_index])

                                                                                                                          for candidate_index candidate in enumerate(reversed(voter))

                                                                                                                          if candidate_index == 0

                                                                                                                          selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                                          voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                                                                                          else

                                                                                                                          selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                                          voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                                                                                          80

                                                                                                                          APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                                                                                          Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                                                                                          for index in range(selfelecN_CANDIDATES)

                                                                                                                          selfcandidates[index] = 0

                                                                                                                          for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                          if voter_index in selfrankings_changed

                                                                                                                          for candidate in selfrankings_changed[voter_index]

                                                                                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                                          selfelecCANDIDATE_RANK]

                                                                                                                          else

                                                                                                                          for candidate in voter

                                                                                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                                          selfelecCANDIDATE_RANK]

                                                                                                                          APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                                                                                          Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                                                                                          for index in range(selfelecN_CANDIDATES)

                                                                                                                          selfcandidates[index] = 0

                                                                                                                          for voter in selfelecsorted_voters

                                                                                                                          votes = selfelecN_VACANCIES

                                                                                                                          for candidate in reversed(voter)

                                                                                                                          if votes == 0

                                                                                                                          break

                                                                                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                          votes -= 1

                                                                                                                          • Folha de aprovaccedilatildeo
                                                                                                                          • Agradecimentos
                                                                                                                          • Epiacutegrafe
                                                                                                                          • Resumo
                                                                                                                          • Abstract
                                                                                                                          • Lista de ilustraccedilotildees
                                                                                                                          • Lista de Coacutedigos
                                                                                                                          • Lista de tabelas
                                                                                                                          • Lista de abreviaturas e siglas
                                                                                                                          • Sumaacuterio
                                                                                                                          • INTRODUCcedilAtildeO
                                                                                                                            • MOTIVACcedilAtildeO E OBJETIVO
                                                                                                                            • MEacuteTODO
                                                                                                                            • ESTRUTURA
                                                                                                                              • SISTEMAS ELEITORAIS
                                                                                                                                • FISRT PAST THE POST
                                                                                                                                  • Exemplo
                                                                                                                                  • Vantagens e Desvantagens do FPTP
                                                                                                                                  • Voto Uacutetil no FPTP
                                                                                                                                    • TWO-ROUND SYSTEM
                                                                                                                                      • Exemplo
                                                                                                                                      • Vantagens e Desvantagens do TRS
                                                                                                                                      • Voto Uacutetil no TRS
                                                                                                                                        • INSTANT-RUNOFF VOTING
                                                                                                                                          • Exemplo
                                                                                                                                          • Vantagens e Desvantagens do IRV
                                                                                                                                          • Voto Uacutetil no IRV
                                                                                                                                            • APPROVAL VOTING SYSTEM
                                                                                                                                              • Exemplo
                                                                                                                                              • Vantagens e Desvantagens do AVS
                                                                                                                                              • Voto Uacutetil no AVS
                                                                                                                                                • THE BORDA COUNT
                                                                                                                                                  • Exemplo
                                                                                                                                                  • Vantagens e Desvantagens do BC
                                                                                                                                                  • Voto Uacutetil no BC
                                                                                                                                                    • SCORE VOTING SYSTEM
                                                                                                                                                      • Exemplo
                                                                                                                                                      • Vantagens e Desvantagens do SVS
                                                                                                                                                      • Voto Uacutetil no SVS
                                                                                                                                                        • BLOC VOTE
                                                                                                                                                          • Exemplo
                                                                                                                                                          • Voto Uacutetil no BV
                                                                                                                                                              • O SIMULADOR
                                                                                                                                                              • CENAacuteRIOS PERTINENTES
                                                                                                                                                                • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                                                                                • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                                                                                • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                                                                                • CENAacuteRIO 4 COALIZOtildeES
                                                                                                                                                                • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                                                                                • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                                                                                  • COMO FUNCIONA O SIMULADOR
                                                                                                                                                                    • CLASSE Elections
                                                                                                                                                                    • CLASSE FirstPastThePost
                                                                                                                                                                    • CLASSE TwoRoundSystem
                                                                                                                                                                    • CLASSE InstantRunoffVoting
                                                                                                                                                                    • CLASSE ApprovalVoting
                                                                                                                                                                    • CLASSE BordaCount
                                                                                                                                                                    • CLASSE ScoreVoting
                                                                                                                                                                    • CLASSE BlocVote
                                                                                                                                                                    • TECNOLOGIAS UTILIZADAS
                                                                                                                                                                      • CONCLUSAtildeO
                                                                                                                                                                      • Referecircncias
                                                                                                                                                                      • Meacutetodo create_voters
                                                                                                                                                                      • Meacutetodo create_candidates
                                                                                                                                                                      • Meacutetodo calculate_means
                                                                                                                                                                      • Meacutetodo get_mean
                                                                                                                                                                      • Meacutetodo calculate_mean
                                                                                                                                                                      • Meacutetodo set_leading_candidates
                                                                                                                                                                      • Meacutetodo irv_set_leading_candidates
                                                                                                                                                                      • Meacutetodo sort_ranks
                                                                                                                                                                      • Meacutetodo fptp_count_tactical_votes
                                                                                                                                                                      • Meacutetodo fptp_count_minority_votes
                                                                                                                                                                      • Meacutetodo trs_second_round
                                                                                                                                                                      • Meacutetodo trs_account_for_coalitions
                                                                                                                                                                      • Meacutetodo irv_count_votes
                                                                                                                                                                      • Meacutetodo avs_count_votes
                                                                                                                                                                      • Meacutetodo avs_count_votes_with_tactical
                                                                                                                                                                      • Meacutetodo irv_apply_tactical_votes
                                                                                                                                                                      • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                                                                                      • Meacutetodo bc_sum_candidates_scores
                                                                                                                                                                      • Meacutetodo svs_apply_tactical_votes
                                                                                                                                                                      • Meacutetodo svs_sum_candidates_scores
                                                                                                                                                                      • Meacutetodo bv_count_votes

                                                                                                                            62

                                                                                                                            53 CLASSE TWOROUNDSYSTEM

                                                                                                                            A primeira rodada do Two-round System eacute essencialmente a simulaccedilatildeo da classe an-terior poreacutem ao inveacutes de selecionar diretamente o primeiro candidato como vencedor osistema captura os dois primeiros Durante essa primeira rodada os dois tipos de votouacutetil satildeo contabilizados da mesma forma que no FPTP Em seguida eacute feita a checagemda proporccedilatildeo de votos do primeiro colocado pois se for maior que 50 a segunda rodadanatildeo precisa ser simulada No entanto antes da simulaccedilatildeo da segunda rodada eacute necessaacuteriofazer a contabilizaccedilatildeo das coalizotildees Uma coalizatildeo pode tanto melhorar a nota de umcandidato quanto pioraacute-la dependendo das notas que o eleitor daacute para os outros candida-tos da coalizatildeo Para cada candidato de uma coalizatildeo se soma agrave sua nota a parte inteirada metade das notas dos outros candidatos pertencentes agravequela coalizatildeo Por exemplose um eleitor qualquer daacute a nota 4 para um candidato C1 que pertence a uma coalizatildeocom um outro candidato C2 a quem foi atribuiacuteda a nota 7 ao candidato C1 seraacute somadaa parte inteira da metade de 7 resultando em 4+3=7 e ao candidato C2 seraacute atribuiacuteda asua nota original mais a metade de 4 resultando em 7+2=9 Essa contabilizaccedilatildeo eacute feitapelo meacutetodo trs_account_for_coalitions (apecircndice L) Na segunda rodada todosos votos dos candidatos eliminados satildeo redistribuiacutedos segundo as segundas preferecircnciasdeterminadas pelos rankings dos eleitores Essa contabilizaccedilatildeo final eacute feita com o meacutetodotrs_second_round (apecircndice K)

                                                                                                                            54 CLASSE INSTANTRUNOFFVOTING

                                                                                                                            A simulaccedilatildeo do IRV consiste na chamada do meacutetodo irv_count_votes (apecircndiceM) a cada rodada da eleiccedilatildeo Esse meacutetodo checa se algum eleitor jaacute possui mais de 50 dosvotos ou se a rodada atual eacute a uacuteltima rodada (o nuacutemero de rodadas eacute sempre um a menosque o nuacutemero de candidatos) Caso contraacuterio o candidato com menos votos eacute adicionadoa uma lista de candidatos eliminados e o ranking de seus eleitores satildeo analisados Se iterapor cada ranking do candidato mais bem ranqueado ao menos e o primeiro candidatoque natildeo estiver na lista de eliminados recebe o voto Apoacutes a transferecircncia dos votos docandidato eliminado a simulaccedilatildeo continua para a proacutexima rodada

                                                                                                                            Quando o voto taacutetico estaacute habilitado o sistema eacute simulado duas vezes A primeirasimulaccedilatildeo ocorre sem votos taacuteticos e seu propoacutesito eacute definir quem satildeo os liacutederes da elei-ccedilatildeo Ela funciona como uma pesquisa eleitoral para os eleitores que optarem pelo vototaacutetico Com isso essa classe possui um meacutetodo proacuteprio para preencher a lista de candi-datos liacutederes que simplesmente captura os dois candidatos da uacuteltima rodada (apecircndice G)A segunda simulaccedilatildeo roda como a primeira executando o meacutetodo irv_count_votesa cada rodada poreacutem com o meacutetodo irv_apply_tactical_votes (apecircndice P e Q)sendo executado antes Esse meacutetodo simula as estrateacutegias compromising e burying onde

                                                                                                                            63

                                                                                                                            cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                                                                                                                            55 CLASSE APPROVALVOTING

                                                                                                                            Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                                                                                                                            56 CLASSE BORDACOUNT

                                                                                                                            Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                                                                                                                            57 CLASSE SCOREVOTING

                                                                                                                            De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                                                                                                                            64

                                                                                                                            58 CLASSE BLOCVOTE

                                                                                                                            O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                                                                                                                            59 TECNOLOGIAS UTILIZADAS

                                                                                                                            A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                                                                                                                            Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                                                                                                                            O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                                                                                                                            Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                                                                                                                            65

                                                                                                                            6 CONCLUSAtildeO

                                                                                                                            Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                                                                                                                            Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                                                                                                                            Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                                                                                                                            Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                                                                                                                            Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                                                                                                                            66

                                                                                                                            REFEREcircNCIAS

                                                                                                                            AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                                                                                                                            Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                                                                                                                            Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                                                                                                                            Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                                                                                                                            HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                                                                                                                            LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                                                                                                                            ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                                                                                                                            Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                                                                                                                            POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                                                                                                                            The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                                                                                                                            67

                                                                                                                            APEcircNDICES

                                                                                                                            APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                                                                                                            Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                                                                                                            if(not len(selfvoter_profiles))

                                                                                                                            for voter in range(selfN_VOTERS)

                                                                                                                            candidates_rank = dict()

                                                                                                                            for candidate in reversed(range(selfN_CANDIDATES))

                                                                                                                            if(selfBIAS_VECTOR[candidate]==4)

                                                                                                                            candidates_rank[candidate] = self_sortear(selfloved)

                                                                                                                            elif(selfBIAS_VECTOR[candidate]==3)

                                                                                                                            candidates_rank[candidate] = self_sortear(selfliked)

                                                                                                                            elif(selfBIAS_VECTOR[candidate]==2)

                                                                                                                            candidates_rank[candidate] = self_sortear(selfdisliked)

                                                                                                                            elif(selfBIAS_VECTOR[candidate]==1)

                                                                                                                            candidates_rank[candidate] = self_sortear(selfhated)

                                                                                                                            elif(selfBIAS_VECTOR[candidate]==-1)

                                                                                                                            candidates_rank[candidate] = self_sortear(selfpolarizer

                                                                                                                            )

                                                                                                                            elif(selfBIAS_VECTOR[candidate]==-2)

                                                                                                                            candidates_rank[candidate] = self_sortear(self

                                                                                                                            more_polarizer)

                                                                                                                            else

                                                                                                                            candidates_rank[candidate] = self_sortear(selfneutral)

                                                                                                                            selfvotersappend(candidates_rank)

                                                                                                                            else

                                                                                                                            ranges = []

                                                                                                                            ranks = []

                                                                                                                            for prof in selfvoter_profiles

                                                                                                                            rangesappend(int(prof[pop_percentage]))

                                                                                                                            rank =

                                                                                                                            for index score in enumerate(prof[scores])

                                                                                                                            rank[index] = score

                                                                                                                            ranksappend(rank)

                                                                                                                            for index _range in enumerate(ranges)

                                                                                                                            for _ in range(int(selfN_VOTERS(_range100)))

                                                                                                                            selfvotersappend(ranks[index])

                                                                                                                            68

                                                                                                                            APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                                                                                                            Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                                                                                                            for i in range(selfN_CANDIDATES)

                                                                                                                            selfcandidates[i] = 0

                                                                                                                            selfvotes[i] = set()

                                                                                                                            APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                                                                                                            Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                                                                                                            for candidate in range(selfN_CANDIDATES)

                                                                                                                            rating_sum = 0

                                                                                                                            for voter in selfvoters

                                                                                                                            rating_sum += voter[candidate]

                                                                                                                            selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                                                                                                            APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                                                                                                            Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                                                                                                            if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                                                                                                            return selfcalculate_mean(winners)

                                                                                                                            else

                                                                                                                            chose_best = True if winners[0] == selfbest_candidate else

                                                                                                                            False

                                                                                                                            return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                                                                                                            69

                                                                                                                            APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                                                                                                            Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                                                                                                            rating_sum = 0

                                                                                                                            for voter in selfvoters

                                                                                                                            for candidate in winners

                                                                                                                            rating_sum += voter[candidate]

                                                                                                                            return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                                                                                                            APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                                                                                                            Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                                                                                                            for i in range(1 selfN_VACANCIES + 2)

                                                                                                                            selfleading_candidatesappend(selfsorted_candidates[-i][self

                                                                                                                            CANDIDATE_INDEX])

                                                                                                                            APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                                                                                                            Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                                                                                                            for leader in selfelecrounds[-1]

                                                                                                                            selfleading_candidatesappend(leader[0])

                                                                                                                            70

                                                                                                                            APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                                                                                                            Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                                                                                                            self_account_for_coalitions()

                                                                                                                            for voter in selfvoters

                                                                                                                            selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                                                                                                            (1)))

                                                                                                                            temp = []

                                                                                                                            for voter in selfsorted_voters

                                                                                                                            new_dict = defaultdict(list)

                                                                                                                            for k in voter

                                                                                                                            new_dict[k[1]]append(k[0])

                                                                                                                            tempappend(new_dict)

                                                                                                                            selfsorted_voters = []

                                                                                                                            for voter_index current_voter in enumerate(temp)

                                                                                                                            new_voter = []

                                                                                                                            for rating candidate_indexes in current_voteritems()

                                                                                                                            if len(current_voter[rating]) gt 1

                                                                                                                            shuffle(current_voter[rating])

                                                                                                                            for e in candidate_indexes

                                                                                                                            new_voterappend((e rating))

                                                                                                                            else

                                                                                                                            new_voterappend((candidate_indexes[0] rating))

                                                                                                                            selfsorted_votersappend(new_voter)

                                                                                                                            selfcandidates[new_voter[-1][0]] += 1

                                                                                                                            selfvotes[new_voter[-1][0]]add(voter_index)

                                                                                                                            71

                                                                                                                            APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                                                                                                            Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                                                                                                            for candidate in selfvotes_copy

                                                                                                                            if candidate not in selfelecleading_candidates

                                                                                                                            for voter_index in selfvotes_copy[candidate]

                                                                                                                            for index _candidate in enumerate(reversed(selfelec

                                                                                                                            sorted_voters[voter_index]))

                                                                                                                            if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                                                                                                            leading_candidates

                                                                                                                            if randomrandom() lt selfelec

                                                                                                                            tactical_vote_percentages[_candidate[selfelec

                                                                                                                            CANDIDATE_INDEX]]

                                                                                                                            selfrankings_changed[voter_index] = copy

                                                                                                                            deepcopy(selfelecsorted_voters[voter_index])

                                                                                                                            selfrankings_changed[voter_index][-(index + 1)]

                                                                                                                            selfrankings_changed[voter_index][-1] = self

                                                                                                                            rankings_changed[voter_index][-1] self

                                                                                                                            rankings_changed[voter_index][-(index + 1)]

                                                                                                                            selfcandidates[candidate] -= 1

                                                                                                                            selfcandidates[_candidate[selfelec

                                                                                                                            CANDIDATE_INDEX]] += 1

                                                                                                                            selfvotes[candidate]remove(voter_index)

                                                                                                                            selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                                                                                                            ]]add(voter_index)

                                                                                                                            break

                                                                                                                            break

                                                                                                                            72

                                                                                                                            APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                                                                                                            Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                                                                                                            half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                                                                                                            for candidate in selfelecleading_candidates

                                                                                                                            if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                                                                                                            continue

                                                                                                                            for voter_index in selfvotes_copy[candidate]

                                                                                                                            if voter_index in selfrankings_changed

                                                                                                                            ranking = selfrankings_changed[voter_index]

                                                                                                                            else

                                                                                                                            ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                                                                                                            ])

                                                                                                                            for index _candidate in enumerate(reversed(ranking))

                                                                                                                            if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                            leading_candidates or (_candidate[selfelec

                                                                                                                            CANDIDATE_INDEX] in selfelecleading_candidates and

                                                                                                                            selfelecleading_candidatesindex(_candidate[selfelec

                                                                                                                            CANDIDATE_INDEX]) gt= half_vacancies)

                                                                                                                            if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                                                                                                            if randomrandom() lt selfelec

                                                                                                                            minority_vote_percentages[_candidate[selfelec

                                                                                                                            CANDIDATE_INDEX]]

                                                                                                                            selfcandidates[candidate] -= 1

                                                                                                                            selfcandidates[_candidate[selfelec

                                                                                                                            CANDIDATE_INDEX]] += 1

                                                                                                                            break

                                                                                                                            break

                                                                                                                            break

                                                                                                                            73

                                                                                                                            APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                                                                                                            Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                                                                                                            self_account_for_coalitions()

                                                                                                                            for candidate in selfvotes

                                                                                                                            if candidate = selfwinner and candidate = selfsecond_place

                                                                                                                            for voter_index in selfvotes[candidate]

                                                                                                                            if voter_index in selfrankings_changed

                                                                                                                            ranking = selfrankings_changed[voter_index]

                                                                                                                            else

                                                                                                                            ranking = copydeepcopy(selfelecsorted_voters[

                                                                                                                            voter_index])

                                                                                                                            for index2 candidate in enumerate(reversed(ranking))

                                                                                                                            if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                                                                                                            selfcandidates[selfwinner] += 1

                                                                                                                            selfvotes[selfwinner]add(voter_index)

                                                                                                                            break

                                                                                                                            elif candidate[selfelecCANDIDATE_INDEX] == self

                                                                                                                            second_place

                                                                                                                            selfcandidates[selfsecond_place] += 1

                                                                                                                            selfvotes[selfsecond_place]add(voter_index)

                                                                                                                            break

                                                                                                                            selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                                            winners = []

                                                                                                                            vacancies = selfelecN_VACANCIES

                                                                                                                            for candidate in reversed(selfsorted_candidates)

                                                                                                                            if vacancies == 0

                                                                                                                            break

                                                                                                                            winnersappend(candidate[0])

                                                                                                                            vacancies -= 1

                                                                                                                            mean chose_best = selfelecget_mean(winners = winners)

                                                                                                                            74

                                                                                                                            APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                                                                                                            Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                                                                                                            for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                            voter_dict = dict()

                                                                                                                            og_voter_dict = dict()

                                                                                                                            for tup in voter

                                                                                                                            voter_dict[tup[0]] = tup[1]

                                                                                                                            og_voter_dict[tup[0]] = tup[1]

                                                                                                                            for coalition in selfeleccoalitions

                                                                                                                            for candidate in coalition

                                                                                                                            add_to_score = 0

                                                                                                                            for candidate2 in coalition

                                                                                                                            if candidate == candidate2

                                                                                                                            continue

                                                                                                                            half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                                                                                                            if half lt 0

                                                                                                                            add_to_score += mathceil(half)

                                                                                                                            else

                                                                                                                            add_to_score += mathfloor(half)

                                                                                                                            if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                                                                                                            voter_dict[candidate[rsquovaluersquo]] = 10

                                                                                                                            elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                                                                                                            voter_dict[candidate[rsquovaluersquo]] = -10

                                                                                                                            else

                                                                                                                            voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                                                                                                            selfrankings_changed[voter_index] = []

                                                                                                                            for candidate in voter_dict

                                                                                                                            selfrankings_changed[voter_index]append((candidate voter_dict[

                                                                                                                            candidate]))

                                                                                                                            selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                                                                                                            voter_index] key=lambda x x[1])

                                                                                                                            75

                                                                                                                            APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                                                                                            Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                                                                                            selfelecroundsappend(selfsorted_candidates[_round])

                                                                                                                            if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                                            N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                                                                                            N_VACANCIES - 1)

                                                                                                                            return 2

                                                                                                                            elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                                            N_VOTERS gt 05)

                                                                                                                            return 1

                                                                                                                            else

                                                                                                                            selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                                                                                            CANDIDATE_INDEX])

                                                                                                                            for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                                                                                            elecCANDIDATE_INDEX]]

                                                                                                                            if voter_index in selfrankings_changed

                                                                                                                            for candidate in reversed(selfrankings_changed[voter_index

                                                                                                                            ])

                                                                                                                            if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                            excluded

                                                                                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                                            ]] += 1

                                                                                                                            selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                                            add(voter_index)

                                                                                                                            break

                                                                                                                            else

                                                                                                                            continue

                                                                                                                            else

                                                                                                                            for candidate in reversed(selfelecsorted_voters[

                                                                                                                            voter_index])

                                                                                                                            if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                            excluded

                                                                                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                                            ]] += 1

                                                                                                                            selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                                            add(voter_index)

                                                                                                                            break

                                                                                                                            else

                                                                                                                            continue

                                                                                                                            selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                                            return 0

                                                                                                                            76

                                                                                                                            APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                                                                                            Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                                                                                            for index in range(selfelecN_CANDIDATES)

                                                                                                                            selfcandidates[index] = 0

                                                                                                                            for voter in selfelecsorted_voters

                                                                                                                            for candidate in reversed(voter)

                                                                                                                            if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                            else

                                                                                                                            break

                                                                                                                            APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                                                                                            Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                                                                                            for index in range(selfelecN_CANDIDATES)

                                                                                                                            selfcandidates[index] = 0

                                                                                                                            for voter in selfelecsorted_voters

                                                                                                                            if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                                            elecCANDIDATE_INDEX]]

                                                                                                                            selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                                                                                            else

                                                                                                                            for candidate in reversed(voter)

                                                                                                                            if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                            else

                                                                                                                            break

                                                                                                                            77

                                                                                                                            APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                                                                                            Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                                                                                            pos = set()

                                                                                                                            for index perc in enumerate(selfelectactical_vote_percentages)

                                                                                                                            if perc gt 0

                                                                                                                            posadd(index)

                                                                                                                            for candidate in selfeleccandidates

                                                                                                                            if candidate not in selfleading_candidates

                                                                                                                            for voter_index in selfvotes[candidate]

                                                                                                                            raised = None

                                                                                                                            for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                                                                                            ])

                                                                                                                            if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                                                                                            leading_candidates

                                                                                                                            if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                                                                                            if randomrandom() lt selfelectactical_vote_percentages[

                                                                                                                            candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                                                                                            ranking = [None]selfelecN_CANDIDATES

                                                                                                                            ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                            selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                            CANDIDATE_INDEX]])

                                                                                                                            raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                            break

                                                                                                                            break

                                                                                                                            break

                                                                                                                            if raised = None

                                                                                                                            for _candidate in selfleading_candidates

                                                                                                                            if _candidate = ranking[-1][0]

                                                                                                                            ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                                            _candidate])

                                                                                                                            buried = _candidate

                                                                                                                            break

                                                                                                                            i = 1

                                                                                                                            for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                                            if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                                                                                            buried]

                                                                                                                            continue

                                                                                                                            else

                                                                                                                            ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                            selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                            CANDIDATE_INDEX]])

                                                                                                                            i += 1

                                                                                                                            selfrankings_changed[voter_index] = ranking

                                                                                                                            78

                                                                                                                            APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                                                                                            Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                                                                                            for voter_index in selfvotes[candidate]

                                                                                                                            if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                                                                                            ]

                                                                                                                            for _candidate in selfleading_candidates

                                                                                                                            if _candidate = candidate

                                                                                                                            ranking = [None]selfelecN_CANDIDATES

                                                                                                                            ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                                            _candidate])

                                                                                                                            buried = _candidate

                                                                                                                            break

                                                                                                                            i = 1

                                                                                                                            for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                                            if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                                                                                            continue

                                                                                                                            else

                                                                                                                            ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                            selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                            CANDIDATE_INDEX]])

                                                                                                                            i += 1

                                                                                                                            selfrankings_changed[voter_index] = ranking

                                                                                                                            79

                                                                                                                            APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                                                                                            Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                                                                                            for index in range(selfelecN_CANDIDATES)

                                                                                                                            selfcandidates[index] = 0

                                                                                                                            for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                            score = 0

                                                                                                                            if voter_index in selfrankings_changed

                                                                                                                            for candidate in selfrankings_changed[voter_index]

                                                                                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                                            score += 1

                                                                                                                            else

                                                                                                                            for candidate in voter

                                                                                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                                            score += 1

                                                                                                                            APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                                                                                            Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                                                                                            for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                            if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                                            elecCANDIDATE_INDEX]]

                                                                                                                            selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                                                                                            sorted_voters[voter_index])

                                                                                                                            for candidate_index candidate in enumerate(reversed(voter))

                                                                                                                            if candidate_index == 0

                                                                                                                            selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                                            voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                                                                                            else

                                                                                                                            selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                                            voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                                                                                            80

                                                                                                                            APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                                                                                            Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                                                                                            for index in range(selfelecN_CANDIDATES)

                                                                                                                            selfcandidates[index] = 0

                                                                                                                            for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                            if voter_index in selfrankings_changed

                                                                                                                            for candidate in selfrankings_changed[voter_index]

                                                                                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                                            selfelecCANDIDATE_RANK]

                                                                                                                            else

                                                                                                                            for candidate in voter

                                                                                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                                            selfelecCANDIDATE_RANK]

                                                                                                                            APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                                                                                            Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                                                                                            for index in range(selfelecN_CANDIDATES)

                                                                                                                            selfcandidates[index] = 0

                                                                                                                            for voter in selfelecsorted_voters

                                                                                                                            votes = selfelecN_VACANCIES

                                                                                                                            for candidate in reversed(voter)

                                                                                                                            if votes == 0

                                                                                                                            break

                                                                                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                            votes -= 1

                                                                                                                            • Folha de aprovaccedilatildeo
                                                                                                                            • Agradecimentos
                                                                                                                            • Epiacutegrafe
                                                                                                                            • Resumo
                                                                                                                            • Abstract
                                                                                                                            • Lista de ilustraccedilotildees
                                                                                                                            • Lista de Coacutedigos
                                                                                                                            • Lista de tabelas
                                                                                                                            • Lista de abreviaturas e siglas
                                                                                                                            • Sumaacuterio
                                                                                                                            • INTRODUCcedilAtildeO
                                                                                                                              • MOTIVACcedilAtildeO E OBJETIVO
                                                                                                                              • MEacuteTODO
                                                                                                                              • ESTRUTURA
                                                                                                                                • SISTEMAS ELEITORAIS
                                                                                                                                  • FISRT PAST THE POST
                                                                                                                                    • Exemplo
                                                                                                                                    • Vantagens e Desvantagens do FPTP
                                                                                                                                    • Voto Uacutetil no FPTP
                                                                                                                                      • TWO-ROUND SYSTEM
                                                                                                                                        • Exemplo
                                                                                                                                        • Vantagens e Desvantagens do TRS
                                                                                                                                        • Voto Uacutetil no TRS
                                                                                                                                          • INSTANT-RUNOFF VOTING
                                                                                                                                            • Exemplo
                                                                                                                                            • Vantagens e Desvantagens do IRV
                                                                                                                                            • Voto Uacutetil no IRV
                                                                                                                                              • APPROVAL VOTING SYSTEM
                                                                                                                                                • Exemplo
                                                                                                                                                • Vantagens e Desvantagens do AVS
                                                                                                                                                • Voto Uacutetil no AVS
                                                                                                                                                  • THE BORDA COUNT
                                                                                                                                                    • Exemplo
                                                                                                                                                    • Vantagens e Desvantagens do BC
                                                                                                                                                    • Voto Uacutetil no BC
                                                                                                                                                      • SCORE VOTING SYSTEM
                                                                                                                                                        • Exemplo
                                                                                                                                                        • Vantagens e Desvantagens do SVS
                                                                                                                                                        • Voto Uacutetil no SVS
                                                                                                                                                          • BLOC VOTE
                                                                                                                                                            • Exemplo
                                                                                                                                                            • Voto Uacutetil no BV
                                                                                                                                                                • O SIMULADOR
                                                                                                                                                                • CENAacuteRIOS PERTINENTES
                                                                                                                                                                  • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                                                                                  • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                                                                                  • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                                                                                  • CENAacuteRIO 4 COALIZOtildeES
                                                                                                                                                                  • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                                                                                  • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                                                                                    • COMO FUNCIONA O SIMULADOR
                                                                                                                                                                      • CLASSE Elections
                                                                                                                                                                      • CLASSE FirstPastThePost
                                                                                                                                                                      • CLASSE TwoRoundSystem
                                                                                                                                                                      • CLASSE InstantRunoffVoting
                                                                                                                                                                      • CLASSE ApprovalVoting
                                                                                                                                                                      • CLASSE BordaCount
                                                                                                                                                                      • CLASSE ScoreVoting
                                                                                                                                                                      • CLASSE BlocVote
                                                                                                                                                                      • TECNOLOGIAS UTILIZADAS
                                                                                                                                                                        • CONCLUSAtildeO
                                                                                                                                                                        • Referecircncias
                                                                                                                                                                        • Meacutetodo create_voters
                                                                                                                                                                        • Meacutetodo create_candidates
                                                                                                                                                                        • Meacutetodo calculate_means
                                                                                                                                                                        • Meacutetodo get_mean
                                                                                                                                                                        • Meacutetodo calculate_mean
                                                                                                                                                                        • Meacutetodo set_leading_candidates
                                                                                                                                                                        • Meacutetodo irv_set_leading_candidates
                                                                                                                                                                        • Meacutetodo sort_ranks
                                                                                                                                                                        • Meacutetodo fptp_count_tactical_votes
                                                                                                                                                                        • Meacutetodo fptp_count_minority_votes
                                                                                                                                                                        • Meacutetodo trs_second_round
                                                                                                                                                                        • Meacutetodo trs_account_for_coalitions
                                                                                                                                                                        • Meacutetodo irv_count_votes
                                                                                                                                                                        • Meacutetodo avs_count_votes
                                                                                                                                                                        • Meacutetodo avs_count_votes_with_tactical
                                                                                                                                                                        • Meacutetodo irv_apply_tactical_votes
                                                                                                                                                                        • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                                                                                        • Meacutetodo bc_sum_candidates_scores
                                                                                                                                                                        • Meacutetodo svs_apply_tactical_votes
                                                                                                                                                                        • Meacutetodo svs_sum_candidates_scores
                                                                                                                                                                        • Meacutetodo bv_count_votes

                                                                                                                              63

                                                                                                                              cada eleitor que opta pelo voto taacuteticoranqueia em primeiro lugar sua preferecircncia entreos candidatos liacutederes e em uacuteltimo lugar o liacuteder concorrente

                                                                                                                              55 CLASSE APPROVALVOTING

                                                                                                                              Essa classe possui um meacutetodo para a contagem de votos normal (apecircndice N) e umpara a contagem quando os votos taacuteticos satildeo habilitados no simulador (apecircndice O) Nacontagem normal se itera sobre todos os rankings contidos na estrutura sorted_votersjaacute mencionada anteriormente e para cada um deles todos os candidatos com notas acimade 0 recebem um voto ou seja satildeo aprovados O tipo de voto taacutetico presente nessesistema eacute o bullet voting ele eacute simulado da seguinte maneira com os votos taacuteticos habi-litados para uma porcentagem dos eleitores (fornecida pelo usuaacuterio) de cada candidatoapenas o voto em seu candidato preferido seraacute contabilizado natildeo importando se outroscandidatos tambeacutem possuam notas maiores que 0 Ou seja se o usuaacuterio definir 50 devoto taacutetico para certo candidato por volta de 50 dos eleitores que o tiverem comoprimeira opccedilatildeo apenas votam nele e em mais nenhum outro

                                                                                                                              56 CLASSE BORDACOUNT

                                                                                                                              Neste sistema de votaccedilatildeo os candidatos satildeo pontuados de acordo com suas po-siccedilotildees nos rankings dos eleitores O pior colocado recebe zero e a pontuaccedilatildeo au-menta de um em um ateacute o mais bem colocado Essa pontuaccedilatildeo eacute feita no meacutetodobc_sum_candidates_scores (apecircndice R) O voto taacutetico para essa classe eacute exa-tamente o mesmo utilizado no IRV sendo simuladas as estrateacutegias de compromising eburying (apecircndice P e Q) Como no IRV quando os votos taacuteticos estatildeo habilitadosduas simulaccedilotildees ocorrem com a primeira delas funcionando como uma pesquisa eleito-ral para os eleitores Essa classe tambeacutem possui um meacutetodo proacuteprio para a seleccedilatildeo doscandidatos liacutederes o qual eacute idecircntico ao meacutetodo na classe Elections poreacutem pode terresultados diferentes da simulaccedilatildeo no FPTP e por isso precisa executar separadamente

                                                                                                                              57 CLASSE SCOREVOTING

                                                                                                                              De maneira similar agrave classe ApprovalVoting nesta classe tambeacutem foi implemen-tada uma forma de bullet voting Isso eacute feito no meacutetodo svs_apply_tactical_votes(apecircndice S) Para uma porcentagem da populaccedilatildeo que opta pelo voto taacutetico seus ran-kings satildeo adulterados onde o candidato de sua preferecircncia receberaacute a nota maacutexima(+10)e todos os outros a nota miacutenima(-10) Logo eacute como se eles estivessem restringindo seuvoto a apenas um candidato apesar da liberdade presente neste sistema A contagemfinal dos pontos eacute feita no meacutetodo svs_sum_candidates_scores (apecircndice T) e eacutemeramente o somatoacuterio dos pontos atribuiacutedos a cada candidato

                                                                                                                              64

                                                                                                                              58 CLASSE BLOCVOTE

                                                                                                                              O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                                                                                                                              59 TECNOLOGIAS UTILIZADAS

                                                                                                                              A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                                                                                                                              Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                                                                                                                              O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                                                                                                                              Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                                                                                                                              65

                                                                                                                              6 CONCLUSAtildeO

                                                                                                                              Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                                                                                                                              Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                                                                                                                              Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                                                                                                                              Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                                                                                                                              Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                                                                                                                              66

                                                                                                                              REFEREcircNCIAS

                                                                                                                              AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                                                                                                                              Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                                                                                                                              Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                                                                                                                              Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                                                                                                                              HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                                                                                                                              LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                                                                                                                              ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                                                                                                                              Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                                                                                                                              POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                                                                                                                              The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                                                                                                                              67

                                                                                                                              APEcircNDICES

                                                                                                                              APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                                                                                                              Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                                                                                                              if(not len(selfvoter_profiles))

                                                                                                                              for voter in range(selfN_VOTERS)

                                                                                                                              candidates_rank = dict()

                                                                                                                              for candidate in reversed(range(selfN_CANDIDATES))

                                                                                                                              if(selfBIAS_VECTOR[candidate]==4)

                                                                                                                              candidates_rank[candidate] = self_sortear(selfloved)

                                                                                                                              elif(selfBIAS_VECTOR[candidate]==3)

                                                                                                                              candidates_rank[candidate] = self_sortear(selfliked)

                                                                                                                              elif(selfBIAS_VECTOR[candidate]==2)

                                                                                                                              candidates_rank[candidate] = self_sortear(selfdisliked)

                                                                                                                              elif(selfBIAS_VECTOR[candidate]==1)

                                                                                                                              candidates_rank[candidate] = self_sortear(selfhated)

                                                                                                                              elif(selfBIAS_VECTOR[candidate]==-1)

                                                                                                                              candidates_rank[candidate] = self_sortear(selfpolarizer

                                                                                                                              )

                                                                                                                              elif(selfBIAS_VECTOR[candidate]==-2)

                                                                                                                              candidates_rank[candidate] = self_sortear(self

                                                                                                                              more_polarizer)

                                                                                                                              else

                                                                                                                              candidates_rank[candidate] = self_sortear(selfneutral)

                                                                                                                              selfvotersappend(candidates_rank)

                                                                                                                              else

                                                                                                                              ranges = []

                                                                                                                              ranks = []

                                                                                                                              for prof in selfvoter_profiles

                                                                                                                              rangesappend(int(prof[pop_percentage]))

                                                                                                                              rank =

                                                                                                                              for index score in enumerate(prof[scores])

                                                                                                                              rank[index] = score

                                                                                                                              ranksappend(rank)

                                                                                                                              for index _range in enumerate(ranges)

                                                                                                                              for _ in range(int(selfN_VOTERS(_range100)))

                                                                                                                              selfvotersappend(ranks[index])

                                                                                                                              68

                                                                                                                              APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                                                                                                              Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                                                                                                              for i in range(selfN_CANDIDATES)

                                                                                                                              selfcandidates[i] = 0

                                                                                                                              selfvotes[i] = set()

                                                                                                                              APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                                                                                                              Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                                                                                                              for candidate in range(selfN_CANDIDATES)

                                                                                                                              rating_sum = 0

                                                                                                                              for voter in selfvoters

                                                                                                                              rating_sum += voter[candidate]

                                                                                                                              selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                                                                                                              APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                                                                                                              Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                                                                                                              if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                                                                                                              return selfcalculate_mean(winners)

                                                                                                                              else

                                                                                                                              chose_best = True if winners[0] == selfbest_candidate else

                                                                                                                              False

                                                                                                                              return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                                                                                                              69

                                                                                                                              APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                                                                                                              Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                                                                                                              rating_sum = 0

                                                                                                                              for voter in selfvoters

                                                                                                                              for candidate in winners

                                                                                                                              rating_sum += voter[candidate]

                                                                                                                              return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                                                                                                              APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                                                                                                              Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                                                                                                              for i in range(1 selfN_VACANCIES + 2)

                                                                                                                              selfleading_candidatesappend(selfsorted_candidates[-i][self

                                                                                                                              CANDIDATE_INDEX])

                                                                                                                              APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                                                                                                              Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                                                                                                              for leader in selfelecrounds[-1]

                                                                                                                              selfleading_candidatesappend(leader[0])

                                                                                                                              70

                                                                                                                              APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                                                                                                              Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                                                                                                              self_account_for_coalitions()

                                                                                                                              for voter in selfvoters

                                                                                                                              selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                                                                                                              (1)))

                                                                                                                              temp = []

                                                                                                                              for voter in selfsorted_voters

                                                                                                                              new_dict = defaultdict(list)

                                                                                                                              for k in voter

                                                                                                                              new_dict[k[1]]append(k[0])

                                                                                                                              tempappend(new_dict)

                                                                                                                              selfsorted_voters = []

                                                                                                                              for voter_index current_voter in enumerate(temp)

                                                                                                                              new_voter = []

                                                                                                                              for rating candidate_indexes in current_voteritems()

                                                                                                                              if len(current_voter[rating]) gt 1

                                                                                                                              shuffle(current_voter[rating])

                                                                                                                              for e in candidate_indexes

                                                                                                                              new_voterappend((e rating))

                                                                                                                              else

                                                                                                                              new_voterappend((candidate_indexes[0] rating))

                                                                                                                              selfsorted_votersappend(new_voter)

                                                                                                                              selfcandidates[new_voter[-1][0]] += 1

                                                                                                                              selfvotes[new_voter[-1][0]]add(voter_index)

                                                                                                                              71

                                                                                                                              APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                                                                                                              Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                                                                                                              for candidate in selfvotes_copy

                                                                                                                              if candidate not in selfelecleading_candidates

                                                                                                                              for voter_index in selfvotes_copy[candidate]

                                                                                                                              for index _candidate in enumerate(reversed(selfelec

                                                                                                                              sorted_voters[voter_index]))

                                                                                                                              if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                                                                                                              leading_candidates

                                                                                                                              if randomrandom() lt selfelec

                                                                                                                              tactical_vote_percentages[_candidate[selfelec

                                                                                                                              CANDIDATE_INDEX]]

                                                                                                                              selfrankings_changed[voter_index] = copy

                                                                                                                              deepcopy(selfelecsorted_voters[voter_index])

                                                                                                                              selfrankings_changed[voter_index][-(index + 1)]

                                                                                                                              selfrankings_changed[voter_index][-1] = self

                                                                                                                              rankings_changed[voter_index][-1] self

                                                                                                                              rankings_changed[voter_index][-(index + 1)]

                                                                                                                              selfcandidates[candidate] -= 1

                                                                                                                              selfcandidates[_candidate[selfelec

                                                                                                                              CANDIDATE_INDEX]] += 1

                                                                                                                              selfvotes[candidate]remove(voter_index)

                                                                                                                              selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                                                                                                              ]]add(voter_index)

                                                                                                                              break

                                                                                                                              break

                                                                                                                              72

                                                                                                                              APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                                                                                                              Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                                                                                                              half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                                                                                                              for candidate in selfelecleading_candidates

                                                                                                                              if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                                                                                                              continue

                                                                                                                              for voter_index in selfvotes_copy[candidate]

                                                                                                                              if voter_index in selfrankings_changed

                                                                                                                              ranking = selfrankings_changed[voter_index]

                                                                                                                              else

                                                                                                                              ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                                                                                                              ])

                                                                                                                              for index _candidate in enumerate(reversed(ranking))

                                                                                                                              if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                              leading_candidates or (_candidate[selfelec

                                                                                                                              CANDIDATE_INDEX] in selfelecleading_candidates and

                                                                                                                              selfelecleading_candidatesindex(_candidate[selfelec

                                                                                                                              CANDIDATE_INDEX]) gt= half_vacancies)

                                                                                                                              if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                                                                                                              if randomrandom() lt selfelec

                                                                                                                              minority_vote_percentages[_candidate[selfelec

                                                                                                                              CANDIDATE_INDEX]]

                                                                                                                              selfcandidates[candidate] -= 1

                                                                                                                              selfcandidates[_candidate[selfelec

                                                                                                                              CANDIDATE_INDEX]] += 1

                                                                                                                              break

                                                                                                                              break

                                                                                                                              break

                                                                                                                              73

                                                                                                                              APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                                                                                                              Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                                                                                                              self_account_for_coalitions()

                                                                                                                              for candidate in selfvotes

                                                                                                                              if candidate = selfwinner and candidate = selfsecond_place

                                                                                                                              for voter_index in selfvotes[candidate]

                                                                                                                              if voter_index in selfrankings_changed

                                                                                                                              ranking = selfrankings_changed[voter_index]

                                                                                                                              else

                                                                                                                              ranking = copydeepcopy(selfelecsorted_voters[

                                                                                                                              voter_index])

                                                                                                                              for index2 candidate in enumerate(reversed(ranking))

                                                                                                                              if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                                                                                                              selfcandidates[selfwinner] += 1

                                                                                                                              selfvotes[selfwinner]add(voter_index)

                                                                                                                              break

                                                                                                                              elif candidate[selfelecCANDIDATE_INDEX] == self

                                                                                                                              second_place

                                                                                                                              selfcandidates[selfsecond_place] += 1

                                                                                                                              selfvotes[selfsecond_place]add(voter_index)

                                                                                                                              break

                                                                                                                              selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                                              winners = []

                                                                                                                              vacancies = selfelecN_VACANCIES

                                                                                                                              for candidate in reversed(selfsorted_candidates)

                                                                                                                              if vacancies == 0

                                                                                                                              break

                                                                                                                              winnersappend(candidate[0])

                                                                                                                              vacancies -= 1

                                                                                                                              mean chose_best = selfelecget_mean(winners = winners)

                                                                                                                              74

                                                                                                                              APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                                                                                                              Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                                                                                                              for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                              voter_dict = dict()

                                                                                                                              og_voter_dict = dict()

                                                                                                                              for tup in voter

                                                                                                                              voter_dict[tup[0]] = tup[1]

                                                                                                                              og_voter_dict[tup[0]] = tup[1]

                                                                                                                              for coalition in selfeleccoalitions

                                                                                                                              for candidate in coalition

                                                                                                                              add_to_score = 0

                                                                                                                              for candidate2 in coalition

                                                                                                                              if candidate == candidate2

                                                                                                                              continue

                                                                                                                              half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                                                                                                              if half lt 0

                                                                                                                              add_to_score += mathceil(half)

                                                                                                                              else

                                                                                                                              add_to_score += mathfloor(half)

                                                                                                                              if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                                                                                                              voter_dict[candidate[rsquovaluersquo]] = 10

                                                                                                                              elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                                                                                                              voter_dict[candidate[rsquovaluersquo]] = -10

                                                                                                                              else

                                                                                                                              voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                                                                                                              selfrankings_changed[voter_index] = []

                                                                                                                              for candidate in voter_dict

                                                                                                                              selfrankings_changed[voter_index]append((candidate voter_dict[

                                                                                                                              candidate]))

                                                                                                                              selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                                                                                                              voter_index] key=lambda x x[1])

                                                                                                                              75

                                                                                                                              APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                                                                                              Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                                                                                              selfelecroundsappend(selfsorted_candidates[_round])

                                                                                                                              if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                                              N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                                                                                              N_VACANCIES - 1)

                                                                                                                              return 2

                                                                                                                              elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                                              N_VOTERS gt 05)

                                                                                                                              return 1

                                                                                                                              else

                                                                                                                              selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                                                                                              CANDIDATE_INDEX])

                                                                                                                              for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                                                                                              elecCANDIDATE_INDEX]]

                                                                                                                              if voter_index in selfrankings_changed

                                                                                                                              for candidate in reversed(selfrankings_changed[voter_index

                                                                                                                              ])

                                                                                                                              if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                              excluded

                                                                                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                                              ]] += 1

                                                                                                                              selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                                              add(voter_index)

                                                                                                                              break

                                                                                                                              else

                                                                                                                              continue

                                                                                                                              else

                                                                                                                              for candidate in reversed(selfelecsorted_voters[

                                                                                                                              voter_index])

                                                                                                                              if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                              excluded

                                                                                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                                              ]] += 1

                                                                                                                              selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                                              add(voter_index)

                                                                                                                              break

                                                                                                                              else

                                                                                                                              continue

                                                                                                                              selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                                              return 0

                                                                                                                              76

                                                                                                                              APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                                                                                              Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                                                                                              for index in range(selfelecN_CANDIDATES)

                                                                                                                              selfcandidates[index] = 0

                                                                                                                              for voter in selfelecsorted_voters

                                                                                                                              for candidate in reversed(voter)

                                                                                                                              if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                              else

                                                                                                                              break

                                                                                                                              APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                                                                                              Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                                                                                              for index in range(selfelecN_CANDIDATES)

                                                                                                                              selfcandidates[index] = 0

                                                                                                                              for voter in selfelecsorted_voters

                                                                                                                              if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                                              elecCANDIDATE_INDEX]]

                                                                                                                              selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                                                                                              else

                                                                                                                              for candidate in reversed(voter)

                                                                                                                              if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                              else

                                                                                                                              break

                                                                                                                              77

                                                                                                                              APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                                                                                              Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                                                                                              pos = set()

                                                                                                                              for index perc in enumerate(selfelectactical_vote_percentages)

                                                                                                                              if perc gt 0

                                                                                                                              posadd(index)

                                                                                                                              for candidate in selfeleccandidates

                                                                                                                              if candidate not in selfleading_candidates

                                                                                                                              for voter_index in selfvotes[candidate]

                                                                                                                              raised = None

                                                                                                                              for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                                                                                              ])

                                                                                                                              if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                                                                                              leading_candidates

                                                                                                                              if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                                                                                              if randomrandom() lt selfelectactical_vote_percentages[

                                                                                                                              candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                                                                                              ranking = [None]selfelecN_CANDIDATES

                                                                                                                              ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                              selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                              CANDIDATE_INDEX]])

                                                                                                                              raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                              break

                                                                                                                              break

                                                                                                                              break

                                                                                                                              if raised = None

                                                                                                                              for _candidate in selfleading_candidates

                                                                                                                              if _candidate = ranking[-1][0]

                                                                                                                              ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                                              _candidate])

                                                                                                                              buried = _candidate

                                                                                                                              break

                                                                                                                              i = 1

                                                                                                                              for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                                              if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                                                                                              buried]

                                                                                                                              continue

                                                                                                                              else

                                                                                                                              ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                              selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                              CANDIDATE_INDEX]])

                                                                                                                              i += 1

                                                                                                                              selfrankings_changed[voter_index] = ranking

                                                                                                                              78

                                                                                                                              APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                                                                                              Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                                                                                              for voter_index in selfvotes[candidate]

                                                                                                                              if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                                                                                              ]

                                                                                                                              for _candidate in selfleading_candidates

                                                                                                                              if _candidate = candidate

                                                                                                                              ranking = [None]selfelecN_CANDIDATES

                                                                                                                              ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                                              _candidate])

                                                                                                                              buried = _candidate

                                                                                                                              break

                                                                                                                              i = 1

                                                                                                                              for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                                              if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                                                                                              continue

                                                                                                                              else

                                                                                                                              ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                              selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                              CANDIDATE_INDEX]])

                                                                                                                              i += 1

                                                                                                                              selfrankings_changed[voter_index] = ranking

                                                                                                                              79

                                                                                                                              APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                                                                                              Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                                                                                              for index in range(selfelecN_CANDIDATES)

                                                                                                                              selfcandidates[index] = 0

                                                                                                                              for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                              score = 0

                                                                                                                              if voter_index in selfrankings_changed

                                                                                                                              for candidate in selfrankings_changed[voter_index]

                                                                                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                                              score += 1

                                                                                                                              else

                                                                                                                              for candidate in voter

                                                                                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                                              score += 1

                                                                                                                              APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                                                                                              Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                                                                                              for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                              if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                                              elecCANDIDATE_INDEX]]

                                                                                                                              selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                                                                                              sorted_voters[voter_index])

                                                                                                                              for candidate_index candidate in enumerate(reversed(voter))

                                                                                                                              if candidate_index == 0

                                                                                                                              selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                                              voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                                                                                              else

                                                                                                                              selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                                              voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                                                                                              80

                                                                                                                              APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                                                                                              Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                                                                                              for index in range(selfelecN_CANDIDATES)

                                                                                                                              selfcandidates[index] = 0

                                                                                                                              for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                              if voter_index in selfrankings_changed

                                                                                                                              for candidate in selfrankings_changed[voter_index]

                                                                                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                                              selfelecCANDIDATE_RANK]

                                                                                                                              else

                                                                                                                              for candidate in voter

                                                                                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                                              selfelecCANDIDATE_RANK]

                                                                                                                              APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                                                                                              Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                                                                                              for index in range(selfelecN_CANDIDATES)

                                                                                                                              selfcandidates[index] = 0

                                                                                                                              for voter in selfelecsorted_voters

                                                                                                                              votes = selfelecN_VACANCIES

                                                                                                                              for candidate in reversed(voter)

                                                                                                                              if votes == 0

                                                                                                                              break

                                                                                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                              votes -= 1

                                                                                                                              • Folha de aprovaccedilatildeo
                                                                                                                              • Agradecimentos
                                                                                                                              • Epiacutegrafe
                                                                                                                              • Resumo
                                                                                                                              • Abstract
                                                                                                                              • Lista de ilustraccedilotildees
                                                                                                                              • Lista de Coacutedigos
                                                                                                                              • Lista de tabelas
                                                                                                                              • Lista de abreviaturas e siglas
                                                                                                                              • Sumaacuterio
                                                                                                                              • INTRODUCcedilAtildeO
                                                                                                                                • MOTIVACcedilAtildeO E OBJETIVO
                                                                                                                                • MEacuteTODO
                                                                                                                                • ESTRUTURA
                                                                                                                                  • SISTEMAS ELEITORAIS
                                                                                                                                    • FISRT PAST THE POST
                                                                                                                                      • Exemplo
                                                                                                                                      • Vantagens e Desvantagens do FPTP
                                                                                                                                      • Voto Uacutetil no FPTP
                                                                                                                                        • TWO-ROUND SYSTEM
                                                                                                                                          • Exemplo
                                                                                                                                          • Vantagens e Desvantagens do TRS
                                                                                                                                          • Voto Uacutetil no TRS
                                                                                                                                            • INSTANT-RUNOFF VOTING
                                                                                                                                              • Exemplo
                                                                                                                                              • Vantagens e Desvantagens do IRV
                                                                                                                                              • Voto Uacutetil no IRV
                                                                                                                                                • APPROVAL VOTING SYSTEM
                                                                                                                                                  • Exemplo
                                                                                                                                                  • Vantagens e Desvantagens do AVS
                                                                                                                                                  • Voto Uacutetil no AVS
                                                                                                                                                    • THE BORDA COUNT
                                                                                                                                                      • Exemplo
                                                                                                                                                      • Vantagens e Desvantagens do BC
                                                                                                                                                      • Voto Uacutetil no BC
                                                                                                                                                        • SCORE VOTING SYSTEM
                                                                                                                                                          • Exemplo
                                                                                                                                                          • Vantagens e Desvantagens do SVS
                                                                                                                                                          • Voto Uacutetil no SVS
                                                                                                                                                            • BLOC VOTE
                                                                                                                                                              • Exemplo
                                                                                                                                                              • Voto Uacutetil no BV
                                                                                                                                                                  • O SIMULADOR
                                                                                                                                                                  • CENAacuteRIOS PERTINENTES
                                                                                                                                                                    • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                                                                                    • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                                                                                    • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                                                                                    • CENAacuteRIO 4 COALIZOtildeES
                                                                                                                                                                    • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                                                                                    • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                                                                                      • COMO FUNCIONA O SIMULADOR
                                                                                                                                                                        • CLASSE Elections
                                                                                                                                                                        • CLASSE FirstPastThePost
                                                                                                                                                                        • CLASSE TwoRoundSystem
                                                                                                                                                                        • CLASSE InstantRunoffVoting
                                                                                                                                                                        • CLASSE ApprovalVoting
                                                                                                                                                                        • CLASSE BordaCount
                                                                                                                                                                        • CLASSE ScoreVoting
                                                                                                                                                                        • CLASSE BlocVote
                                                                                                                                                                        • TECNOLOGIAS UTILIZADAS
                                                                                                                                                                          • CONCLUSAtildeO
                                                                                                                                                                          • Referecircncias
                                                                                                                                                                          • Meacutetodo create_voters
                                                                                                                                                                          • Meacutetodo create_candidates
                                                                                                                                                                          • Meacutetodo calculate_means
                                                                                                                                                                          • Meacutetodo get_mean
                                                                                                                                                                          • Meacutetodo calculate_mean
                                                                                                                                                                          • Meacutetodo set_leading_candidates
                                                                                                                                                                          • Meacutetodo irv_set_leading_candidates
                                                                                                                                                                          • Meacutetodo sort_ranks
                                                                                                                                                                          • Meacutetodo fptp_count_tactical_votes
                                                                                                                                                                          • Meacutetodo fptp_count_minority_votes
                                                                                                                                                                          • Meacutetodo trs_second_round
                                                                                                                                                                          • Meacutetodo trs_account_for_coalitions
                                                                                                                                                                          • Meacutetodo irv_count_votes
                                                                                                                                                                          • Meacutetodo avs_count_votes
                                                                                                                                                                          • Meacutetodo avs_count_votes_with_tactical
                                                                                                                                                                          • Meacutetodo irv_apply_tactical_votes
                                                                                                                                                                          • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                                                                                          • Meacutetodo bc_sum_candidates_scores
                                                                                                                                                                          • Meacutetodo svs_apply_tactical_votes
                                                                                                                                                                          • Meacutetodo svs_sum_candidates_scores
                                                                                                                                                                          • Meacutetodo bv_count_votes

                                                                                                                                64

                                                                                                                                58 CLASSE BLOCVOTE

                                                                                                                                O sistema Bloc Vote elimina o voto de minoria encontrado no sistema FPTP eportanto sua classe correspondente apenas possui um meacutetodo para contagem dos vo-tos e natildeo lida com nenhum tipo de voto taacutetico A contagem eacute feita com o meacutetodobv_count_votes (apecircndice U) nele todos os n candidatos mais bem colocados noranking de um eleitor recebem um voto onde n eacute igual ao nuacutemero de vagas da eleiccedilatildeo

                                                                                                                                59 TECNOLOGIAS UTILIZADAS

                                                                                                                                A implementaccedilatildeo foi feita com uma combinaccedilatildeo dos frameworks Django para a lin-guagem Python utilizado no backend da aplicaccedilatildeo e React para Javascript no frontendO React eacute uma biblioteca para o desenvolvimento de interfaces de usuaacuterio Sua vanta-gem eacute a possibilidade de criaccedilatildeo de componentes ou classes em javascript que podemser multiplicados e reutilizados na estruturaccedilatildeo da aplicaccedilatildeo Django segue o modelo dearquitetura MTV que separa a aplicaccedilatildeo em trecircs camadas Models Templates e Viewsque eacute uma interpretaccedilatildeo proacutepria do modelo MVC A integraccedilatildeo desses dois frameworks eacutepossiacutevel com o module bundler Webpack que por sua vez gera um arquivo estaacutetico que eacuteinterpretado pelo Django a partir dos componentes do React

                                                                                                                                Em relaccedilatildeo agrave parte esteacutetica do site foi incorporado o tema Lux do Bootstrap e osgraacuteficos apresentados na sessatildeo de resultados satildeo fornecidos pela biblioteca Apex Charts

                                                                                                                                O gerenciamento de estados no frontend da aplicaccedilatildeo eacute feito com o uso de uma biblio-teca chamada Redux a criaccedilatildeo de testes unitaacuterios com a biblioteca Nose o versionamentodo projeto foi feito com o auxiacutelio do Github e por fim a aplicaccedilatildeo estaacute sendo hospedadano site pythonanywhere

                                                                                                                                Todo o coacutedigo se encontra no link lthttpsgithubcomgsbevilaquaelectionsgt

                                                                                                                                65

                                                                                                                                6 CONCLUSAtildeO

                                                                                                                                Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                                                                                                                                Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                                                                                                                                Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                                                                                                                                Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                                                                                                                                Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                                                                                                                                66

                                                                                                                                REFEREcircNCIAS

                                                                                                                                AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                                                                                                                                Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                                                                                                                                Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                                                                                                                                Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                                                                                                                                HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                                                                                                                                LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                                                                                                                                ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                                                                                                                                Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                                                                                                                                POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                                                                                                                                The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                                                                                                                                67

                                                                                                                                APEcircNDICES

                                                                                                                                APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                                                                                                                Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                                                                                                                if(not len(selfvoter_profiles))

                                                                                                                                for voter in range(selfN_VOTERS)

                                                                                                                                candidates_rank = dict()

                                                                                                                                for candidate in reversed(range(selfN_CANDIDATES))

                                                                                                                                if(selfBIAS_VECTOR[candidate]==4)

                                                                                                                                candidates_rank[candidate] = self_sortear(selfloved)

                                                                                                                                elif(selfBIAS_VECTOR[candidate]==3)

                                                                                                                                candidates_rank[candidate] = self_sortear(selfliked)

                                                                                                                                elif(selfBIAS_VECTOR[candidate]==2)

                                                                                                                                candidates_rank[candidate] = self_sortear(selfdisliked)

                                                                                                                                elif(selfBIAS_VECTOR[candidate]==1)

                                                                                                                                candidates_rank[candidate] = self_sortear(selfhated)

                                                                                                                                elif(selfBIAS_VECTOR[candidate]==-1)

                                                                                                                                candidates_rank[candidate] = self_sortear(selfpolarizer

                                                                                                                                )

                                                                                                                                elif(selfBIAS_VECTOR[candidate]==-2)

                                                                                                                                candidates_rank[candidate] = self_sortear(self

                                                                                                                                more_polarizer)

                                                                                                                                else

                                                                                                                                candidates_rank[candidate] = self_sortear(selfneutral)

                                                                                                                                selfvotersappend(candidates_rank)

                                                                                                                                else

                                                                                                                                ranges = []

                                                                                                                                ranks = []

                                                                                                                                for prof in selfvoter_profiles

                                                                                                                                rangesappend(int(prof[pop_percentage]))

                                                                                                                                rank =

                                                                                                                                for index score in enumerate(prof[scores])

                                                                                                                                rank[index] = score

                                                                                                                                ranksappend(rank)

                                                                                                                                for index _range in enumerate(ranges)

                                                                                                                                for _ in range(int(selfN_VOTERS(_range100)))

                                                                                                                                selfvotersappend(ranks[index])

                                                                                                                                68

                                                                                                                                APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                                                                                                                Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                                                                                                                for i in range(selfN_CANDIDATES)

                                                                                                                                selfcandidates[i] = 0

                                                                                                                                selfvotes[i] = set()

                                                                                                                                APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                                                                                                                Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                                                                                                                for candidate in range(selfN_CANDIDATES)

                                                                                                                                rating_sum = 0

                                                                                                                                for voter in selfvoters

                                                                                                                                rating_sum += voter[candidate]

                                                                                                                                selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                                                                                                                APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                                                                                                                Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                                                                                                                if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                                                                                                                return selfcalculate_mean(winners)

                                                                                                                                else

                                                                                                                                chose_best = True if winners[0] == selfbest_candidate else

                                                                                                                                False

                                                                                                                                return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                                                                                                                69

                                                                                                                                APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                                                                                                                Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                                                                                                                rating_sum = 0

                                                                                                                                for voter in selfvoters

                                                                                                                                for candidate in winners

                                                                                                                                rating_sum += voter[candidate]

                                                                                                                                return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                                                                                                                APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                                                                                                                Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                                                                                                                for i in range(1 selfN_VACANCIES + 2)

                                                                                                                                selfleading_candidatesappend(selfsorted_candidates[-i][self

                                                                                                                                CANDIDATE_INDEX])

                                                                                                                                APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                                                                                                                Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                                                                                                                for leader in selfelecrounds[-1]

                                                                                                                                selfleading_candidatesappend(leader[0])

                                                                                                                                70

                                                                                                                                APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                                                                                                                Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                                                                                                                self_account_for_coalitions()

                                                                                                                                for voter in selfvoters

                                                                                                                                selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                                                                                                                (1)))

                                                                                                                                temp = []

                                                                                                                                for voter in selfsorted_voters

                                                                                                                                new_dict = defaultdict(list)

                                                                                                                                for k in voter

                                                                                                                                new_dict[k[1]]append(k[0])

                                                                                                                                tempappend(new_dict)

                                                                                                                                selfsorted_voters = []

                                                                                                                                for voter_index current_voter in enumerate(temp)

                                                                                                                                new_voter = []

                                                                                                                                for rating candidate_indexes in current_voteritems()

                                                                                                                                if len(current_voter[rating]) gt 1

                                                                                                                                shuffle(current_voter[rating])

                                                                                                                                for e in candidate_indexes

                                                                                                                                new_voterappend((e rating))

                                                                                                                                else

                                                                                                                                new_voterappend((candidate_indexes[0] rating))

                                                                                                                                selfsorted_votersappend(new_voter)

                                                                                                                                selfcandidates[new_voter[-1][0]] += 1

                                                                                                                                selfvotes[new_voter[-1][0]]add(voter_index)

                                                                                                                                71

                                                                                                                                APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                                                                                                                Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                                                                                                                for candidate in selfvotes_copy

                                                                                                                                if candidate not in selfelecleading_candidates

                                                                                                                                for voter_index in selfvotes_copy[candidate]

                                                                                                                                for index _candidate in enumerate(reversed(selfelec

                                                                                                                                sorted_voters[voter_index]))

                                                                                                                                if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                                                                                                                leading_candidates

                                                                                                                                if randomrandom() lt selfelec

                                                                                                                                tactical_vote_percentages[_candidate[selfelec

                                                                                                                                CANDIDATE_INDEX]]

                                                                                                                                selfrankings_changed[voter_index] = copy

                                                                                                                                deepcopy(selfelecsorted_voters[voter_index])

                                                                                                                                selfrankings_changed[voter_index][-(index + 1)]

                                                                                                                                selfrankings_changed[voter_index][-1] = self

                                                                                                                                rankings_changed[voter_index][-1] self

                                                                                                                                rankings_changed[voter_index][-(index + 1)]

                                                                                                                                selfcandidates[candidate] -= 1

                                                                                                                                selfcandidates[_candidate[selfelec

                                                                                                                                CANDIDATE_INDEX]] += 1

                                                                                                                                selfvotes[candidate]remove(voter_index)

                                                                                                                                selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                                                                                                                ]]add(voter_index)

                                                                                                                                break

                                                                                                                                break

                                                                                                                                72

                                                                                                                                APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                                                                                                                Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                                                                                                                half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                                                                                                                for candidate in selfelecleading_candidates

                                                                                                                                if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                                                                                                                continue

                                                                                                                                for voter_index in selfvotes_copy[candidate]

                                                                                                                                if voter_index in selfrankings_changed

                                                                                                                                ranking = selfrankings_changed[voter_index]

                                                                                                                                else

                                                                                                                                ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                                                                                                                ])

                                                                                                                                for index _candidate in enumerate(reversed(ranking))

                                                                                                                                if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                                leading_candidates or (_candidate[selfelec

                                                                                                                                CANDIDATE_INDEX] in selfelecleading_candidates and

                                                                                                                                selfelecleading_candidatesindex(_candidate[selfelec

                                                                                                                                CANDIDATE_INDEX]) gt= half_vacancies)

                                                                                                                                if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                                                                                                                if randomrandom() lt selfelec

                                                                                                                                minority_vote_percentages[_candidate[selfelec

                                                                                                                                CANDIDATE_INDEX]]

                                                                                                                                selfcandidates[candidate] -= 1

                                                                                                                                selfcandidates[_candidate[selfelec

                                                                                                                                CANDIDATE_INDEX]] += 1

                                                                                                                                break

                                                                                                                                break

                                                                                                                                break

                                                                                                                                73

                                                                                                                                APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                                                                                                                Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                                                                                                                self_account_for_coalitions()

                                                                                                                                for candidate in selfvotes

                                                                                                                                if candidate = selfwinner and candidate = selfsecond_place

                                                                                                                                for voter_index in selfvotes[candidate]

                                                                                                                                if voter_index in selfrankings_changed

                                                                                                                                ranking = selfrankings_changed[voter_index]

                                                                                                                                else

                                                                                                                                ranking = copydeepcopy(selfelecsorted_voters[

                                                                                                                                voter_index])

                                                                                                                                for index2 candidate in enumerate(reversed(ranking))

                                                                                                                                if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                                                                                                                selfcandidates[selfwinner] += 1

                                                                                                                                selfvotes[selfwinner]add(voter_index)

                                                                                                                                break

                                                                                                                                elif candidate[selfelecCANDIDATE_INDEX] == self

                                                                                                                                second_place

                                                                                                                                selfcandidates[selfsecond_place] += 1

                                                                                                                                selfvotes[selfsecond_place]add(voter_index)

                                                                                                                                break

                                                                                                                                selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                                                winners = []

                                                                                                                                vacancies = selfelecN_VACANCIES

                                                                                                                                for candidate in reversed(selfsorted_candidates)

                                                                                                                                if vacancies == 0

                                                                                                                                break

                                                                                                                                winnersappend(candidate[0])

                                                                                                                                vacancies -= 1

                                                                                                                                mean chose_best = selfelecget_mean(winners = winners)

                                                                                                                                74

                                                                                                                                APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                                                                                                                Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                                                                                                                for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                voter_dict = dict()

                                                                                                                                og_voter_dict = dict()

                                                                                                                                for tup in voter

                                                                                                                                voter_dict[tup[0]] = tup[1]

                                                                                                                                og_voter_dict[tup[0]] = tup[1]

                                                                                                                                for coalition in selfeleccoalitions

                                                                                                                                for candidate in coalition

                                                                                                                                add_to_score = 0

                                                                                                                                for candidate2 in coalition

                                                                                                                                if candidate == candidate2

                                                                                                                                continue

                                                                                                                                half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                                                                                                                if half lt 0

                                                                                                                                add_to_score += mathceil(half)

                                                                                                                                else

                                                                                                                                add_to_score += mathfloor(half)

                                                                                                                                if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                                                                                                                voter_dict[candidate[rsquovaluersquo]] = 10

                                                                                                                                elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                                                                                                                voter_dict[candidate[rsquovaluersquo]] = -10

                                                                                                                                else

                                                                                                                                voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                                                                                                                selfrankings_changed[voter_index] = []

                                                                                                                                for candidate in voter_dict

                                                                                                                                selfrankings_changed[voter_index]append((candidate voter_dict[

                                                                                                                                candidate]))

                                                                                                                                selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                                                                                                                voter_index] key=lambda x x[1])

                                                                                                                                75

                                                                                                                                APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                                                                                                Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                                                                                                selfelecroundsappend(selfsorted_candidates[_round])

                                                                                                                                if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                                                N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                                                                                                N_VACANCIES - 1)

                                                                                                                                return 2

                                                                                                                                elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                                                N_VOTERS gt 05)

                                                                                                                                return 1

                                                                                                                                else

                                                                                                                                selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                                                                                                CANDIDATE_INDEX])

                                                                                                                                for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                                                                                                elecCANDIDATE_INDEX]]

                                                                                                                                if voter_index in selfrankings_changed

                                                                                                                                for candidate in reversed(selfrankings_changed[voter_index

                                                                                                                                ])

                                                                                                                                if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                                excluded

                                                                                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                                                ]] += 1

                                                                                                                                selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                                                add(voter_index)

                                                                                                                                break

                                                                                                                                else

                                                                                                                                continue

                                                                                                                                else

                                                                                                                                for candidate in reversed(selfelecsorted_voters[

                                                                                                                                voter_index])

                                                                                                                                if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                                excluded

                                                                                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                                                ]] += 1

                                                                                                                                selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                                                add(voter_index)

                                                                                                                                break

                                                                                                                                else

                                                                                                                                continue

                                                                                                                                selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                                                return 0

                                                                                                                                76

                                                                                                                                APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                                                                                                Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                                                                                                for index in range(selfelecN_CANDIDATES)

                                                                                                                                selfcandidates[index] = 0

                                                                                                                                for voter in selfelecsorted_voters

                                                                                                                                for candidate in reversed(voter)

                                                                                                                                if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                else

                                                                                                                                break

                                                                                                                                APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                                                                                                Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                                                                                                for index in range(selfelecN_CANDIDATES)

                                                                                                                                selfcandidates[index] = 0

                                                                                                                                for voter in selfelecsorted_voters

                                                                                                                                if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                                                elecCANDIDATE_INDEX]]

                                                                                                                                selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                else

                                                                                                                                for candidate in reversed(voter)

                                                                                                                                if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                else

                                                                                                                                break

                                                                                                                                77

                                                                                                                                APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                                                                                                Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                                                                                                pos = set()

                                                                                                                                for index perc in enumerate(selfelectactical_vote_percentages)

                                                                                                                                if perc gt 0

                                                                                                                                posadd(index)

                                                                                                                                for candidate in selfeleccandidates

                                                                                                                                if candidate not in selfleading_candidates

                                                                                                                                for voter_index in selfvotes[candidate]

                                                                                                                                raised = None

                                                                                                                                for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                                                                                                ])

                                                                                                                                if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                                                                                                leading_candidates

                                                                                                                                if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                                                                                                if randomrandom() lt selfelectactical_vote_percentages[

                                                                                                                                candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                                                                                                ranking = [None]selfelecN_CANDIDATES

                                                                                                                                ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                                CANDIDATE_INDEX]])

                                                                                                                                raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                break

                                                                                                                                break

                                                                                                                                break

                                                                                                                                if raised = None

                                                                                                                                for _candidate in selfleading_candidates

                                                                                                                                if _candidate = ranking[-1][0]

                                                                                                                                ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                                                _candidate])

                                                                                                                                buried = _candidate

                                                                                                                                break

                                                                                                                                i = 1

                                                                                                                                for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                                                if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                                                                                                buried]

                                                                                                                                continue

                                                                                                                                else

                                                                                                                                ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                                CANDIDATE_INDEX]])

                                                                                                                                i += 1

                                                                                                                                selfrankings_changed[voter_index] = ranking

                                                                                                                                78

                                                                                                                                APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                                                                                                Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                                                                                                for voter_index in selfvotes[candidate]

                                                                                                                                if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                                                                                                ]

                                                                                                                                for _candidate in selfleading_candidates

                                                                                                                                if _candidate = candidate

                                                                                                                                ranking = [None]selfelecN_CANDIDATES

                                                                                                                                ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                                                _candidate])

                                                                                                                                buried = _candidate

                                                                                                                                break

                                                                                                                                i = 1

                                                                                                                                for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                                                if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                                                                                                continue

                                                                                                                                else

                                                                                                                                ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                                CANDIDATE_INDEX]])

                                                                                                                                i += 1

                                                                                                                                selfrankings_changed[voter_index] = ranking

                                                                                                                                79

                                                                                                                                APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                                                                                                Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                                                                                                for index in range(selfelecN_CANDIDATES)

                                                                                                                                selfcandidates[index] = 0

                                                                                                                                for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                score = 0

                                                                                                                                if voter_index in selfrankings_changed

                                                                                                                                for candidate in selfrankings_changed[voter_index]

                                                                                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                                                score += 1

                                                                                                                                else

                                                                                                                                for candidate in voter

                                                                                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                                                score += 1

                                                                                                                                APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                                                                                                Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                                                                                                for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                                                elecCANDIDATE_INDEX]]

                                                                                                                                selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                                                                                                sorted_voters[voter_index])

                                                                                                                                for candidate_index candidate in enumerate(reversed(voter))

                                                                                                                                if candidate_index == 0

                                                                                                                                selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                                                voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                                                                                                else

                                                                                                                                selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                                                voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                                                                                                80

                                                                                                                                APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                                                                                                Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                                                                                                for index in range(selfelecN_CANDIDATES)

                                                                                                                                selfcandidates[index] = 0

                                                                                                                                for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                if voter_index in selfrankings_changed

                                                                                                                                for candidate in selfrankings_changed[voter_index]

                                                                                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                                                selfelecCANDIDATE_RANK]

                                                                                                                                else

                                                                                                                                for candidate in voter

                                                                                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                                                selfelecCANDIDATE_RANK]

                                                                                                                                APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                                                                                                Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                                                                                                for index in range(selfelecN_CANDIDATES)

                                                                                                                                selfcandidates[index] = 0

                                                                                                                                for voter in selfelecsorted_voters

                                                                                                                                votes = selfelecN_VACANCIES

                                                                                                                                for candidate in reversed(voter)

                                                                                                                                if votes == 0

                                                                                                                                break

                                                                                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                votes -= 1

                                                                                                                                • Folha de aprovaccedilatildeo
                                                                                                                                • Agradecimentos
                                                                                                                                • Epiacutegrafe
                                                                                                                                • Resumo
                                                                                                                                • Abstract
                                                                                                                                • Lista de ilustraccedilotildees
                                                                                                                                • Lista de Coacutedigos
                                                                                                                                • Lista de tabelas
                                                                                                                                • Lista de abreviaturas e siglas
                                                                                                                                • Sumaacuterio
                                                                                                                                • INTRODUCcedilAtildeO
                                                                                                                                  • MOTIVACcedilAtildeO E OBJETIVO
                                                                                                                                  • MEacuteTODO
                                                                                                                                  • ESTRUTURA
                                                                                                                                    • SISTEMAS ELEITORAIS
                                                                                                                                      • FISRT PAST THE POST
                                                                                                                                        • Exemplo
                                                                                                                                        • Vantagens e Desvantagens do FPTP
                                                                                                                                        • Voto Uacutetil no FPTP
                                                                                                                                          • TWO-ROUND SYSTEM
                                                                                                                                            • Exemplo
                                                                                                                                            • Vantagens e Desvantagens do TRS
                                                                                                                                            • Voto Uacutetil no TRS
                                                                                                                                              • INSTANT-RUNOFF VOTING
                                                                                                                                                • Exemplo
                                                                                                                                                • Vantagens e Desvantagens do IRV
                                                                                                                                                • Voto Uacutetil no IRV
                                                                                                                                                  • APPROVAL VOTING SYSTEM
                                                                                                                                                    • Exemplo
                                                                                                                                                    • Vantagens e Desvantagens do AVS
                                                                                                                                                    • Voto Uacutetil no AVS
                                                                                                                                                      • THE BORDA COUNT
                                                                                                                                                        • Exemplo
                                                                                                                                                        • Vantagens e Desvantagens do BC
                                                                                                                                                        • Voto Uacutetil no BC
                                                                                                                                                          • SCORE VOTING SYSTEM
                                                                                                                                                            • Exemplo
                                                                                                                                                            • Vantagens e Desvantagens do SVS
                                                                                                                                                            • Voto Uacutetil no SVS
                                                                                                                                                              • BLOC VOTE
                                                                                                                                                                • Exemplo
                                                                                                                                                                • Voto Uacutetil no BV
                                                                                                                                                                    • O SIMULADOR
                                                                                                                                                                    • CENAacuteRIOS PERTINENTES
                                                                                                                                                                      • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                                                                                      • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                                                                                      • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                                                                                      • CENAacuteRIO 4 COALIZOtildeES
                                                                                                                                                                      • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                                                                                      • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                                                                                        • COMO FUNCIONA O SIMULADOR
                                                                                                                                                                          • CLASSE Elections
                                                                                                                                                                          • CLASSE FirstPastThePost
                                                                                                                                                                          • CLASSE TwoRoundSystem
                                                                                                                                                                          • CLASSE InstantRunoffVoting
                                                                                                                                                                          • CLASSE ApprovalVoting
                                                                                                                                                                          • CLASSE BordaCount
                                                                                                                                                                          • CLASSE ScoreVoting
                                                                                                                                                                          • CLASSE BlocVote
                                                                                                                                                                          • TECNOLOGIAS UTILIZADAS
                                                                                                                                                                            • CONCLUSAtildeO
                                                                                                                                                                            • Referecircncias
                                                                                                                                                                            • Meacutetodo create_voters
                                                                                                                                                                            • Meacutetodo create_candidates
                                                                                                                                                                            • Meacutetodo calculate_means
                                                                                                                                                                            • Meacutetodo get_mean
                                                                                                                                                                            • Meacutetodo calculate_mean
                                                                                                                                                                            • Meacutetodo set_leading_candidates
                                                                                                                                                                            • Meacutetodo irv_set_leading_candidates
                                                                                                                                                                            • Meacutetodo sort_ranks
                                                                                                                                                                            • Meacutetodo fptp_count_tactical_votes
                                                                                                                                                                            • Meacutetodo fptp_count_minority_votes
                                                                                                                                                                            • Meacutetodo trs_second_round
                                                                                                                                                                            • Meacutetodo trs_account_for_coalitions
                                                                                                                                                                            • Meacutetodo irv_count_votes
                                                                                                                                                                            • Meacutetodo avs_count_votes
                                                                                                                                                                            • Meacutetodo avs_count_votes_with_tactical
                                                                                                                                                                            • Meacutetodo irv_apply_tactical_votes
                                                                                                                                                                            • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                                                                                            • Meacutetodo bc_sum_candidates_scores
                                                                                                                                                                            • Meacutetodo svs_apply_tactical_votes
                                                                                                                                                                            • Meacutetodo svs_sum_candidates_scores
                                                                                                                                                                            • Meacutetodo bv_count_votes

                                                                                                                                  65

                                                                                                                                  6 CONCLUSAtildeO

                                                                                                                                  Dentre os sistemas abordados neste trabalho eacute niacutetido que o FPTP eacute o sistema quemenos se esforccedila em satisfazer fraccedilotildees significativas da populaccedilatildeo natildeo apenas por ser umsistema de pluralidade mas tambeacutem por ser elevadamente suscetiacutevel a mais de um tipode voto estrateacutegico O TRS apesar de ser um avanccedilo em relaccedilatildeo ao FPTP por impora necessidade da maioridade seus resultados ainda podem ser manipulados atraveacutes daformaccedilatildeo de coalizotildees e sua estrutura eacute muito mais complacente ao voto taacutetico do que oIRV

                                                                                                                                  Mesmo assim diante dos resultados obtidos no Capiacutetulo 4 existe um impasse a serconsiderado Por um lado temos o IRV que se comporta melhor do que suas alternativasmais comumente usadas o FPTP e o TRS e que possui certa resistecircncia aos riscosenvolvidos com os votos taacuteticos mas que nem sempre retorna os melhores resultados epossui a estranha caracteriacutestica da natildeo-monotonicidade Por outro lado temos sistemascomo o Borda Count e o SVS que parecem ser consistentes em retornar o melhor candidatomas que podem ser completamente desajustados se um grupo razoaacutevel de indiviacuteduosresolver votar de maneira estrateacutegica ao inveacutes de votar em suas reais preferecircncias

                                                                                                                                  Em relaccedilatildeo agraves eleiccedilotildees com mais de uma vaga as dificuldades tambeacutem emergem davotaccedilatildeo estrateacutegica Os denominados neste trabalho votos de minoria quando presen-tes afetam profundamente o FPTP enquanto as alternativas Bloc Vote Borda CountAVS e SVS satildeo mais eficientes porque os evitam

                                                                                                                                  Eacute evidente ver que o sistema ideal seria um que ao mesmo tempo que em sua estruturarestringisse ao maacuteximo qualquer tentativa de pensamento estrateacutegico como no IRV masque tambeacutem permitisse o maior grau de expressividade possiacutevel ao eleitor e absorvessetoda a intenccedilatildeo do mesmo assim como ocorre no SVS Este sistema hiacutebrido formado poresses outros dois talvez jaacute seja o proacuteprio Borda Count que possui um tipo de voto taacuteticomas que quando presente pode ser tatildeo desastroso e friacutevolo que talvez seja o necessaacuteriopara fazer com que a populaccedilatildeo votante perceba que votar de maneira verdadeira eacute simde seu interesse

                                                                                                                                  Portanto se natildeo for possiacutevel o desenvolvimento de um sistema que permita ao mesmotempo alta expressividade aos eleitores e a anulaccedilatildeo de qualquer tipo de voto estrateacutegicotalvez a melhor alternativa seja uma maior educaccedilatildeo eleitoral sobre os malefiacutecios destetipo de pensamento e com isso a utilizaccedilatildeo de sistemas eficientes como o Borda Count eo SVS

                                                                                                                                  66

                                                                                                                                  REFEREcircNCIAS

                                                                                                                                  AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                                                                                                                                  Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                                                                                                                                  Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                                                                                                                                  Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                                                                                                                                  HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                                                                                                                                  LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                                                                                                                                  ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                                                                                                                                  Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                                                                                                                                  POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                                                                                                                                  The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                                                                                                                                  67

                                                                                                                                  APEcircNDICES

                                                                                                                                  APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                                                                                                                  Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                                                                                                                  if(not len(selfvoter_profiles))

                                                                                                                                  for voter in range(selfN_VOTERS)

                                                                                                                                  candidates_rank = dict()

                                                                                                                                  for candidate in reversed(range(selfN_CANDIDATES))

                                                                                                                                  if(selfBIAS_VECTOR[candidate]==4)

                                                                                                                                  candidates_rank[candidate] = self_sortear(selfloved)

                                                                                                                                  elif(selfBIAS_VECTOR[candidate]==3)

                                                                                                                                  candidates_rank[candidate] = self_sortear(selfliked)

                                                                                                                                  elif(selfBIAS_VECTOR[candidate]==2)

                                                                                                                                  candidates_rank[candidate] = self_sortear(selfdisliked)

                                                                                                                                  elif(selfBIAS_VECTOR[candidate]==1)

                                                                                                                                  candidates_rank[candidate] = self_sortear(selfhated)

                                                                                                                                  elif(selfBIAS_VECTOR[candidate]==-1)

                                                                                                                                  candidates_rank[candidate] = self_sortear(selfpolarizer

                                                                                                                                  )

                                                                                                                                  elif(selfBIAS_VECTOR[candidate]==-2)

                                                                                                                                  candidates_rank[candidate] = self_sortear(self

                                                                                                                                  more_polarizer)

                                                                                                                                  else

                                                                                                                                  candidates_rank[candidate] = self_sortear(selfneutral)

                                                                                                                                  selfvotersappend(candidates_rank)

                                                                                                                                  else

                                                                                                                                  ranges = []

                                                                                                                                  ranks = []

                                                                                                                                  for prof in selfvoter_profiles

                                                                                                                                  rangesappend(int(prof[pop_percentage]))

                                                                                                                                  rank =

                                                                                                                                  for index score in enumerate(prof[scores])

                                                                                                                                  rank[index] = score

                                                                                                                                  ranksappend(rank)

                                                                                                                                  for index _range in enumerate(ranges)

                                                                                                                                  for _ in range(int(selfN_VOTERS(_range100)))

                                                                                                                                  selfvotersappend(ranks[index])

                                                                                                                                  68

                                                                                                                                  APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                                                                                                                  Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                                                                                                                  for i in range(selfN_CANDIDATES)

                                                                                                                                  selfcandidates[i] = 0

                                                                                                                                  selfvotes[i] = set()

                                                                                                                                  APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                                                                                                                  Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                                                                                                                  for candidate in range(selfN_CANDIDATES)

                                                                                                                                  rating_sum = 0

                                                                                                                                  for voter in selfvoters

                                                                                                                                  rating_sum += voter[candidate]

                                                                                                                                  selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                                                                                                                  APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                                                                                                                  Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                                                                                                                  if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                                                                                                                  return selfcalculate_mean(winners)

                                                                                                                                  else

                                                                                                                                  chose_best = True if winners[0] == selfbest_candidate else

                                                                                                                                  False

                                                                                                                                  return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                                                                                                                  69

                                                                                                                                  APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                                                                                                                  Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                                                                                                                  rating_sum = 0

                                                                                                                                  for voter in selfvoters

                                                                                                                                  for candidate in winners

                                                                                                                                  rating_sum += voter[candidate]

                                                                                                                                  return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                                                                                                                  APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                                                                                                                  Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                                                                                                                  for i in range(1 selfN_VACANCIES + 2)

                                                                                                                                  selfleading_candidatesappend(selfsorted_candidates[-i][self

                                                                                                                                  CANDIDATE_INDEX])

                                                                                                                                  APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                                                                                                                  Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                                                                                                                  for leader in selfelecrounds[-1]

                                                                                                                                  selfleading_candidatesappend(leader[0])

                                                                                                                                  70

                                                                                                                                  APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                                                                                                                  Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                                                                                                                  self_account_for_coalitions()

                                                                                                                                  for voter in selfvoters

                                                                                                                                  selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                                                                                                                  (1)))

                                                                                                                                  temp = []

                                                                                                                                  for voter in selfsorted_voters

                                                                                                                                  new_dict = defaultdict(list)

                                                                                                                                  for k in voter

                                                                                                                                  new_dict[k[1]]append(k[0])

                                                                                                                                  tempappend(new_dict)

                                                                                                                                  selfsorted_voters = []

                                                                                                                                  for voter_index current_voter in enumerate(temp)

                                                                                                                                  new_voter = []

                                                                                                                                  for rating candidate_indexes in current_voteritems()

                                                                                                                                  if len(current_voter[rating]) gt 1

                                                                                                                                  shuffle(current_voter[rating])

                                                                                                                                  for e in candidate_indexes

                                                                                                                                  new_voterappend((e rating))

                                                                                                                                  else

                                                                                                                                  new_voterappend((candidate_indexes[0] rating))

                                                                                                                                  selfsorted_votersappend(new_voter)

                                                                                                                                  selfcandidates[new_voter[-1][0]] += 1

                                                                                                                                  selfvotes[new_voter[-1][0]]add(voter_index)

                                                                                                                                  71

                                                                                                                                  APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                                                                                                                  Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                                                                                                                  for candidate in selfvotes_copy

                                                                                                                                  if candidate not in selfelecleading_candidates

                                                                                                                                  for voter_index in selfvotes_copy[candidate]

                                                                                                                                  for index _candidate in enumerate(reversed(selfelec

                                                                                                                                  sorted_voters[voter_index]))

                                                                                                                                  if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                                                                                                                  leading_candidates

                                                                                                                                  if randomrandom() lt selfelec

                                                                                                                                  tactical_vote_percentages[_candidate[selfelec

                                                                                                                                  CANDIDATE_INDEX]]

                                                                                                                                  selfrankings_changed[voter_index] = copy

                                                                                                                                  deepcopy(selfelecsorted_voters[voter_index])

                                                                                                                                  selfrankings_changed[voter_index][-(index + 1)]

                                                                                                                                  selfrankings_changed[voter_index][-1] = self

                                                                                                                                  rankings_changed[voter_index][-1] self

                                                                                                                                  rankings_changed[voter_index][-(index + 1)]

                                                                                                                                  selfcandidates[candidate] -= 1

                                                                                                                                  selfcandidates[_candidate[selfelec

                                                                                                                                  CANDIDATE_INDEX]] += 1

                                                                                                                                  selfvotes[candidate]remove(voter_index)

                                                                                                                                  selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                                                                                                                  ]]add(voter_index)

                                                                                                                                  break

                                                                                                                                  break

                                                                                                                                  72

                                                                                                                                  APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                                                                                                                  Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                                                                                                                  half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                                                                                                                  for candidate in selfelecleading_candidates

                                                                                                                                  if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                                                                                                                  continue

                                                                                                                                  for voter_index in selfvotes_copy[candidate]

                                                                                                                                  if voter_index in selfrankings_changed

                                                                                                                                  ranking = selfrankings_changed[voter_index]

                                                                                                                                  else

                                                                                                                                  ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                                                                                                                  ])

                                                                                                                                  for index _candidate in enumerate(reversed(ranking))

                                                                                                                                  if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                                  leading_candidates or (_candidate[selfelec

                                                                                                                                  CANDIDATE_INDEX] in selfelecleading_candidates and

                                                                                                                                  selfelecleading_candidatesindex(_candidate[selfelec

                                                                                                                                  CANDIDATE_INDEX]) gt= half_vacancies)

                                                                                                                                  if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                                                                                                                  if randomrandom() lt selfelec

                                                                                                                                  minority_vote_percentages[_candidate[selfelec

                                                                                                                                  CANDIDATE_INDEX]]

                                                                                                                                  selfcandidates[candidate] -= 1

                                                                                                                                  selfcandidates[_candidate[selfelec

                                                                                                                                  CANDIDATE_INDEX]] += 1

                                                                                                                                  break

                                                                                                                                  break

                                                                                                                                  break

                                                                                                                                  73

                                                                                                                                  APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                                                                                                                  Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                                                                                                                  self_account_for_coalitions()

                                                                                                                                  for candidate in selfvotes

                                                                                                                                  if candidate = selfwinner and candidate = selfsecond_place

                                                                                                                                  for voter_index in selfvotes[candidate]

                                                                                                                                  if voter_index in selfrankings_changed

                                                                                                                                  ranking = selfrankings_changed[voter_index]

                                                                                                                                  else

                                                                                                                                  ranking = copydeepcopy(selfelecsorted_voters[

                                                                                                                                  voter_index])

                                                                                                                                  for index2 candidate in enumerate(reversed(ranking))

                                                                                                                                  if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                                                                                                                  selfcandidates[selfwinner] += 1

                                                                                                                                  selfvotes[selfwinner]add(voter_index)

                                                                                                                                  break

                                                                                                                                  elif candidate[selfelecCANDIDATE_INDEX] == self

                                                                                                                                  second_place

                                                                                                                                  selfcandidates[selfsecond_place] += 1

                                                                                                                                  selfvotes[selfsecond_place]add(voter_index)

                                                                                                                                  break

                                                                                                                                  selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                                                  winners = []

                                                                                                                                  vacancies = selfelecN_VACANCIES

                                                                                                                                  for candidate in reversed(selfsorted_candidates)

                                                                                                                                  if vacancies == 0

                                                                                                                                  break

                                                                                                                                  winnersappend(candidate[0])

                                                                                                                                  vacancies -= 1

                                                                                                                                  mean chose_best = selfelecget_mean(winners = winners)

                                                                                                                                  74

                                                                                                                                  APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                                                                                                                  Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                                                                                                                  for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                  voter_dict = dict()

                                                                                                                                  og_voter_dict = dict()

                                                                                                                                  for tup in voter

                                                                                                                                  voter_dict[tup[0]] = tup[1]

                                                                                                                                  og_voter_dict[tup[0]] = tup[1]

                                                                                                                                  for coalition in selfeleccoalitions

                                                                                                                                  for candidate in coalition

                                                                                                                                  add_to_score = 0

                                                                                                                                  for candidate2 in coalition

                                                                                                                                  if candidate == candidate2

                                                                                                                                  continue

                                                                                                                                  half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                                                                                                                  if half lt 0

                                                                                                                                  add_to_score += mathceil(half)

                                                                                                                                  else

                                                                                                                                  add_to_score += mathfloor(half)

                                                                                                                                  if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                                                                                                                  voter_dict[candidate[rsquovaluersquo]] = 10

                                                                                                                                  elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                                                                                                                  voter_dict[candidate[rsquovaluersquo]] = -10

                                                                                                                                  else

                                                                                                                                  voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                                                                                                                  selfrankings_changed[voter_index] = []

                                                                                                                                  for candidate in voter_dict

                                                                                                                                  selfrankings_changed[voter_index]append((candidate voter_dict[

                                                                                                                                  candidate]))

                                                                                                                                  selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                                                                                                                  voter_index] key=lambda x x[1])

                                                                                                                                  75

                                                                                                                                  APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                                                                                                  Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                                                                                                  selfelecroundsappend(selfsorted_candidates[_round])

                                                                                                                                  if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                                                  N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                                                                                                  N_VACANCIES - 1)

                                                                                                                                  return 2

                                                                                                                                  elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                                                  N_VOTERS gt 05)

                                                                                                                                  return 1

                                                                                                                                  else

                                                                                                                                  selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                                                                                                  CANDIDATE_INDEX])

                                                                                                                                  for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                                                                                                  elecCANDIDATE_INDEX]]

                                                                                                                                  if voter_index in selfrankings_changed

                                                                                                                                  for candidate in reversed(selfrankings_changed[voter_index

                                                                                                                                  ])

                                                                                                                                  if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                                  excluded

                                                                                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                                                  ]] += 1

                                                                                                                                  selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                                                  add(voter_index)

                                                                                                                                  break

                                                                                                                                  else

                                                                                                                                  continue

                                                                                                                                  else

                                                                                                                                  for candidate in reversed(selfelecsorted_voters[

                                                                                                                                  voter_index])

                                                                                                                                  if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                                  excluded

                                                                                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                                                  ]] += 1

                                                                                                                                  selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                                                  add(voter_index)

                                                                                                                                  break

                                                                                                                                  else

                                                                                                                                  continue

                                                                                                                                  selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                                                  return 0

                                                                                                                                  76

                                                                                                                                  APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                                                                                                  Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                                                                                                  for index in range(selfelecN_CANDIDATES)

                                                                                                                                  selfcandidates[index] = 0

                                                                                                                                  for voter in selfelecsorted_voters

                                                                                                                                  for candidate in reversed(voter)

                                                                                                                                  if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                  else

                                                                                                                                  break

                                                                                                                                  APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                                                                                                  Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                                                                                                  for index in range(selfelecN_CANDIDATES)

                                                                                                                                  selfcandidates[index] = 0

                                                                                                                                  for voter in selfelecsorted_voters

                                                                                                                                  if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                                                  elecCANDIDATE_INDEX]]

                                                                                                                                  selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                  else

                                                                                                                                  for candidate in reversed(voter)

                                                                                                                                  if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                  else

                                                                                                                                  break

                                                                                                                                  77

                                                                                                                                  APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                                                                                                  Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                                                                                                  pos = set()

                                                                                                                                  for index perc in enumerate(selfelectactical_vote_percentages)

                                                                                                                                  if perc gt 0

                                                                                                                                  posadd(index)

                                                                                                                                  for candidate in selfeleccandidates

                                                                                                                                  if candidate not in selfleading_candidates

                                                                                                                                  for voter_index in selfvotes[candidate]

                                                                                                                                  raised = None

                                                                                                                                  for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                                                                                                  ])

                                                                                                                                  if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                                                                                                  leading_candidates

                                                                                                                                  if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                                                                                                  if randomrandom() lt selfelectactical_vote_percentages[

                                                                                                                                  candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                                                                                                  ranking = [None]selfelecN_CANDIDATES

                                                                                                                                  ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                  selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                                  CANDIDATE_INDEX]])

                                                                                                                                  raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                  break

                                                                                                                                  break

                                                                                                                                  break

                                                                                                                                  if raised = None

                                                                                                                                  for _candidate in selfleading_candidates

                                                                                                                                  if _candidate = ranking[-1][0]

                                                                                                                                  ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                                                  _candidate])

                                                                                                                                  buried = _candidate

                                                                                                                                  break

                                                                                                                                  i = 1

                                                                                                                                  for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                                                  if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                                                                                                  buried]

                                                                                                                                  continue

                                                                                                                                  else

                                                                                                                                  ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                  selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                                  CANDIDATE_INDEX]])

                                                                                                                                  i += 1

                                                                                                                                  selfrankings_changed[voter_index] = ranking

                                                                                                                                  78

                                                                                                                                  APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                                                                                                  Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                                                                                                  for voter_index in selfvotes[candidate]

                                                                                                                                  if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                                                                                                  ]

                                                                                                                                  for _candidate in selfleading_candidates

                                                                                                                                  if _candidate = candidate

                                                                                                                                  ranking = [None]selfelecN_CANDIDATES

                                                                                                                                  ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                                                  _candidate])

                                                                                                                                  buried = _candidate

                                                                                                                                  break

                                                                                                                                  i = 1

                                                                                                                                  for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                                                  if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                                                                                                  continue

                                                                                                                                  else

                                                                                                                                  ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                  selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                                  CANDIDATE_INDEX]])

                                                                                                                                  i += 1

                                                                                                                                  selfrankings_changed[voter_index] = ranking

                                                                                                                                  79

                                                                                                                                  APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                                                                                                  Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                                                                                                  for index in range(selfelecN_CANDIDATES)

                                                                                                                                  selfcandidates[index] = 0

                                                                                                                                  for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                  score = 0

                                                                                                                                  if voter_index in selfrankings_changed

                                                                                                                                  for candidate in selfrankings_changed[voter_index]

                                                                                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                                                  score += 1

                                                                                                                                  else

                                                                                                                                  for candidate in voter

                                                                                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                                                  score += 1

                                                                                                                                  APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                                                                                                  Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                                                                                                  for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                  if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                                                  elecCANDIDATE_INDEX]]

                                                                                                                                  selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                                                                                                  sorted_voters[voter_index])

                                                                                                                                  for candidate_index candidate in enumerate(reversed(voter))

                                                                                                                                  if candidate_index == 0

                                                                                                                                  selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                                                  voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                                                                                                  else

                                                                                                                                  selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                                                  voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                                                                                                  80

                                                                                                                                  APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                                                                                                  Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                                                                                                  for index in range(selfelecN_CANDIDATES)

                                                                                                                                  selfcandidates[index] = 0

                                                                                                                                  for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                  if voter_index in selfrankings_changed

                                                                                                                                  for candidate in selfrankings_changed[voter_index]

                                                                                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                                                  selfelecCANDIDATE_RANK]

                                                                                                                                  else

                                                                                                                                  for candidate in voter

                                                                                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                                                  selfelecCANDIDATE_RANK]

                                                                                                                                  APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                                                                                                  Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                                                                                                  for index in range(selfelecN_CANDIDATES)

                                                                                                                                  selfcandidates[index] = 0

                                                                                                                                  for voter in selfelecsorted_voters

                                                                                                                                  votes = selfelecN_VACANCIES

                                                                                                                                  for candidate in reversed(voter)

                                                                                                                                  if votes == 0

                                                                                                                                  break

                                                                                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                  votes -= 1

                                                                                                                                  • Folha de aprovaccedilatildeo
                                                                                                                                  • Agradecimentos
                                                                                                                                  • Epiacutegrafe
                                                                                                                                  • Resumo
                                                                                                                                  • Abstract
                                                                                                                                  • Lista de ilustraccedilotildees
                                                                                                                                  • Lista de Coacutedigos
                                                                                                                                  • Lista de tabelas
                                                                                                                                  • Lista de abreviaturas e siglas
                                                                                                                                  • Sumaacuterio
                                                                                                                                  • INTRODUCcedilAtildeO
                                                                                                                                    • MOTIVACcedilAtildeO E OBJETIVO
                                                                                                                                    • MEacuteTODO
                                                                                                                                    • ESTRUTURA
                                                                                                                                      • SISTEMAS ELEITORAIS
                                                                                                                                        • FISRT PAST THE POST
                                                                                                                                          • Exemplo
                                                                                                                                          • Vantagens e Desvantagens do FPTP
                                                                                                                                          • Voto Uacutetil no FPTP
                                                                                                                                            • TWO-ROUND SYSTEM
                                                                                                                                              • Exemplo
                                                                                                                                              • Vantagens e Desvantagens do TRS
                                                                                                                                              • Voto Uacutetil no TRS
                                                                                                                                                • INSTANT-RUNOFF VOTING
                                                                                                                                                  • Exemplo
                                                                                                                                                  • Vantagens e Desvantagens do IRV
                                                                                                                                                  • Voto Uacutetil no IRV
                                                                                                                                                    • APPROVAL VOTING SYSTEM
                                                                                                                                                      • Exemplo
                                                                                                                                                      • Vantagens e Desvantagens do AVS
                                                                                                                                                      • Voto Uacutetil no AVS
                                                                                                                                                        • THE BORDA COUNT
                                                                                                                                                          • Exemplo
                                                                                                                                                          • Vantagens e Desvantagens do BC
                                                                                                                                                          • Voto Uacutetil no BC
                                                                                                                                                            • SCORE VOTING SYSTEM
                                                                                                                                                              • Exemplo
                                                                                                                                                              • Vantagens e Desvantagens do SVS
                                                                                                                                                              • Voto Uacutetil no SVS
                                                                                                                                                                • BLOC VOTE
                                                                                                                                                                  • Exemplo
                                                                                                                                                                  • Voto Uacutetil no BV
                                                                                                                                                                      • O SIMULADOR
                                                                                                                                                                      • CENAacuteRIOS PERTINENTES
                                                                                                                                                                        • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                                                                                        • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                                                                                        • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                                                                                        • CENAacuteRIO 4 COALIZOtildeES
                                                                                                                                                                        • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                                                                                        • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                                                                                          • COMO FUNCIONA O SIMULADOR
                                                                                                                                                                            • CLASSE Elections
                                                                                                                                                                            • CLASSE FirstPastThePost
                                                                                                                                                                            • CLASSE TwoRoundSystem
                                                                                                                                                                            • CLASSE InstantRunoffVoting
                                                                                                                                                                            • CLASSE ApprovalVoting
                                                                                                                                                                            • CLASSE BordaCount
                                                                                                                                                                            • CLASSE ScoreVoting
                                                                                                                                                                            • CLASSE BlocVote
                                                                                                                                                                            • TECNOLOGIAS UTILIZADAS
                                                                                                                                                                              • CONCLUSAtildeO
                                                                                                                                                                              • Referecircncias
                                                                                                                                                                              • Meacutetodo create_voters
                                                                                                                                                                              • Meacutetodo create_candidates
                                                                                                                                                                              • Meacutetodo calculate_means
                                                                                                                                                                              • Meacutetodo get_mean
                                                                                                                                                                              • Meacutetodo calculate_mean
                                                                                                                                                                              • Meacutetodo set_leading_candidates
                                                                                                                                                                              • Meacutetodo irv_set_leading_candidates
                                                                                                                                                                              • Meacutetodo sort_ranks
                                                                                                                                                                              • Meacutetodo fptp_count_tactical_votes
                                                                                                                                                                              • Meacutetodo fptp_count_minority_votes
                                                                                                                                                                              • Meacutetodo trs_second_round
                                                                                                                                                                              • Meacutetodo trs_account_for_coalitions
                                                                                                                                                                              • Meacutetodo irv_count_votes
                                                                                                                                                                              • Meacutetodo avs_count_votes
                                                                                                                                                                              • Meacutetodo avs_count_votes_with_tactical
                                                                                                                                                                              • Meacutetodo irv_apply_tactical_votes
                                                                                                                                                                              • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                                                                                              • Meacutetodo bc_sum_candidates_scores
                                                                                                                                                                              • Meacutetodo svs_apply_tactical_votes
                                                                                                                                                                              • Meacutetodo svs_sum_candidates_scores
                                                                                                                                                                              • Meacutetodo bv_count_votes

                                                                                                                                    66

                                                                                                                                    REFEREcircNCIAS

                                                                                                                                    AMY D J Behind the Ballot Box A Citizenrsquos Guide to Voting Systems 88Post Road West Westport CT 06881 Praeger Publishers 2000

                                                                                                                                    Bartholdi John J III and Orlin James B Single transferable vote resists strategicvoting 1990 Disponiacutevel em lthttpswww2isyegatechedu~jjbpapersstvpdfgtAcesso em 29 jul2019

                                                                                                                                    Electoral Reform Society Bloc vote 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemfirst-past-the-postblock-votegt Acesso em 29 mai2019

                                                                                                                                    Electoral Reform Society Borda count 2017 Disponiacutevel em lthttpswwwelectoral-reformorgukvoting-systemstypes-of-voting-systemborda-countgt Acessoem 28 mai2019

                                                                                                                                    HAMLIN A Who uses approval voting 2015 Disponiacutevel em lthttpswwwelectionscienceorgvoting-methodsapproval-voting-progressgt Acesso em 27mai2019

                                                                                                                                    LIPPMAN D Borda count 2012 Disponiacutevel em lthttpscourseslumenlearningcomwaymakermath4libartschapterborda-countgt Acesso em 28 mai2019

                                                                                                                                    ORNSTEIN J T Monotonicity failure under irv 2018 Disponiacutevel em lthttpsjoeornsteingithubioMonotonicityFailurehtmlgt Acesso em 29 mai2019

                                                                                                                                    Pew Research Center Nearly six-in-ten governments are democracies2017 Disponiacutevel em lthttpswwwpewresearchorgfact-tank20171206despite-concerns-about-global-democracy-nearly-six-in-ten-countries-are-now-democraticft_17-11-10_demo_auto_trendgt Acesso em 07 abr2019

                                                                                                                                    POUNDSTONE W Prisonerrsquos Dilemma 1745 Broadway New York NY 10019Doubleday 1992

                                                                                                                                    The Center for Election Science Bullet Voting 2015 Disponiacutevel em lthttpswwwelectionscienceorglibrarybullet-votinggt Acesso em 29 mai2019

                                                                                                                                    67

                                                                                                                                    APEcircNDICES

                                                                                                                                    APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                                                                                                                    Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                                                                                                                    if(not len(selfvoter_profiles))

                                                                                                                                    for voter in range(selfN_VOTERS)

                                                                                                                                    candidates_rank = dict()

                                                                                                                                    for candidate in reversed(range(selfN_CANDIDATES))

                                                                                                                                    if(selfBIAS_VECTOR[candidate]==4)

                                                                                                                                    candidates_rank[candidate] = self_sortear(selfloved)

                                                                                                                                    elif(selfBIAS_VECTOR[candidate]==3)

                                                                                                                                    candidates_rank[candidate] = self_sortear(selfliked)

                                                                                                                                    elif(selfBIAS_VECTOR[candidate]==2)

                                                                                                                                    candidates_rank[candidate] = self_sortear(selfdisliked)

                                                                                                                                    elif(selfBIAS_VECTOR[candidate]==1)

                                                                                                                                    candidates_rank[candidate] = self_sortear(selfhated)

                                                                                                                                    elif(selfBIAS_VECTOR[candidate]==-1)

                                                                                                                                    candidates_rank[candidate] = self_sortear(selfpolarizer

                                                                                                                                    )

                                                                                                                                    elif(selfBIAS_VECTOR[candidate]==-2)

                                                                                                                                    candidates_rank[candidate] = self_sortear(self

                                                                                                                                    more_polarizer)

                                                                                                                                    else

                                                                                                                                    candidates_rank[candidate] = self_sortear(selfneutral)

                                                                                                                                    selfvotersappend(candidates_rank)

                                                                                                                                    else

                                                                                                                                    ranges = []

                                                                                                                                    ranks = []

                                                                                                                                    for prof in selfvoter_profiles

                                                                                                                                    rangesappend(int(prof[pop_percentage]))

                                                                                                                                    rank =

                                                                                                                                    for index score in enumerate(prof[scores])

                                                                                                                                    rank[index] = score

                                                                                                                                    ranksappend(rank)

                                                                                                                                    for index _range in enumerate(ranges)

                                                                                                                                    for _ in range(int(selfN_VOTERS(_range100)))

                                                                                                                                    selfvotersappend(ranks[index])

                                                                                                                                    68

                                                                                                                                    APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                                                                                                                    Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                                                                                                                    for i in range(selfN_CANDIDATES)

                                                                                                                                    selfcandidates[i] = 0

                                                                                                                                    selfvotes[i] = set()

                                                                                                                                    APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                                                                                                                    Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                                                                                                                    for candidate in range(selfN_CANDIDATES)

                                                                                                                                    rating_sum = 0

                                                                                                                                    for voter in selfvoters

                                                                                                                                    rating_sum += voter[candidate]

                                                                                                                                    selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                                                                                                                    APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                                                                                                                    Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                                                                                                                    if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                                                                                                                    return selfcalculate_mean(winners)

                                                                                                                                    else

                                                                                                                                    chose_best = True if winners[0] == selfbest_candidate else

                                                                                                                                    False

                                                                                                                                    return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                                                                                                                    69

                                                                                                                                    APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                                                                                                                    Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                                                                                                                    rating_sum = 0

                                                                                                                                    for voter in selfvoters

                                                                                                                                    for candidate in winners

                                                                                                                                    rating_sum += voter[candidate]

                                                                                                                                    return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                                                                                                                    APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                                                                                                                    Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                                                                                                                    for i in range(1 selfN_VACANCIES + 2)

                                                                                                                                    selfleading_candidatesappend(selfsorted_candidates[-i][self

                                                                                                                                    CANDIDATE_INDEX])

                                                                                                                                    APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                                                                                                                    Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                                                                                                                    for leader in selfelecrounds[-1]

                                                                                                                                    selfleading_candidatesappend(leader[0])

                                                                                                                                    70

                                                                                                                                    APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                                                                                                                    Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                                                                                                                    self_account_for_coalitions()

                                                                                                                                    for voter in selfvoters

                                                                                                                                    selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                                                                                                                    (1)))

                                                                                                                                    temp = []

                                                                                                                                    for voter in selfsorted_voters

                                                                                                                                    new_dict = defaultdict(list)

                                                                                                                                    for k in voter

                                                                                                                                    new_dict[k[1]]append(k[0])

                                                                                                                                    tempappend(new_dict)

                                                                                                                                    selfsorted_voters = []

                                                                                                                                    for voter_index current_voter in enumerate(temp)

                                                                                                                                    new_voter = []

                                                                                                                                    for rating candidate_indexes in current_voteritems()

                                                                                                                                    if len(current_voter[rating]) gt 1

                                                                                                                                    shuffle(current_voter[rating])

                                                                                                                                    for e in candidate_indexes

                                                                                                                                    new_voterappend((e rating))

                                                                                                                                    else

                                                                                                                                    new_voterappend((candidate_indexes[0] rating))

                                                                                                                                    selfsorted_votersappend(new_voter)

                                                                                                                                    selfcandidates[new_voter[-1][0]] += 1

                                                                                                                                    selfvotes[new_voter[-1][0]]add(voter_index)

                                                                                                                                    71

                                                                                                                                    APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                                                                                                                    Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                                                                                                                    for candidate in selfvotes_copy

                                                                                                                                    if candidate not in selfelecleading_candidates

                                                                                                                                    for voter_index in selfvotes_copy[candidate]

                                                                                                                                    for index _candidate in enumerate(reversed(selfelec

                                                                                                                                    sorted_voters[voter_index]))

                                                                                                                                    if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                                                                                                                    leading_candidates

                                                                                                                                    if randomrandom() lt selfelec

                                                                                                                                    tactical_vote_percentages[_candidate[selfelec

                                                                                                                                    CANDIDATE_INDEX]]

                                                                                                                                    selfrankings_changed[voter_index] = copy

                                                                                                                                    deepcopy(selfelecsorted_voters[voter_index])

                                                                                                                                    selfrankings_changed[voter_index][-(index + 1)]

                                                                                                                                    selfrankings_changed[voter_index][-1] = self

                                                                                                                                    rankings_changed[voter_index][-1] self

                                                                                                                                    rankings_changed[voter_index][-(index + 1)]

                                                                                                                                    selfcandidates[candidate] -= 1

                                                                                                                                    selfcandidates[_candidate[selfelec

                                                                                                                                    CANDIDATE_INDEX]] += 1

                                                                                                                                    selfvotes[candidate]remove(voter_index)

                                                                                                                                    selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                                                                                                                    ]]add(voter_index)

                                                                                                                                    break

                                                                                                                                    break

                                                                                                                                    72

                                                                                                                                    APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                                                                                                                    Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                                                                                                                    half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                                                                                                                    for candidate in selfelecleading_candidates

                                                                                                                                    if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                                                                                                                    continue

                                                                                                                                    for voter_index in selfvotes_copy[candidate]

                                                                                                                                    if voter_index in selfrankings_changed

                                                                                                                                    ranking = selfrankings_changed[voter_index]

                                                                                                                                    else

                                                                                                                                    ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                                                                                                                    ])

                                                                                                                                    for index _candidate in enumerate(reversed(ranking))

                                                                                                                                    if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                                    leading_candidates or (_candidate[selfelec

                                                                                                                                    CANDIDATE_INDEX] in selfelecleading_candidates and

                                                                                                                                    selfelecleading_candidatesindex(_candidate[selfelec

                                                                                                                                    CANDIDATE_INDEX]) gt= half_vacancies)

                                                                                                                                    if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                                                                                                                    if randomrandom() lt selfelec

                                                                                                                                    minority_vote_percentages[_candidate[selfelec

                                                                                                                                    CANDIDATE_INDEX]]

                                                                                                                                    selfcandidates[candidate] -= 1

                                                                                                                                    selfcandidates[_candidate[selfelec

                                                                                                                                    CANDIDATE_INDEX]] += 1

                                                                                                                                    break

                                                                                                                                    break

                                                                                                                                    break

                                                                                                                                    73

                                                                                                                                    APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                                                                                                                    Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                                                                                                                    self_account_for_coalitions()

                                                                                                                                    for candidate in selfvotes

                                                                                                                                    if candidate = selfwinner and candidate = selfsecond_place

                                                                                                                                    for voter_index in selfvotes[candidate]

                                                                                                                                    if voter_index in selfrankings_changed

                                                                                                                                    ranking = selfrankings_changed[voter_index]

                                                                                                                                    else

                                                                                                                                    ranking = copydeepcopy(selfelecsorted_voters[

                                                                                                                                    voter_index])

                                                                                                                                    for index2 candidate in enumerate(reversed(ranking))

                                                                                                                                    if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                                                                                                                    selfcandidates[selfwinner] += 1

                                                                                                                                    selfvotes[selfwinner]add(voter_index)

                                                                                                                                    break

                                                                                                                                    elif candidate[selfelecCANDIDATE_INDEX] == self

                                                                                                                                    second_place

                                                                                                                                    selfcandidates[selfsecond_place] += 1

                                                                                                                                    selfvotes[selfsecond_place]add(voter_index)

                                                                                                                                    break

                                                                                                                                    selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                                                    winners = []

                                                                                                                                    vacancies = selfelecN_VACANCIES

                                                                                                                                    for candidate in reversed(selfsorted_candidates)

                                                                                                                                    if vacancies == 0

                                                                                                                                    break

                                                                                                                                    winnersappend(candidate[0])

                                                                                                                                    vacancies -= 1

                                                                                                                                    mean chose_best = selfelecget_mean(winners = winners)

                                                                                                                                    74

                                                                                                                                    APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                                                                                                                    Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                                                                                                                    for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                    voter_dict = dict()

                                                                                                                                    og_voter_dict = dict()

                                                                                                                                    for tup in voter

                                                                                                                                    voter_dict[tup[0]] = tup[1]

                                                                                                                                    og_voter_dict[tup[0]] = tup[1]

                                                                                                                                    for coalition in selfeleccoalitions

                                                                                                                                    for candidate in coalition

                                                                                                                                    add_to_score = 0

                                                                                                                                    for candidate2 in coalition

                                                                                                                                    if candidate == candidate2

                                                                                                                                    continue

                                                                                                                                    half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                                                                                                                    if half lt 0

                                                                                                                                    add_to_score += mathceil(half)

                                                                                                                                    else

                                                                                                                                    add_to_score += mathfloor(half)

                                                                                                                                    if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                                                                                                                    voter_dict[candidate[rsquovaluersquo]] = 10

                                                                                                                                    elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                                                                                                                    voter_dict[candidate[rsquovaluersquo]] = -10

                                                                                                                                    else

                                                                                                                                    voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                                                                                                                    selfrankings_changed[voter_index] = []

                                                                                                                                    for candidate in voter_dict

                                                                                                                                    selfrankings_changed[voter_index]append((candidate voter_dict[

                                                                                                                                    candidate]))

                                                                                                                                    selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                                                                                                                    voter_index] key=lambda x x[1])

                                                                                                                                    75

                                                                                                                                    APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                                                                                                    Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                                                                                                    selfelecroundsappend(selfsorted_candidates[_round])

                                                                                                                                    if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                                                    N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                                                                                                    N_VACANCIES - 1)

                                                                                                                                    return 2

                                                                                                                                    elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                                                    N_VOTERS gt 05)

                                                                                                                                    return 1

                                                                                                                                    else

                                                                                                                                    selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                                                                                                    CANDIDATE_INDEX])

                                                                                                                                    for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                                                                                                    elecCANDIDATE_INDEX]]

                                                                                                                                    if voter_index in selfrankings_changed

                                                                                                                                    for candidate in reversed(selfrankings_changed[voter_index

                                                                                                                                    ])

                                                                                                                                    if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                                    excluded

                                                                                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                                                    ]] += 1

                                                                                                                                    selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                                                    add(voter_index)

                                                                                                                                    break

                                                                                                                                    else

                                                                                                                                    continue

                                                                                                                                    else

                                                                                                                                    for candidate in reversed(selfelecsorted_voters[

                                                                                                                                    voter_index])

                                                                                                                                    if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                                    excluded

                                                                                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                                                    ]] += 1

                                                                                                                                    selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                                                    add(voter_index)

                                                                                                                                    break

                                                                                                                                    else

                                                                                                                                    continue

                                                                                                                                    selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                                                    return 0

                                                                                                                                    76

                                                                                                                                    APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                                                                                                    Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                                                                                                    for index in range(selfelecN_CANDIDATES)

                                                                                                                                    selfcandidates[index] = 0

                                                                                                                                    for voter in selfelecsorted_voters

                                                                                                                                    for candidate in reversed(voter)

                                                                                                                                    if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                    else

                                                                                                                                    break

                                                                                                                                    APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                                                                                                    Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                                                                                                    for index in range(selfelecN_CANDIDATES)

                                                                                                                                    selfcandidates[index] = 0

                                                                                                                                    for voter in selfelecsorted_voters

                                                                                                                                    if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                                                    elecCANDIDATE_INDEX]]

                                                                                                                                    selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                    else

                                                                                                                                    for candidate in reversed(voter)

                                                                                                                                    if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                    else

                                                                                                                                    break

                                                                                                                                    77

                                                                                                                                    APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                                                                                                    Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                                                                                                    pos = set()

                                                                                                                                    for index perc in enumerate(selfelectactical_vote_percentages)

                                                                                                                                    if perc gt 0

                                                                                                                                    posadd(index)

                                                                                                                                    for candidate in selfeleccandidates

                                                                                                                                    if candidate not in selfleading_candidates

                                                                                                                                    for voter_index in selfvotes[candidate]

                                                                                                                                    raised = None

                                                                                                                                    for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                                                                                                    ])

                                                                                                                                    if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                                                                                                    leading_candidates

                                                                                                                                    if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                                                                                                    if randomrandom() lt selfelectactical_vote_percentages[

                                                                                                                                    candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                                                                                                    ranking = [None]selfelecN_CANDIDATES

                                                                                                                                    ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                    selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                                    CANDIDATE_INDEX]])

                                                                                                                                    raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                    break

                                                                                                                                    break

                                                                                                                                    break

                                                                                                                                    if raised = None

                                                                                                                                    for _candidate in selfleading_candidates

                                                                                                                                    if _candidate = ranking[-1][0]

                                                                                                                                    ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                                                    _candidate])

                                                                                                                                    buried = _candidate

                                                                                                                                    break

                                                                                                                                    i = 1

                                                                                                                                    for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                                                    if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                                                                                                    buried]

                                                                                                                                    continue

                                                                                                                                    else

                                                                                                                                    ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                    selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                                    CANDIDATE_INDEX]])

                                                                                                                                    i += 1

                                                                                                                                    selfrankings_changed[voter_index] = ranking

                                                                                                                                    78

                                                                                                                                    APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                                                                                                    Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                                                                                                    for voter_index in selfvotes[candidate]

                                                                                                                                    if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                                                                                                    ]

                                                                                                                                    for _candidate in selfleading_candidates

                                                                                                                                    if _candidate = candidate

                                                                                                                                    ranking = [None]selfelecN_CANDIDATES

                                                                                                                                    ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                                                    _candidate])

                                                                                                                                    buried = _candidate

                                                                                                                                    break

                                                                                                                                    i = 1

                                                                                                                                    for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                                                    if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                                                                                                    continue

                                                                                                                                    else

                                                                                                                                    ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                    selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                                    CANDIDATE_INDEX]])

                                                                                                                                    i += 1

                                                                                                                                    selfrankings_changed[voter_index] = ranking

                                                                                                                                    79

                                                                                                                                    APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                                                                                                    Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                                                                                                    for index in range(selfelecN_CANDIDATES)

                                                                                                                                    selfcandidates[index] = 0

                                                                                                                                    for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                    score = 0

                                                                                                                                    if voter_index in selfrankings_changed

                                                                                                                                    for candidate in selfrankings_changed[voter_index]

                                                                                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                                                    score += 1

                                                                                                                                    else

                                                                                                                                    for candidate in voter

                                                                                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                                                    score += 1

                                                                                                                                    APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                                                                                                    Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                                                                                                    for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                    if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                                                    elecCANDIDATE_INDEX]]

                                                                                                                                    selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                                                                                                    sorted_voters[voter_index])

                                                                                                                                    for candidate_index candidate in enumerate(reversed(voter))

                                                                                                                                    if candidate_index == 0

                                                                                                                                    selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                                                    voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                                                                                                    else

                                                                                                                                    selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                                                    voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                                                                                                    80

                                                                                                                                    APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                                                                                                    Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                                                                                                    for index in range(selfelecN_CANDIDATES)

                                                                                                                                    selfcandidates[index] = 0

                                                                                                                                    for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                    if voter_index in selfrankings_changed

                                                                                                                                    for candidate in selfrankings_changed[voter_index]

                                                                                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                                                    selfelecCANDIDATE_RANK]

                                                                                                                                    else

                                                                                                                                    for candidate in voter

                                                                                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                                                    selfelecCANDIDATE_RANK]

                                                                                                                                    APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                                                                                                    Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                                                                                                    for index in range(selfelecN_CANDIDATES)

                                                                                                                                    selfcandidates[index] = 0

                                                                                                                                    for voter in selfelecsorted_voters

                                                                                                                                    votes = selfelecN_VACANCIES

                                                                                                                                    for candidate in reversed(voter)

                                                                                                                                    if votes == 0

                                                                                                                                    break

                                                                                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                    votes -= 1

                                                                                                                                    • Folha de aprovaccedilatildeo
                                                                                                                                    • Agradecimentos
                                                                                                                                    • Epiacutegrafe
                                                                                                                                    • Resumo
                                                                                                                                    • Abstract
                                                                                                                                    • Lista de ilustraccedilotildees
                                                                                                                                    • Lista de Coacutedigos
                                                                                                                                    • Lista de tabelas
                                                                                                                                    • Lista de abreviaturas e siglas
                                                                                                                                    • Sumaacuterio
                                                                                                                                    • INTRODUCcedilAtildeO
                                                                                                                                      • MOTIVACcedilAtildeO E OBJETIVO
                                                                                                                                      • MEacuteTODO
                                                                                                                                      • ESTRUTURA
                                                                                                                                        • SISTEMAS ELEITORAIS
                                                                                                                                          • FISRT PAST THE POST
                                                                                                                                            • Exemplo
                                                                                                                                            • Vantagens e Desvantagens do FPTP
                                                                                                                                            • Voto Uacutetil no FPTP
                                                                                                                                              • TWO-ROUND SYSTEM
                                                                                                                                                • Exemplo
                                                                                                                                                • Vantagens e Desvantagens do TRS
                                                                                                                                                • Voto Uacutetil no TRS
                                                                                                                                                  • INSTANT-RUNOFF VOTING
                                                                                                                                                    • Exemplo
                                                                                                                                                    • Vantagens e Desvantagens do IRV
                                                                                                                                                    • Voto Uacutetil no IRV
                                                                                                                                                      • APPROVAL VOTING SYSTEM
                                                                                                                                                        • Exemplo
                                                                                                                                                        • Vantagens e Desvantagens do AVS
                                                                                                                                                        • Voto Uacutetil no AVS
                                                                                                                                                          • THE BORDA COUNT
                                                                                                                                                            • Exemplo
                                                                                                                                                            • Vantagens e Desvantagens do BC
                                                                                                                                                            • Voto Uacutetil no BC
                                                                                                                                                              • SCORE VOTING SYSTEM
                                                                                                                                                                • Exemplo
                                                                                                                                                                • Vantagens e Desvantagens do SVS
                                                                                                                                                                • Voto Uacutetil no SVS
                                                                                                                                                                  • BLOC VOTE
                                                                                                                                                                    • Exemplo
                                                                                                                                                                    • Voto Uacutetil no BV
                                                                                                                                                                        • O SIMULADOR
                                                                                                                                                                        • CENAacuteRIOS PERTINENTES
                                                                                                                                                                          • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                                                                                          • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                                                                                          • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                                                                                          • CENAacuteRIO 4 COALIZOtildeES
                                                                                                                                                                          • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                                                                                          • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                                                                                            • COMO FUNCIONA O SIMULADOR
                                                                                                                                                                              • CLASSE Elections
                                                                                                                                                                              • CLASSE FirstPastThePost
                                                                                                                                                                              • CLASSE TwoRoundSystem
                                                                                                                                                                              • CLASSE InstantRunoffVoting
                                                                                                                                                                              • CLASSE ApprovalVoting
                                                                                                                                                                              • CLASSE BordaCount
                                                                                                                                                                              • CLASSE ScoreVoting
                                                                                                                                                                              • CLASSE BlocVote
                                                                                                                                                                              • TECNOLOGIAS UTILIZADAS
                                                                                                                                                                                • CONCLUSAtildeO
                                                                                                                                                                                • Referecircncias
                                                                                                                                                                                • Meacutetodo create_voters
                                                                                                                                                                                • Meacutetodo create_candidates
                                                                                                                                                                                • Meacutetodo calculate_means
                                                                                                                                                                                • Meacutetodo get_mean
                                                                                                                                                                                • Meacutetodo calculate_mean
                                                                                                                                                                                • Meacutetodo set_leading_candidates
                                                                                                                                                                                • Meacutetodo irv_set_leading_candidates
                                                                                                                                                                                • Meacutetodo sort_ranks
                                                                                                                                                                                • Meacutetodo fptp_count_tactical_votes
                                                                                                                                                                                • Meacutetodo fptp_count_minority_votes
                                                                                                                                                                                • Meacutetodo trs_second_round
                                                                                                                                                                                • Meacutetodo trs_account_for_coalitions
                                                                                                                                                                                • Meacutetodo irv_count_votes
                                                                                                                                                                                • Meacutetodo avs_count_votes
                                                                                                                                                                                • Meacutetodo avs_count_votes_with_tactical
                                                                                                                                                                                • Meacutetodo irv_apply_tactical_votes
                                                                                                                                                                                • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                                                                                                • Meacutetodo bc_sum_candidates_scores
                                                                                                                                                                                • Meacutetodo svs_apply_tactical_votes
                                                                                                                                                                                • Meacutetodo svs_sum_candidates_scores
                                                                                                                                                                                • Meacutetodo bv_count_votes

                                                                                                                                      67

                                                                                                                                      APEcircNDICES

                                                                                                                                      APEcircNDICE A ndash MEacuteTODO CREATE_VOTERS

                                                                                                                                      Coacutedigo A1 ndash Meacutetodo create_votersdef create_voters(self)

                                                                                                                                      if(not len(selfvoter_profiles))

                                                                                                                                      for voter in range(selfN_VOTERS)

                                                                                                                                      candidates_rank = dict()

                                                                                                                                      for candidate in reversed(range(selfN_CANDIDATES))

                                                                                                                                      if(selfBIAS_VECTOR[candidate]==4)

                                                                                                                                      candidates_rank[candidate] = self_sortear(selfloved)

                                                                                                                                      elif(selfBIAS_VECTOR[candidate]==3)

                                                                                                                                      candidates_rank[candidate] = self_sortear(selfliked)

                                                                                                                                      elif(selfBIAS_VECTOR[candidate]==2)

                                                                                                                                      candidates_rank[candidate] = self_sortear(selfdisliked)

                                                                                                                                      elif(selfBIAS_VECTOR[candidate]==1)

                                                                                                                                      candidates_rank[candidate] = self_sortear(selfhated)

                                                                                                                                      elif(selfBIAS_VECTOR[candidate]==-1)

                                                                                                                                      candidates_rank[candidate] = self_sortear(selfpolarizer

                                                                                                                                      )

                                                                                                                                      elif(selfBIAS_VECTOR[candidate]==-2)

                                                                                                                                      candidates_rank[candidate] = self_sortear(self

                                                                                                                                      more_polarizer)

                                                                                                                                      else

                                                                                                                                      candidates_rank[candidate] = self_sortear(selfneutral)

                                                                                                                                      selfvotersappend(candidates_rank)

                                                                                                                                      else

                                                                                                                                      ranges = []

                                                                                                                                      ranks = []

                                                                                                                                      for prof in selfvoter_profiles

                                                                                                                                      rangesappend(int(prof[pop_percentage]))

                                                                                                                                      rank =

                                                                                                                                      for index score in enumerate(prof[scores])

                                                                                                                                      rank[index] = score

                                                                                                                                      ranksappend(rank)

                                                                                                                                      for index _range in enumerate(ranges)

                                                                                                                                      for _ in range(int(selfN_VOTERS(_range100)))

                                                                                                                                      selfvotersappend(ranks[index])

                                                                                                                                      68

                                                                                                                                      APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                                                                                                                      Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                                                                                                                      for i in range(selfN_CANDIDATES)

                                                                                                                                      selfcandidates[i] = 0

                                                                                                                                      selfvotes[i] = set()

                                                                                                                                      APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                                                                                                                      Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                                                                                                                      for candidate in range(selfN_CANDIDATES)

                                                                                                                                      rating_sum = 0

                                                                                                                                      for voter in selfvoters

                                                                                                                                      rating_sum += voter[candidate]

                                                                                                                                      selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                                                                                                                      APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                                                                                                                      Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                                                                                                                      if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                                                                                                                      return selfcalculate_mean(winners)

                                                                                                                                      else

                                                                                                                                      chose_best = True if winners[0] == selfbest_candidate else

                                                                                                                                      False

                                                                                                                                      return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                                                                                                                      69

                                                                                                                                      APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                                                                                                                      Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                                                                                                                      rating_sum = 0

                                                                                                                                      for voter in selfvoters

                                                                                                                                      for candidate in winners

                                                                                                                                      rating_sum += voter[candidate]

                                                                                                                                      return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                                                                                                                      APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                                                                                                                      Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                                                                                                                      for i in range(1 selfN_VACANCIES + 2)

                                                                                                                                      selfleading_candidatesappend(selfsorted_candidates[-i][self

                                                                                                                                      CANDIDATE_INDEX])

                                                                                                                                      APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                                                                                                                      Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                                                                                                                      for leader in selfelecrounds[-1]

                                                                                                                                      selfleading_candidatesappend(leader[0])

                                                                                                                                      70

                                                                                                                                      APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                                                                                                                      Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                                                                                                                      self_account_for_coalitions()

                                                                                                                                      for voter in selfvoters

                                                                                                                                      selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                                                                                                                      (1)))

                                                                                                                                      temp = []

                                                                                                                                      for voter in selfsorted_voters

                                                                                                                                      new_dict = defaultdict(list)

                                                                                                                                      for k in voter

                                                                                                                                      new_dict[k[1]]append(k[0])

                                                                                                                                      tempappend(new_dict)

                                                                                                                                      selfsorted_voters = []

                                                                                                                                      for voter_index current_voter in enumerate(temp)

                                                                                                                                      new_voter = []

                                                                                                                                      for rating candidate_indexes in current_voteritems()

                                                                                                                                      if len(current_voter[rating]) gt 1

                                                                                                                                      shuffle(current_voter[rating])

                                                                                                                                      for e in candidate_indexes

                                                                                                                                      new_voterappend((e rating))

                                                                                                                                      else

                                                                                                                                      new_voterappend((candidate_indexes[0] rating))

                                                                                                                                      selfsorted_votersappend(new_voter)

                                                                                                                                      selfcandidates[new_voter[-1][0]] += 1

                                                                                                                                      selfvotes[new_voter[-1][0]]add(voter_index)

                                                                                                                                      71

                                                                                                                                      APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                                                                                                                      Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                                                                                                                      for candidate in selfvotes_copy

                                                                                                                                      if candidate not in selfelecleading_candidates

                                                                                                                                      for voter_index in selfvotes_copy[candidate]

                                                                                                                                      for index _candidate in enumerate(reversed(selfelec

                                                                                                                                      sorted_voters[voter_index]))

                                                                                                                                      if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                                                                                                                      leading_candidates

                                                                                                                                      if randomrandom() lt selfelec

                                                                                                                                      tactical_vote_percentages[_candidate[selfelec

                                                                                                                                      CANDIDATE_INDEX]]

                                                                                                                                      selfrankings_changed[voter_index] = copy

                                                                                                                                      deepcopy(selfelecsorted_voters[voter_index])

                                                                                                                                      selfrankings_changed[voter_index][-(index + 1)]

                                                                                                                                      selfrankings_changed[voter_index][-1] = self

                                                                                                                                      rankings_changed[voter_index][-1] self

                                                                                                                                      rankings_changed[voter_index][-(index + 1)]

                                                                                                                                      selfcandidates[candidate] -= 1

                                                                                                                                      selfcandidates[_candidate[selfelec

                                                                                                                                      CANDIDATE_INDEX]] += 1

                                                                                                                                      selfvotes[candidate]remove(voter_index)

                                                                                                                                      selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                                                                                                                      ]]add(voter_index)

                                                                                                                                      break

                                                                                                                                      break

                                                                                                                                      72

                                                                                                                                      APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                                                                                                                      Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                                                                                                                      half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                                                                                                                      for candidate in selfelecleading_candidates

                                                                                                                                      if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                                                                                                                      continue

                                                                                                                                      for voter_index in selfvotes_copy[candidate]

                                                                                                                                      if voter_index in selfrankings_changed

                                                                                                                                      ranking = selfrankings_changed[voter_index]

                                                                                                                                      else

                                                                                                                                      ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                                                                                                                      ])

                                                                                                                                      for index _candidate in enumerate(reversed(ranking))

                                                                                                                                      if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                                      leading_candidates or (_candidate[selfelec

                                                                                                                                      CANDIDATE_INDEX] in selfelecleading_candidates and

                                                                                                                                      selfelecleading_candidatesindex(_candidate[selfelec

                                                                                                                                      CANDIDATE_INDEX]) gt= half_vacancies)

                                                                                                                                      if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                                                                                                                      if randomrandom() lt selfelec

                                                                                                                                      minority_vote_percentages[_candidate[selfelec

                                                                                                                                      CANDIDATE_INDEX]]

                                                                                                                                      selfcandidates[candidate] -= 1

                                                                                                                                      selfcandidates[_candidate[selfelec

                                                                                                                                      CANDIDATE_INDEX]] += 1

                                                                                                                                      break

                                                                                                                                      break

                                                                                                                                      break

                                                                                                                                      73

                                                                                                                                      APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                                                                                                                      Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                                                                                                                      self_account_for_coalitions()

                                                                                                                                      for candidate in selfvotes

                                                                                                                                      if candidate = selfwinner and candidate = selfsecond_place

                                                                                                                                      for voter_index in selfvotes[candidate]

                                                                                                                                      if voter_index in selfrankings_changed

                                                                                                                                      ranking = selfrankings_changed[voter_index]

                                                                                                                                      else

                                                                                                                                      ranking = copydeepcopy(selfelecsorted_voters[

                                                                                                                                      voter_index])

                                                                                                                                      for index2 candidate in enumerate(reversed(ranking))

                                                                                                                                      if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                                                                                                                      selfcandidates[selfwinner] += 1

                                                                                                                                      selfvotes[selfwinner]add(voter_index)

                                                                                                                                      break

                                                                                                                                      elif candidate[selfelecCANDIDATE_INDEX] == self

                                                                                                                                      second_place

                                                                                                                                      selfcandidates[selfsecond_place] += 1

                                                                                                                                      selfvotes[selfsecond_place]add(voter_index)

                                                                                                                                      break

                                                                                                                                      selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                                                      winners = []

                                                                                                                                      vacancies = selfelecN_VACANCIES

                                                                                                                                      for candidate in reversed(selfsorted_candidates)

                                                                                                                                      if vacancies == 0

                                                                                                                                      break

                                                                                                                                      winnersappend(candidate[0])

                                                                                                                                      vacancies -= 1

                                                                                                                                      mean chose_best = selfelecget_mean(winners = winners)

                                                                                                                                      74

                                                                                                                                      APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                                                                                                                      Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                                                                                                                      for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                      voter_dict = dict()

                                                                                                                                      og_voter_dict = dict()

                                                                                                                                      for tup in voter

                                                                                                                                      voter_dict[tup[0]] = tup[1]

                                                                                                                                      og_voter_dict[tup[0]] = tup[1]

                                                                                                                                      for coalition in selfeleccoalitions

                                                                                                                                      for candidate in coalition

                                                                                                                                      add_to_score = 0

                                                                                                                                      for candidate2 in coalition

                                                                                                                                      if candidate == candidate2

                                                                                                                                      continue

                                                                                                                                      half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                                                                                                                      if half lt 0

                                                                                                                                      add_to_score += mathceil(half)

                                                                                                                                      else

                                                                                                                                      add_to_score += mathfloor(half)

                                                                                                                                      if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                                                                                                                      voter_dict[candidate[rsquovaluersquo]] = 10

                                                                                                                                      elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                                                                                                                      voter_dict[candidate[rsquovaluersquo]] = -10

                                                                                                                                      else

                                                                                                                                      voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                                                                                                                      selfrankings_changed[voter_index] = []

                                                                                                                                      for candidate in voter_dict

                                                                                                                                      selfrankings_changed[voter_index]append((candidate voter_dict[

                                                                                                                                      candidate]))

                                                                                                                                      selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                                                                                                                      voter_index] key=lambda x x[1])

                                                                                                                                      75

                                                                                                                                      APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                                                                                                      Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                                                                                                      selfelecroundsappend(selfsorted_candidates[_round])

                                                                                                                                      if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                                                      N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                                                                                                      N_VACANCIES - 1)

                                                                                                                                      return 2

                                                                                                                                      elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                                                      N_VOTERS gt 05)

                                                                                                                                      return 1

                                                                                                                                      else

                                                                                                                                      selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                                                                                                      CANDIDATE_INDEX])

                                                                                                                                      for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                                                                                                      elecCANDIDATE_INDEX]]

                                                                                                                                      if voter_index in selfrankings_changed

                                                                                                                                      for candidate in reversed(selfrankings_changed[voter_index

                                                                                                                                      ])

                                                                                                                                      if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                                      excluded

                                                                                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                                                      ]] += 1

                                                                                                                                      selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                                                      add(voter_index)

                                                                                                                                      break

                                                                                                                                      else

                                                                                                                                      continue

                                                                                                                                      else

                                                                                                                                      for candidate in reversed(selfelecsorted_voters[

                                                                                                                                      voter_index])

                                                                                                                                      if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                                      excluded

                                                                                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                                                      ]] += 1

                                                                                                                                      selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                                                      add(voter_index)

                                                                                                                                      break

                                                                                                                                      else

                                                                                                                                      continue

                                                                                                                                      selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                                                      return 0

                                                                                                                                      76

                                                                                                                                      APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                                                                                                      Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                                                                                                      for index in range(selfelecN_CANDIDATES)

                                                                                                                                      selfcandidates[index] = 0

                                                                                                                                      for voter in selfelecsorted_voters

                                                                                                                                      for candidate in reversed(voter)

                                                                                                                                      if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                      else

                                                                                                                                      break

                                                                                                                                      APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                                                                                                      Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                                                                                                      for index in range(selfelecN_CANDIDATES)

                                                                                                                                      selfcandidates[index] = 0

                                                                                                                                      for voter in selfelecsorted_voters

                                                                                                                                      if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                                                      elecCANDIDATE_INDEX]]

                                                                                                                                      selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                      else

                                                                                                                                      for candidate in reversed(voter)

                                                                                                                                      if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                      else

                                                                                                                                      break

                                                                                                                                      77

                                                                                                                                      APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                                                                                                      Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                                                                                                      pos = set()

                                                                                                                                      for index perc in enumerate(selfelectactical_vote_percentages)

                                                                                                                                      if perc gt 0

                                                                                                                                      posadd(index)

                                                                                                                                      for candidate in selfeleccandidates

                                                                                                                                      if candidate not in selfleading_candidates

                                                                                                                                      for voter_index in selfvotes[candidate]

                                                                                                                                      raised = None

                                                                                                                                      for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                                                                                                      ])

                                                                                                                                      if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                                                                                                      leading_candidates

                                                                                                                                      if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                                                                                                      if randomrandom() lt selfelectactical_vote_percentages[

                                                                                                                                      candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                                                                                                      ranking = [None]selfelecN_CANDIDATES

                                                                                                                                      ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                      selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                                      CANDIDATE_INDEX]])

                                                                                                                                      raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                      break

                                                                                                                                      break

                                                                                                                                      break

                                                                                                                                      if raised = None

                                                                                                                                      for _candidate in selfleading_candidates

                                                                                                                                      if _candidate = ranking[-1][0]

                                                                                                                                      ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                                                      _candidate])

                                                                                                                                      buried = _candidate

                                                                                                                                      break

                                                                                                                                      i = 1

                                                                                                                                      for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                                                      if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                                                                                                      buried]

                                                                                                                                      continue

                                                                                                                                      else

                                                                                                                                      ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                      selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                                      CANDIDATE_INDEX]])

                                                                                                                                      i += 1

                                                                                                                                      selfrankings_changed[voter_index] = ranking

                                                                                                                                      78

                                                                                                                                      APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                                                                                                      Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                                                                                                      for voter_index in selfvotes[candidate]

                                                                                                                                      if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                                                                                                      ]

                                                                                                                                      for _candidate in selfleading_candidates

                                                                                                                                      if _candidate = candidate

                                                                                                                                      ranking = [None]selfelecN_CANDIDATES

                                                                                                                                      ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                                                      _candidate])

                                                                                                                                      buried = _candidate

                                                                                                                                      break

                                                                                                                                      i = 1

                                                                                                                                      for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                                                      if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                                                                                                      continue

                                                                                                                                      else

                                                                                                                                      ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                      selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                                      CANDIDATE_INDEX]])

                                                                                                                                      i += 1

                                                                                                                                      selfrankings_changed[voter_index] = ranking

                                                                                                                                      79

                                                                                                                                      APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                                                                                                      Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                                                                                                      for index in range(selfelecN_CANDIDATES)

                                                                                                                                      selfcandidates[index] = 0

                                                                                                                                      for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                      score = 0

                                                                                                                                      if voter_index in selfrankings_changed

                                                                                                                                      for candidate in selfrankings_changed[voter_index]

                                                                                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                                                      score += 1

                                                                                                                                      else

                                                                                                                                      for candidate in voter

                                                                                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                                                      score += 1

                                                                                                                                      APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                                                                                                      Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                                                                                                      for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                      if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                                                      elecCANDIDATE_INDEX]]

                                                                                                                                      selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                                                                                                      sorted_voters[voter_index])

                                                                                                                                      for candidate_index candidate in enumerate(reversed(voter))

                                                                                                                                      if candidate_index == 0

                                                                                                                                      selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                                                      voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                                                                                                      else

                                                                                                                                      selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                                                      voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                                                                                                      80

                                                                                                                                      APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                                                                                                      Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                                                                                                      for index in range(selfelecN_CANDIDATES)

                                                                                                                                      selfcandidates[index] = 0

                                                                                                                                      for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                      if voter_index in selfrankings_changed

                                                                                                                                      for candidate in selfrankings_changed[voter_index]

                                                                                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                                                      selfelecCANDIDATE_RANK]

                                                                                                                                      else

                                                                                                                                      for candidate in voter

                                                                                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                                                      selfelecCANDIDATE_RANK]

                                                                                                                                      APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                                                                                                      Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                                                                                                      for index in range(selfelecN_CANDIDATES)

                                                                                                                                      selfcandidates[index] = 0

                                                                                                                                      for voter in selfelecsorted_voters

                                                                                                                                      votes = selfelecN_VACANCIES

                                                                                                                                      for candidate in reversed(voter)

                                                                                                                                      if votes == 0

                                                                                                                                      break

                                                                                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                      votes -= 1

                                                                                                                                      • Folha de aprovaccedilatildeo
                                                                                                                                      • Agradecimentos
                                                                                                                                      • Epiacutegrafe
                                                                                                                                      • Resumo
                                                                                                                                      • Abstract
                                                                                                                                      • Lista de ilustraccedilotildees
                                                                                                                                      • Lista de Coacutedigos
                                                                                                                                      • Lista de tabelas
                                                                                                                                      • Lista de abreviaturas e siglas
                                                                                                                                      • Sumaacuterio
                                                                                                                                      • INTRODUCcedilAtildeO
                                                                                                                                        • MOTIVACcedilAtildeO E OBJETIVO
                                                                                                                                        • MEacuteTODO
                                                                                                                                        • ESTRUTURA
                                                                                                                                          • SISTEMAS ELEITORAIS
                                                                                                                                            • FISRT PAST THE POST
                                                                                                                                              • Exemplo
                                                                                                                                              • Vantagens e Desvantagens do FPTP
                                                                                                                                              • Voto Uacutetil no FPTP
                                                                                                                                                • TWO-ROUND SYSTEM
                                                                                                                                                  • Exemplo
                                                                                                                                                  • Vantagens e Desvantagens do TRS
                                                                                                                                                  • Voto Uacutetil no TRS
                                                                                                                                                    • INSTANT-RUNOFF VOTING
                                                                                                                                                      • Exemplo
                                                                                                                                                      • Vantagens e Desvantagens do IRV
                                                                                                                                                      • Voto Uacutetil no IRV
                                                                                                                                                        • APPROVAL VOTING SYSTEM
                                                                                                                                                          • Exemplo
                                                                                                                                                          • Vantagens e Desvantagens do AVS
                                                                                                                                                          • Voto Uacutetil no AVS
                                                                                                                                                            • THE BORDA COUNT
                                                                                                                                                              • Exemplo
                                                                                                                                                              • Vantagens e Desvantagens do BC
                                                                                                                                                              • Voto Uacutetil no BC
                                                                                                                                                                • SCORE VOTING SYSTEM
                                                                                                                                                                  • Exemplo
                                                                                                                                                                  • Vantagens e Desvantagens do SVS
                                                                                                                                                                  • Voto Uacutetil no SVS
                                                                                                                                                                    • BLOC VOTE
                                                                                                                                                                      • Exemplo
                                                                                                                                                                      • Voto Uacutetil no BV
                                                                                                                                                                          • O SIMULADOR
                                                                                                                                                                          • CENAacuteRIOS PERTINENTES
                                                                                                                                                                            • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                                                                                            • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                                                                                            • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                                                                                            • CENAacuteRIO 4 COALIZOtildeES
                                                                                                                                                                            • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                                                                                            • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                                                                                              • COMO FUNCIONA O SIMULADOR
                                                                                                                                                                                • CLASSE Elections
                                                                                                                                                                                • CLASSE FirstPastThePost
                                                                                                                                                                                • CLASSE TwoRoundSystem
                                                                                                                                                                                • CLASSE InstantRunoffVoting
                                                                                                                                                                                • CLASSE ApprovalVoting
                                                                                                                                                                                • CLASSE BordaCount
                                                                                                                                                                                • CLASSE ScoreVoting
                                                                                                                                                                                • CLASSE BlocVote
                                                                                                                                                                                • TECNOLOGIAS UTILIZADAS
                                                                                                                                                                                  • CONCLUSAtildeO
                                                                                                                                                                                  • Referecircncias
                                                                                                                                                                                  • Meacutetodo create_voters
                                                                                                                                                                                  • Meacutetodo create_candidates
                                                                                                                                                                                  • Meacutetodo calculate_means
                                                                                                                                                                                  • Meacutetodo get_mean
                                                                                                                                                                                  • Meacutetodo calculate_mean
                                                                                                                                                                                  • Meacutetodo set_leading_candidates
                                                                                                                                                                                  • Meacutetodo irv_set_leading_candidates
                                                                                                                                                                                  • Meacutetodo sort_ranks
                                                                                                                                                                                  • Meacutetodo fptp_count_tactical_votes
                                                                                                                                                                                  • Meacutetodo fptp_count_minority_votes
                                                                                                                                                                                  • Meacutetodo trs_second_round
                                                                                                                                                                                  • Meacutetodo trs_account_for_coalitions
                                                                                                                                                                                  • Meacutetodo irv_count_votes
                                                                                                                                                                                  • Meacutetodo avs_count_votes
                                                                                                                                                                                  • Meacutetodo avs_count_votes_with_tactical
                                                                                                                                                                                  • Meacutetodo irv_apply_tactical_votes
                                                                                                                                                                                  • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                                                                                                  • Meacutetodo bc_sum_candidates_scores
                                                                                                                                                                                  • Meacutetodo svs_apply_tactical_votes
                                                                                                                                                                                  • Meacutetodo svs_sum_candidates_scores
                                                                                                                                                                                  • Meacutetodo bv_count_votes

                                                                                                                                        68

                                                                                                                                        APEcircNDICE B ndash MEacuteTODO CREATE_CANDIDATES

                                                                                                                                        Coacutedigo B1 ndash Meacutetodo create_candidatesdef create_candidates(self)

                                                                                                                                        for i in range(selfN_CANDIDATES)

                                                                                                                                        selfcandidates[i] = 0

                                                                                                                                        selfvotes[i] = set()

                                                                                                                                        APEcircNDICE C ndash MEacuteTODO CALCULATE_MEANS

                                                                                                                                        Coacutedigo C1 ndash Meacutetodo calculate_meansdef calculate_means(self)

                                                                                                                                        for candidate in range(selfN_CANDIDATES)

                                                                                                                                        rating_sum = 0

                                                                                                                                        for voter in selfvoters

                                                                                                                                        rating_sum += voter[candidate]

                                                                                                                                        selfstats[rsquomeansrsquo][candidate] = rating_sumselfN_VOTERS

                                                                                                                                        APEcircNDICE D ndash MEacuteTODO GET_MEAN

                                                                                                                                        Coacutedigo D1 ndash Meacutetodo get_meandef get_mean(self winners)

                                                                                                                                        if len(winners) gt 1 or selfN_CANDIDATES gt 10

                                                                                                                                        return selfcalculate_mean(winners)

                                                                                                                                        else

                                                                                                                                        chose_best = True if winners[0] == selfbest_candidate else

                                                                                                                                        False

                                                                                                                                        return selfstats[rsquomeansrsquo][winners[0]] chose_best

                                                                                                                                        69

                                                                                                                                        APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                                                                                                                        Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                                                                                                                        rating_sum = 0

                                                                                                                                        for voter in selfvoters

                                                                                                                                        for candidate in winners

                                                                                                                                        rating_sum += voter[candidate]

                                                                                                                                        return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                                                                                                                        APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                                                                                                                        Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                                                                                                                        for i in range(1 selfN_VACANCIES + 2)

                                                                                                                                        selfleading_candidatesappend(selfsorted_candidates[-i][self

                                                                                                                                        CANDIDATE_INDEX])

                                                                                                                                        APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                                                                                                                        Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                                                                                                                        for leader in selfelecrounds[-1]

                                                                                                                                        selfleading_candidatesappend(leader[0])

                                                                                                                                        70

                                                                                                                                        APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                                                                                                                        Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                                                                                                                        self_account_for_coalitions()

                                                                                                                                        for voter in selfvoters

                                                                                                                                        selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                                                                                                                        (1)))

                                                                                                                                        temp = []

                                                                                                                                        for voter in selfsorted_voters

                                                                                                                                        new_dict = defaultdict(list)

                                                                                                                                        for k in voter

                                                                                                                                        new_dict[k[1]]append(k[0])

                                                                                                                                        tempappend(new_dict)

                                                                                                                                        selfsorted_voters = []

                                                                                                                                        for voter_index current_voter in enumerate(temp)

                                                                                                                                        new_voter = []

                                                                                                                                        for rating candidate_indexes in current_voteritems()

                                                                                                                                        if len(current_voter[rating]) gt 1

                                                                                                                                        shuffle(current_voter[rating])

                                                                                                                                        for e in candidate_indexes

                                                                                                                                        new_voterappend((e rating))

                                                                                                                                        else

                                                                                                                                        new_voterappend((candidate_indexes[0] rating))

                                                                                                                                        selfsorted_votersappend(new_voter)

                                                                                                                                        selfcandidates[new_voter[-1][0]] += 1

                                                                                                                                        selfvotes[new_voter[-1][0]]add(voter_index)

                                                                                                                                        71

                                                                                                                                        APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                                                                                                                        Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                                                                                                                        for candidate in selfvotes_copy

                                                                                                                                        if candidate not in selfelecleading_candidates

                                                                                                                                        for voter_index in selfvotes_copy[candidate]

                                                                                                                                        for index _candidate in enumerate(reversed(selfelec

                                                                                                                                        sorted_voters[voter_index]))

                                                                                                                                        if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                                                                                                                        leading_candidates

                                                                                                                                        if randomrandom() lt selfelec

                                                                                                                                        tactical_vote_percentages[_candidate[selfelec

                                                                                                                                        CANDIDATE_INDEX]]

                                                                                                                                        selfrankings_changed[voter_index] = copy

                                                                                                                                        deepcopy(selfelecsorted_voters[voter_index])

                                                                                                                                        selfrankings_changed[voter_index][-(index + 1)]

                                                                                                                                        selfrankings_changed[voter_index][-1] = self

                                                                                                                                        rankings_changed[voter_index][-1] self

                                                                                                                                        rankings_changed[voter_index][-(index + 1)]

                                                                                                                                        selfcandidates[candidate] -= 1

                                                                                                                                        selfcandidates[_candidate[selfelec

                                                                                                                                        CANDIDATE_INDEX]] += 1

                                                                                                                                        selfvotes[candidate]remove(voter_index)

                                                                                                                                        selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                                                                                                                        ]]add(voter_index)

                                                                                                                                        break

                                                                                                                                        break

                                                                                                                                        72

                                                                                                                                        APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                                                                                                                        Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                                                                                                                        half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                                                                                                                        for candidate in selfelecleading_candidates

                                                                                                                                        if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                                                                                                                        continue

                                                                                                                                        for voter_index in selfvotes_copy[candidate]

                                                                                                                                        if voter_index in selfrankings_changed

                                                                                                                                        ranking = selfrankings_changed[voter_index]

                                                                                                                                        else

                                                                                                                                        ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                                                                                                                        ])

                                                                                                                                        for index _candidate in enumerate(reversed(ranking))

                                                                                                                                        if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                                        leading_candidates or (_candidate[selfelec

                                                                                                                                        CANDIDATE_INDEX] in selfelecleading_candidates and

                                                                                                                                        selfelecleading_candidatesindex(_candidate[selfelec

                                                                                                                                        CANDIDATE_INDEX]) gt= half_vacancies)

                                                                                                                                        if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                                                                                                                        if randomrandom() lt selfelec

                                                                                                                                        minority_vote_percentages[_candidate[selfelec

                                                                                                                                        CANDIDATE_INDEX]]

                                                                                                                                        selfcandidates[candidate] -= 1

                                                                                                                                        selfcandidates[_candidate[selfelec

                                                                                                                                        CANDIDATE_INDEX]] += 1

                                                                                                                                        break

                                                                                                                                        break

                                                                                                                                        break

                                                                                                                                        73

                                                                                                                                        APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                                                                                                                        Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                                                                                                                        self_account_for_coalitions()

                                                                                                                                        for candidate in selfvotes

                                                                                                                                        if candidate = selfwinner and candidate = selfsecond_place

                                                                                                                                        for voter_index in selfvotes[candidate]

                                                                                                                                        if voter_index in selfrankings_changed

                                                                                                                                        ranking = selfrankings_changed[voter_index]

                                                                                                                                        else

                                                                                                                                        ranking = copydeepcopy(selfelecsorted_voters[

                                                                                                                                        voter_index])

                                                                                                                                        for index2 candidate in enumerate(reversed(ranking))

                                                                                                                                        if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                                                                                                                        selfcandidates[selfwinner] += 1

                                                                                                                                        selfvotes[selfwinner]add(voter_index)

                                                                                                                                        break

                                                                                                                                        elif candidate[selfelecCANDIDATE_INDEX] == self

                                                                                                                                        second_place

                                                                                                                                        selfcandidates[selfsecond_place] += 1

                                                                                                                                        selfvotes[selfsecond_place]add(voter_index)

                                                                                                                                        break

                                                                                                                                        selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                                                        winners = []

                                                                                                                                        vacancies = selfelecN_VACANCIES

                                                                                                                                        for candidate in reversed(selfsorted_candidates)

                                                                                                                                        if vacancies == 0

                                                                                                                                        break

                                                                                                                                        winnersappend(candidate[0])

                                                                                                                                        vacancies -= 1

                                                                                                                                        mean chose_best = selfelecget_mean(winners = winners)

                                                                                                                                        74

                                                                                                                                        APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                                                                                                                        Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                                                                                                                        for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                        voter_dict = dict()

                                                                                                                                        og_voter_dict = dict()

                                                                                                                                        for tup in voter

                                                                                                                                        voter_dict[tup[0]] = tup[1]

                                                                                                                                        og_voter_dict[tup[0]] = tup[1]

                                                                                                                                        for coalition in selfeleccoalitions

                                                                                                                                        for candidate in coalition

                                                                                                                                        add_to_score = 0

                                                                                                                                        for candidate2 in coalition

                                                                                                                                        if candidate == candidate2

                                                                                                                                        continue

                                                                                                                                        half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                                                                                                                        if half lt 0

                                                                                                                                        add_to_score += mathceil(half)

                                                                                                                                        else

                                                                                                                                        add_to_score += mathfloor(half)

                                                                                                                                        if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                                                                                                                        voter_dict[candidate[rsquovaluersquo]] = 10

                                                                                                                                        elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                                                                                                                        voter_dict[candidate[rsquovaluersquo]] = -10

                                                                                                                                        else

                                                                                                                                        voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                                                                                                                        selfrankings_changed[voter_index] = []

                                                                                                                                        for candidate in voter_dict

                                                                                                                                        selfrankings_changed[voter_index]append((candidate voter_dict[

                                                                                                                                        candidate]))

                                                                                                                                        selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                                                                                                                        voter_index] key=lambda x x[1])

                                                                                                                                        75

                                                                                                                                        APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                                                                                                        Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                                                                                                        selfelecroundsappend(selfsorted_candidates[_round])

                                                                                                                                        if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                                                        N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                                                                                                        N_VACANCIES - 1)

                                                                                                                                        return 2

                                                                                                                                        elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                                                        N_VOTERS gt 05)

                                                                                                                                        return 1

                                                                                                                                        else

                                                                                                                                        selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                                                                                                        CANDIDATE_INDEX])

                                                                                                                                        for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                                                                                                        elecCANDIDATE_INDEX]]

                                                                                                                                        if voter_index in selfrankings_changed

                                                                                                                                        for candidate in reversed(selfrankings_changed[voter_index

                                                                                                                                        ])

                                                                                                                                        if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                                        excluded

                                                                                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                                                        ]] += 1

                                                                                                                                        selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                                                        add(voter_index)

                                                                                                                                        break

                                                                                                                                        else

                                                                                                                                        continue

                                                                                                                                        else

                                                                                                                                        for candidate in reversed(selfelecsorted_voters[

                                                                                                                                        voter_index])

                                                                                                                                        if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                                        excluded

                                                                                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                                                        ]] += 1

                                                                                                                                        selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                                                        add(voter_index)

                                                                                                                                        break

                                                                                                                                        else

                                                                                                                                        continue

                                                                                                                                        selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                                                        return 0

                                                                                                                                        76

                                                                                                                                        APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                                                                                                        Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                                                                                                        for index in range(selfelecN_CANDIDATES)

                                                                                                                                        selfcandidates[index] = 0

                                                                                                                                        for voter in selfelecsorted_voters

                                                                                                                                        for candidate in reversed(voter)

                                                                                                                                        if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                        else

                                                                                                                                        break

                                                                                                                                        APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                                                                                                        Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                                                                                                        for index in range(selfelecN_CANDIDATES)

                                                                                                                                        selfcandidates[index] = 0

                                                                                                                                        for voter in selfelecsorted_voters

                                                                                                                                        if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                                                        elecCANDIDATE_INDEX]]

                                                                                                                                        selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                        else

                                                                                                                                        for candidate in reversed(voter)

                                                                                                                                        if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                        else

                                                                                                                                        break

                                                                                                                                        77

                                                                                                                                        APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                                                                                                        Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                                                                                                        pos = set()

                                                                                                                                        for index perc in enumerate(selfelectactical_vote_percentages)

                                                                                                                                        if perc gt 0

                                                                                                                                        posadd(index)

                                                                                                                                        for candidate in selfeleccandidates

                                                                                                                                        if candidate not in selfleading_candidates

                                                                                                                                        for voter_index in selfvotes[candidate]

                                                                                                                                        raised = None

                                                                                                                                        for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                                                                                                        ])

                                                                                                                                        if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                                                                                                        leading_candidates

                                                                                                                                        if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                                                                                                        if randomrandom() lt selfelectactical_vote_percentages[

                                                                                                                                        candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                                                                                                        ranking = [None]selfelecN_CANDIDATES

                                                                                                                                        ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                        selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                                        CANDIDATE_INDEX]])

                                                                                                                                        raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                        break

                                                                                                                                        break

                                                                                                                                        break

                                                                                                                                        if raised = None

                                                                                                                                        for _candidate in selfleading_candidates

                                                                                                                                        if _candidate = ranking[-1][0]

                                                                                                                                        ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                                                        _candidate])

                                                                                                                                        buried = _candidate

                                                                                                                                        break

                                                                                                                                        i = 1

                                                                                                                                        for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                                                        if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                                                                                                        buried]

                                                                                                                                        continue

                                                                                                                                        else

                                                                                                                                        ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                        selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                                        CANDIDATE_INDEX]])

                                                                                                                                        i += 1

                                                                                                                                        selfrankings_changed[voter_index] = ranking

                                                                                                                                        78

                                                                                                                                        APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                                                                                                        Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                                                                                                        for voter_index in selfvotes[candidate]

                                                                                                                                        if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                                                                                                        ]

                                                                                                                                        for _candidate in selfleading_candidates

                                                                                                                                        if _candidate = candidate

                                                                                                                                        ranking = [None]selfelecN_CANDIDATES

                                                                                                                                        ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                                                        _candidate])

                                                                                                                                        buried = _candidate

                                                                                                                                        break

                                                                                                                                        i = 1

                                                                                                                                        for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                                                        if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                                                                                                        continue

                                                                                                                                        else

                                                                                                                                        ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                        selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                                        CANDIDATE_INDEX]])

                                                                                                                                        i += 1

                                                                                                                                        selfrankings_changed[voter_index] = ranking

                                                                                                                                        79

                                                                                                                                        APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                                                                                                        Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                                                                                                        for index in range(selfelecN_CANDIDATES)

                                                                                                                                        selfcandidates[index] = 0

                                                                                                                                        for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                        score = 0

                                                                                                                                        if voter_index in selfrankings_changed

                                                                                                                                        for candidate in selfrankings_changed[voter_index]

                                                                                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                                                        score += 1

                                                                                                                                        else

                                                                                                                                        for candidate in voter

                                                                                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                                                        score += 1

                                                                                                                                        APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                                                                                                        Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                                                                                                        for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                        if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                                                        elecCANDIDATE_INDEX]]

                                                                                                                                        selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                                                                                                        sorted_voters[voter_index])

                                                                                                                                        for candidate_index candidate in enumerate(reversed(voter))

                                                                                                                                        if candidate_index == 0

                                                                                                                                        selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                                                        voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                                                                                                        else

                                                                                                                                        selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                                                        voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                                                                                                        80

                                                                                                                                        APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                                                                                                        Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                                                                                                        for index in range(selfelecN_CANDIDATES)

                                                                                                                                        selfcandidates[index] = 0

                                                                                                                                        for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                        if voter_index in selfrankings_changed

                                                                                                                                        for candidate in selfrankings_changed[voter_index]

                                                                                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                                                        selfelecCANDIDATE_RANK]

                                                                                                                                        else

                                                                                                                                        for candidate in voter

                                                                                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                                                        selfelecCANDIDATE_RANK]

                                                                                                                                        APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                                                                                                        Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                                                                                                        for index in range(selfelecN_CANDIDATES)

                                                                                                                                        selfcandidates[index] = 0

                                                                                                                                        for voter in selfelecsorted_voters

                                                                                                                                        votes = selfelecN_VACANCIES

                                                                                                                                        for candidate in reversed(voter)

                                                                                                                                        if votes == 0

                                                                                                                                        break

                                                                                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                        votes -= 1

                                                                                                                                        • Folha de aprovaccedilatildeo
                                                                                                                                        • Agradecimentos
                                                                                                                                        • Epiacutegrafe
                                                                                                                                        • Resumo
                                                                                                                                        • Abstract
                                                                                                                                        • Lista de ilustraccedilotildees
                                                                                                                                        • Lista de Coacutedigos
                                                                                                                                        • Lista de tabelas
                                                                                                                                        • Lista de abreviaturas e siglas
                                                                                                                                        • Sumaacuterio
                                                                                                                                        • INTRODUCcedilAtildeO
                                                                                                                                          • MOTIVACcedilAtildeO E OBJETIVO
                                                                                                                                          • MEacuteTODO
                                                                                                                                          • ESTRUTURA
                                                                                                                                            • SISTEMAS ELEITORAIS
                                                                                                                                              • FISRT PAST THE POST
                                                                                                                                                • Exemplo
                                                                                                                                                • Vantagens e Desvantagens do FPTP
                                                                                                                                                • Voto Uacutetil no FPTP
                                                                                                                                                  • TWO-ROUND SYSTEM
                                                                                                                                                    • Exemplo
                                                                                                                                                    • Vantagens e Desvantagens do TRS
                                                                                                                                                    • Voto Uacutetil no TRS
                                                                                                                                                      • INSTANT-RUNOFF VOTING
                                                                                                                                                        • Exemplo
                                                                                                                                                        • Vantagens e Desvantagens do IRV
                                                                                                                                                        • Voto Uacutetil no IRV
                                                                                                                                                          • APPROVAL VOTING SYSTEM
                                                                                                                                                            • Exemplo
                                                                                                                                                            • Vantagens e Desvantagens do AVS
                                                                                                                                                            • Voto Uacutetil no AVS
                                                                                                                                                              • THE BORDA COUNT
                                                                                                                                                                • Exemplo
                                                                                                                                                                • Vantagens e Desvantagens do BC
                                                                                                                                                                • Voto Uacutetil no BC
                                                                                                                                                                  • SCORE VOTING SYSTEM
                                                                                                                                                                    • Exemplo
                                                                                                                                                                    • Vantagens e Desvantagens do SVS
                                                                                                                                                                    • Voto Uacutetil no SVS
                                                                                                                                                                      • BLOC VOTE
                                                                                                                                                                        • Exemplo
                                                                                                                                                                        • Voto Uacutetil no BV
                                                                                                                                                                            • O SIMULADOR
                                                                                                                                                                            • CENAacuteRIOS PERTINENTES
                                                                                                                                                                              • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                                                                                              • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                                                                                              • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                                                                                              • CENAacuteRIO 4 COALIZOtildeES
                                                                                                                                                                              • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                                                                                              • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                                                                                                • COMO FUNCIONA O SIMULADOR
                                                                                                                                                                                  • CLASSE Elections
                                                                                                                                                                                  • CLASSE FirstPastThePost
                                                                                                                                                                                  • CLASSE TwoRoundSystem
                                                                                                                                                                                  • CLASSE InstantRunoffVoting
                                                                                                                                                                                  • CLASSE ApprovalVoting
                                                                                                                                                                                  • CLASSE BordaCount
                                                                                                                                                                                  • CLASSE ScoreVoting
                                                                                                                                                                                  • CLASSE BlocVote
                                                                                                                                                                                  • TECNOLOGIAS UTILIZADAS
                                                                                                                                                                                    • CONCLUSAtildeO
                                                                                                                                                                                    • Referecircncias
                                                                                                                                                                                    • Meacutetodo create_voters
                                                                                                                                                                                    • Meacutetodo create_candidates
                                                                                                                                                                                    • Meacutetodo calculate_means
                                                                                                                                                                                    • Meacutetodo get_mean
                                                                                                                                                                                    • Meacutetodo calculate_mean
                                                                                                                                                                                    • Meacutetodo set_leading_candidates
                                                                                                                                                                                    • Meacutetodo irv_set_leading_candidates
                                                                                                                                                                                    • Meacutetodo sort_ranks
                                                                                                                                                                                    • Meacutetodo fptp_count_tactical_votes
                                                                                                                                                                                    • Meacutetodo fptp_count_minority_votes
                                                                                                                                                                                    • Meacutetodo trs_second_round
                                                                                                                                                                                    • Meacutetodo trs_account_for_coalitions
                                                                                                                                                                                    • Meacutetodo irv_count_votes
                                                                                                                                                                                    • Meacutetodo avs_count_votes
                                                                                                                                                                                    • Meacutetodo avs_count_votes_with_tactical
                                                                                                                                                                                    • Meacutetodo irv_apply_tactical_votes
                                                                                                                                                                                    • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                                                                                                    • Meacutetodo bc_sum_candidates_scores
                                                                                                                                                                                    • Meacutetodo svs_apply_tactical_votes
                                                                                                                                                                                    • Meacutetodo svs_sum_candidates_scores
                                                                                                                                                                                    • Meacutetodo bv_count_votes

                                                                                                                                          69

                                                                                                                                          APEcircNDICE E ndash MEacuteTODO CALCULATE_MEAN

                                                                                                                                          Coacutedigo E1 ndash Meacutetodo calculate_meandef calculate_mean(self)

                                                                                                                                          rating_sum = 0

                                                                                                                                          for voter in selfvoters

                                                                                                                                          for candidate in winners

                                                                                                                                          rating_sum += voter[candidate]

                                                                                                                                          return rating_sum(selfN_VOTERSselfN_VACANCIES) False

                                                                                                                                          APEcircNDICE F ndash MEacuteTODO SET_LEADING_CANDIDATES

                                                                                                                                          Coacutedigo F1 ndash Meacutetodo set_leading_candidatesdef set_leading_candidates(self)

                                                                                                                                          for i in range(1 selfN_VACANCIES + 2)

                                                                                                                                          selfleading_candidatesappend(selfsorted_candidates[-i][self

                                                                                                                                          CANDIDATE_INDEX])

                                                                                                                                          APEcircNDICE G ndash MEacuteTODO IRV_SET_LEADING_CANDIDATES

                                                                                                                                          Coacutedigo G1 ndash Meacutetodo irv_set_leading_candidatesdef _set_leading_candidates(self)

                                                                                                                                          for leader in selfelecrounds[-1]

                                                                                                                                          selfleading_candidatesappend(leader[0])

                                                                                                                                          70

                                                                                                                                          APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                                                                                                                          Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                                                                                                                          self_account_for_coalitions()

                                                                                                                                          for voter in selfvoters

                                                                                                                                          selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                                                                                                                          (1)))

                                                                                                                                          temp = []

                                                                                                                                          for voter in selfsorted_voters

                                                                                                                                          new_dict = defaultdict(list)

                                                                                                                                          for k in voter

                                                                                                                                          new_dict[k[1]]append(k[0])

                                                                                                                                          tempappend(new_dict)

                                                                                                                                          selfsorted_voters = []

                                                                                                                                          for voter_index current_voter in enumerate(temp)

                                                                                                                                          new_voter = []

                                                                                                                                          for rating candidate_indexes in current_voteritems()

                                                                                                                                          if len(current_voter[rating]) gt 1

                                                                                                                                          shuffle(current_voter[rating])

                                                                                                                                          for e in candidate_indexes

                                                                                                                                          new_voterappend((e rating))

                                                                                                                                          else

                                                                                                                                          new_voterappend((candidate_indexes[0] rating))

                                                                                                                                          selfsorted_votersappend(new_voter)

                                                                                                                                          selfcandidates[new_voter[-1][0]] += 1

                                                                                                                                          selfvotes[new_voter[-1][0]]add(voter_index)

                                                                                                                                          71

                                                                                                                                          APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                                                                                                                          Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                                                                                                                          for candidate in selfvotes_copy

                                                                                                                                          if candidate not in selfelecleading_candidates

                                                                                                                                          for voter_index in selfvotes_copy[candidate]

                                                                                                                                          for index _candidate in enumerate(reversed(selfelec

                                                                                                                                          sorted_voters[voter_index]))

                                                                                                                                          if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                                                                                                                          leading_candidates

                                                                                                                                          if randomrandom() lt selfelec

                                                                                                                                          tactical_vote_percentages[_candidate[selfelec

                                                                                                                                          CANDIDATE_INDEX]]

                                                                                                                                          selfrankings_changed[voter_index] = copy

                                                                                                                                          deepcopy(selfelecsorted_voters[voter_index])

                                                                                                                                          selfrankings_changed[voter_index][-(index + 1)]

                                                                                                                                          selfrankings_changed[voter_index][-1] = self

                                                                                                                                          rankings_changed[voter_index][-1] self

                                                                                                                                          rankings_changed[voter_index][-(index + 1)]

                                                                                                                                          selfcandidates[candidate] -= 1

                                                                                                                                          selfcandidates[_candidate[selfelec

                                                                                                                                          CANDIDATE_INDEX]] += 1

                                                                                                                                          selfvotes[candidate]remove(voter_index)

                                                                                                                                          selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                                                                                                                          ]]add(voter_index)

                                                                                                                                          break

                                                                                                                                          break

                                                                                                                                          72

                                                                                                                                          APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                                                                                                                          Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                                                                                                                          half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                                                                                                                          for candidate in selfelecleading_candidates

                                                                                                                                          if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                                                                                                                          continue

                                                                                                                                          for voter_index in selfvotes_copy[candidate]

                                                                                                                                          if voter_index in selfrankings_changed

                                                                                                                                          ranking = selfrankings_changed[voter_index]

                                                                                                                                          else

                                                                                                                                          ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                                                                                                                          ])

                                                                                                                                          for index _candidate in enumerate(reversed(ranking))

                                                                                                                                          if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                                          leading_candidates or (_candidate[selfelec

                                                                                                                                          CANDIDATE_INDEX] in selfelecleading_candidates and

                                                                                                                                          selfelecleading_candidatesindex(_candidate[selfelec

                                                                                                                                          CANDIDATE_INDEX]) gt= half_vacancies)

                                                                                                                                          if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                                                                                                                          if randomrandom() lt selfelec

                                                                                                                                          minority_vote_percentages[_candidate[selfelec

                                                                                                                                          CANDIDATE_INDEX]]

                                                                                                                                          selfcandidates[candidate] -= 1

                                                                                                                                          selfcandidates[_candidate[selfelec

                                                                                                                                          CANDIDATE_INDEX]] += 1

                                                                                                                                          break

                                                                                                                                          break

                                                                                                                                          break

                                                                                                                                          73

                                                                                                                                          APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                                                                                                                          Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                                                                                                                          self_account_for_coalitions()

                                                                                                                                          for candidate in selfvotes

                                                                                                                                          if candidate = selfwinner and candidate = selfsecond_place

                                                                                                                                          for voter_index in selfvotes[candidate]

                                                                                                                                          if voter_index in selfrankings_changed

                                                                                                                                          ranking = selfrankings_changed[voter_index]

                                                                                                                                          else

                                                                                                                                          ranking = copydeepcopy(selfelecsorted_voters[

                                                                                                                                          voter_index])

                                                                                                                                          for index2 candidate in enumerate(reversed(ranking))

                                                                                                                                          if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                                                                                                                          selfcandidates[selfwinner] += 1

                                                                                                                                          selfvotes[selfwinner]add(voter_index)

                                                                                                                                          break

                                                                                                                                          elif candidate[selfelecCANDIDATE_INDEX] == self

                                                                                                                                          second_place

                                                                                                                                          selfcandidates[selfsecond_place] += 1

                                                                                                                                          selfvotes[selfsecond_place]add(voter_index)

                                                                                                                                          break

                                                                                                                                          selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                                                          winners = []

                                                                                                                                          vacancies = selfelecN_VACANCIES

                                                                                                                                          for candidate in reversed(selfsorted_candidates)

                                                                                                                                          if vacancies == 0

                                                                                                                                          break

                                                                                                                                          winnersappend(candidate[0])

                                                                                                                                          vacancies -= 1

                                                                                                                                          mean chose_best = selfelecget_mean(winners = winners)

                                                                                                                                          74

                                                                                                                                          APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                                                                                                                          Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                                                                                                                          for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                          voter_dict = dict()

                                                                                                                                          og_voter_dict = dict()

                                                                                                                                          for tup in voter

                                                                                                                                          voter_dict[tup[0]] = tup[1]

                                                                                                                                          og_voter_dict[tup[0]] = tup[1]

                                                                                                                                          for coalition in selfeleccoalitions

                                                                                                                                          for candidate in coalition

                                                                                                                                          add_to_score = 0

                                                                                                                                          for candidate2 in coalition

                                                                                                                                          if candidate == candidate2

                                                                                                                                          continue

                                                                                                                                          half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                                                                                                                          if half lt 0

                                                                                                                                          add_to_score += mathceil(half)

                                                                                                                                          else

                                                                                                                                          add_to_score += mathfloor(half)

                                                                                                                                          if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                                                                                                                          voter_dict[candidate[rsquovaluersquo]] = 10

                                                                                                                                          elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                                                                                                                          voter_dict[candidate[rsquovaluersquo]] = -10

                                                                                                                                          else

                                                                                                                                          voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                                                                                                                          selfrankings_changed[voter_index] = []

                                                                                                                                          for candidate in voter_dict

                                                                                                                                          selfrankings_changed[voter_index]append((candidate voter_dict[

                                                                                                                                          candidate]))

                                                                                                                                          selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                                                                                                                          voter_index] key=lambda x x[1])

                                                                                                                                          75

                                                                                                                                          APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                                                                                                          Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                                                                                                          selfelecroundsappend(selfsorted_candidates[_round])

                                                                                                                                          if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                                                          N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                                                                                                          N_VACANCIES - 1)

                                                                                                                                          return 2

                                                                                                                                          elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                                                          N_VOTERS gt 05)

                                                                                                                                          return 1

                                                                                                                                          else

                                                                                                                                          selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                                                                                                          CANDIDATE_INDEX])

                                                                                                                                          for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                                                                                                          elecCANDIDATE_INDEX]]

                                                                                                                                          if voter_index in selfrankings_changed

                                                                                                                                          for candidate in reversed(selfrankings_changed[voter_index

                                                                                                                                          ])

                                                                                                                                          if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                                          excluded

                                                                                                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                                                          ]] += 1

                                                                                                                                          selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                                                          add(voter_index)

                                                                                                                                          break

                                                                                                                                          else

                                                                                                                                          continue

                                                                                                                                          else

                                                                                                                                          for candidate in reversed(selfelecsorted_voters[

                                                                                                                                          voter_index])

                                                                                                                                          if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                                          excluded

                                                                                                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                                                          ]] += 1

                                                                                                                                          selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                                                          add(voter_index)

                                                                                                                                          break

                                                                                                                                          else

                                                                                                                                          continue

                                                                                                                                          selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                                                          return 0

                                                                                                                                          76

                                                                                                                                          APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                                                                                                          Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                                                                                                          for index in range(selfelecN_CANDIDATES)

                                                                                                                                          selfcandidates[index] = 0

                                                                                                                                          for voter in selfelecsorted_voters

                                                                                                                                          for candidate in reversed(voter)

                                                                                                                                          if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                          else

                                                                                                                                          break

                                                                                                                                          APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                                                                                                          Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                                                                                                          for index in range(selfelecN_CANDIDATES)

                                                                                                                                          selfcandidates[index] = 0

                                                                                                                                          for voter in selfelecsorted_voters

                                                                                                                                          if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                                                          elecCANDIDATE_INDEX]]

                                                                                                                                          selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                          else

                                                                                                                                          for candidate in reversed(voter)

                                                                                                                                          if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                          else

                                                                                                                                          break

                                                                                                                                          77

                                                                                                                                          APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                                                                                                          Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                                                                                                          pos = set()

                                                                                                                                          for index perc in enumerate(selfelectactical_vote_percentages)

                                                                                                                                          if perc gt 0

                                                                                                                                          posadd(index)

                                                                                                                                          for candidate in selfeleccandidates

                                                                                                                                          if candidate not in selfleading_candidates

                                                                                                                                          for voter_index in selfvotes[candidate]

                                                                                                                                          raised = None

                                                                                                                                          for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                                                                                                          ])

                                                                                                                                          if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                                                                                                          leading_candidates

                                                                                                                                          if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                                                                                                          if randomrandom() lt selfelectactical_vote_percentages[

                                                                                                                                          candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                                                                                                          ranking = [None]selfelecN_CANDIDATES

                                                                                                                                          ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                          selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                                          CANDIDATE_INDEX]])

                                                                                                                                          raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                          break

                                                                                                                                          break

                                                                                                                                          break

                                                                                                                                          if raised = None

                                                                                                                                          for _candidate in selfleading_candidates

                                                                                                                                          if _candidate = ranking[-1][0]

                                                                                                                                          ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                                                          _candidate])

                                                                                                                                          buried = _candidate

                                                                                                                                          break

                                                                                                                                          i = 1

                                                                                                                                          for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                                                          if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                                                                                                          buried]

                                                                                                                                          continue

                                                                                                                                          else

                                                                                                                                          ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                          selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                                          CANDIDATE_INDEX]])

                                                                                                                                          i += 1

                                                                                                                                          selfrankings_changed[voter_index] = ranking

                                                                                                                                          78

                                                                                                                                          APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                                                                                                          Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                                                                                                          for voter_index in selfvotes[candidate]

                                                                                                                                          if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                                                                                                          ]

                                                                                                                                          for _candidate in selfleading_candidates

                                                                                                                                          if _candidate = candidate

                                                                                                                                          ranking = [None]selfelecN_CANDIDATES

                                                                                                                                          ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                                                          _candidate])

                                                                                                                                          buried = _candidate

                                                                                                                                          break

                                                                                                                                          i = 1

                                                                                                                                          for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                                                          if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                                                                                                          continue

                                                                                                                                          else

                                                                                                                                          ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                          selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                                          CANDIDATE_INDEX]])

                                                                                                                                          i += 1

                                                                                                                                          selfrankings_changed[voter_index] = ranking

                                                                                                                                          79

                                                                                                                                          APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                                                                                                          Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                                                                                                          for index in range(selfelecN_CANDIDATES)

                                                                                                                                          selfcandidates[index] = 0

                                                                                                                                          for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                          score = 0

                                                                                                                                          if voter_index in selfrankings_changed

                                                                                                                                          for candidate in selfrankings_changed[voter_index]

                                                                                                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                                                          score += 1

                                                                                                                                          else

                                                                                                                                          for candidate in voter

                                                                                                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                                                          score += 1

                                                                                                                                          APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                                                                                                          Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                                                                                                          for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                          if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                                                          elecCANDIDATE_INDEX]]

                                                                                                                                          selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                                                                                                          sorted_voters[voter_index])

                                                                                                                                          for candidate_index candidate in enumerate(reversed(voter))

                                                                                                                                          if candidate_index == 0

                                                                                                                                          selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                                                          voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                                                                                                          else

                                                                                                                                          selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                                                          voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                                                                                                          80

                                                                                                                                          APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                                                                                                          Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                                                                                                          for index in range(selfelecN_CANDIDATES)

                                                                                                                                          selfcandidates[index] = 0

                                                                                                                                          for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                          if voter_index in selfrankings_changed

                                                                                                                                          for candidate in selfrankings_changed[voter_index]

                                                                                                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                                                          selfelecCANDIDATE_RANK]

                                                                                                                                          else

                                                                                                                                          for candidate in voter

                                                                                                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                                                          selfelecCANDIDATE_RANK]

                                                                                                                                          APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                                                                                                          Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                                                                                                          for index in range(selfelecN_CANDIDATES)

                                                                                                                                          selfcandidates[index] = 0

                                                                                                                                          for voter in selfelecsorted_voters

                                                                                                                                          votes = selfelecN_VACANCIES

                                                                                                                                          for candidate in reversed(voter)

                                                                                                                                          if votes == 0

                                                                                                                                          break

                                                                                                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                          votes -= 1

                                                                                                                                          • Folha de aprovaccedilatildeo
                                                                                                                                          • Agradecimentos
                                                                                                                                          • Epiacutegrafe
                                                                                                                                          • Resumo
                                                                                                                                          • Abstract
                                                                                                                                          • Lista de ilustraccedilotildees
                                                                                                                                          • Lista de Coacutedigos
                                                                                                                                          • Lista de tabelas
                                                                                                                                          • Lista de abreviaturas e siglas
                                                                                                                                          • Sumaacuterio
                                                                                                                                          • INTRODUCcedilAtildeO
                                                                                                                                            • MOTIVACcedilAtildeO E OBJETIVO
                                                                                                                                            • MEacuteTODO
                                                                                                                                            • ESTRUTURA
                                                                                                                                              • SISTEMAS ELEITORAIS
                                                                                                                                                • FISRT PAST THE POST
                                                                                                                                                  • Exemplo
                                                                                                                                                  • Vantagens e Desvantagens do FPTP
                                                                                                                                                  • Voto Uacutetil no FPTP
                                                                                                                                                    • TWO-ROUND SYSTEM
                                                                                                                                                      • Exemplo
                                                                                                                                                      • Vantagens e Desvantagens do TRS
                                                                                                                                                      • Voto Uacutetil no TRS
                                                                                                                                                        • INSTANT-RUNOFF VOTING
                                                                                                                                                          • Exemplo
                                                                                                                                                          • Vantagens e Desvantagens do IRV
                                                                                                                                                          • Voto Uacutetil no IRV
                                                                                                                                                            • APPROVAL VOTING SYSTEM
                                                                                                                                                              • Exemplo
                                                                                                                                                              • Vantagens e Desvantagens do AVS
                                                                                                                                                              • Voto Uacutetil no AVS
                                                                                                                                                                • THE BORDA COUNT
                                                                                                                                                                  • Exemplo
                                                                                                                                                                  • Vantagens e Desvantagens do BC
                                                                                                                                                                  • Voto Uacutetil no BC
                                                                                                                                                                    • SCORE VOTING SYSTEM
                                                                                                                                                                      • Exemplo
                                                                                                                                                                      • Vantagens e Desvantagens do SVS
                                                                                                                                                                      • Voto Uacutetil no SVS
                                                                                                                                                                        • BLOC VOTE
                                                                                                                                                                          • Exemplo
                                                                                                                                                                          • Voto Uacutetil no BV
                                                                                                                                                                              • O SIMULADOR
                                                                                                                                                                              • CENAacuteRIOS PERTINENTES
                                                                                                                                                                                • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                                                                                                • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                                                                                                • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                                                                                                • CENAacuteRIO 4 COALIZOtildeES
                                                                                                                                                                                • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                                                                                                • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                                                                                                  • COMO FUNCIONA O SIMULADOR
                                                                                                                                                                                    • CLASSE Elections
                                                                                                                                                                                    • CLASSE FirstPastThePost
                                                                                                                                                                                    • CLASSE TwoRoundSystem
                                                                                                                                                                                    • CLASSE InstantRunoffVoting
                                                                                                                                                                                    • CLASSE ApprovalVoting
                                                                                                                                                                                    • CLASSE BordaCount
                                                                                                                                                                                    • CLASSE ScoreVoting
                                                                                                                                                                                    • CLASSE BlocVote
                                                                                                                                                                                    • TECNOLOGIAS UTILIZADAS
                                                                                                                                                                                      • CONCLUSAtildeO
                                                                                                                                                                                      • Referecircncias
                                                                                                                                                                                      • Meacutetodo create_voters
                                                                                                                                                                                      • Meacutetodo create_candidates
                                                                                                                                                                                      • Meacutetodo calculate_means
                                                                                                                                                                                      • Meacutetodo get_mean
                                                                                                                                                                                      • Meacutetodo calculate_mean
                                                                                                                                                                                      • Meacutetodo set_leading_candidates
                                                                                                                                                                                      • Meacutetodo irv_set_leading_candidates
                                                                                                                                                                                      • Meacutetodo sort_ranks
                                                                                                                                                                                      • Meacutetodo fptp_count_tactical_votes
                                                                                                                                                                                      • Meacutetodo fptp_count_minority_votes
                                                                                                                                                                                      • Meacutetodo trs_second_round
                                                                                                                                                                                      • Meacutetodo trs_account_for_coalitions
                                                                                                                                                                                      • Meacutetodo irv_count_votes
                                                                                                                                                                                      • Meacutetodo avs_count_votes
                                                                                                                                                                                      • Meacutetodo avs_count_votes_with_tactical
                                                                                                                                                                                      • Meacutetodo irv_apply_tactical_votes
                                                                                                                                                                                      • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                                                                                                      • Meacutetodo bc_sum_candidates_scores
                                                                                                                                                                                      • Meacutetodo svs_apply_tactical_votes
                                                                                                                                                                                      • Meacutetodo svs_sum_candidates_scores
                                                                                                                                                                                      • Meacutetodo bv_count_votes

                                                                                                                                            70

                                                                                                                                            APEcircNDICE H ndash MEacuteTODO SORT_RANKS

                                                                                                                                            Coacutedigo H1 ndash Meacutetodo sort_ranksdef sort_ranks(self)

                                                                                                                                            self_account_for_coalitions()

                                                                                                                                            for voter in selfvoters

                                                                                                                                            selfsorted_votersappend(sorted(voteritems() key=operatoritemgetter

                                                                                                                                            (1)))

                                                                                                                                            temp = []

                                                                                                                                            for voter in selfsorted_voters

                                                                                                                                            new_dict = defaultdict(list)

                                                                                                                                            for k in voter

                                                                                                                                            new_dict[k[1]]append(k[0])

                                                                                                                                            tempappend(new_dict)

                                                                                                                                            selfsorted_voters = []

                                                                                                                                            for voter_index current_voter in enumerate(temp)

                                                                                                                                            new_voter = []

                                                                                                                                            for rating candidate_indexes in current_voteritems()

                                                                                                                                            if len(current_voter[rating]) gt 1

                                                                                                                                            shuffle(current_voter[rating])

                                                                                                                                            for e in candidate_indexes

                                                                                                                                            new_voterappend((e rating))

                                                                                                                                            else

                                                                                                                                            new_voterappend((candidate_indexes[0] rating))

                                                                                                                                            selfsorted_votersappend(new_voter)

                                                                                                                                            selfcandidates[new_voter[-1][0]] += 1

                                                                                                                                            selfvotes[new_voter[-1][0]]add(voter_index)

                                                                                                                                            71

                                                                                                                                            APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                                                                                                                            Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                                                                                                                            for candidate in selfvotes_copy

                                                                                                                                            if candidate not in selfelecleading_candidates

                                                                                                                                            for voter_index in selfvotes_copy[candidate]

                                                                                                                                            for index _candidate in enumerate(reversed(selfelec

                                                                                                                                            sorted_voters[voter_index]))

                                                                                                                                            if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                                                                                                                            leading_candidates

                                                                                                                                            if randomrandom() lt selfelec

                                                                                                                                            tactical_vote_percentages[_candidate[selfelec

                                                                                                                                            CANDIDATE_INDEX]]

                                                                                                                                            selfrankings_changed[voter_index] = copy

                                                                                                                                            deepcopy(selfelecsorted_voters[voter_index])

                                                                                                                                            selfrankings_changed[voter_index][-(index + 1)]

                                                                                                                                            selfrankings_changed[voter_index][-1] = self

                                                                                                                                            rankings_changed[voter_index][-1] self

                                                                                                                                            rankings_changed[voter_index][-(index + 1)]

                                                                                                                                            selfcandidates[candidate] -= 1

                                                                                                                                            selfcandidates[_candidate[selfelec

                                                                                                                                            CANDIDATE_INDEX]] += 1

                                                                                                                                            selfvotes[candidate]remove(voter_index)

                                                                                                                                            selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                                                                                                                            ]]add(voter_index)

                                                                                                                                            break

                                                                                                                                            break

                                                                                                                                            72

                                                                                                                                            APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                                                                                                                            Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                                                                                                                            half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                                                                                                                            for candidate in selfelecleading_candidates

                                                                                                                                            if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                                                                                                                            continue

                                                                                                                                            for voter_index in selfvotes_copy[candidate]

                                                                                                                                            if voter_index in selfrankings_changed

                                                                                                                                            ranking = selfrankings_changed[voter_index]

                                                                                                                                            else

                                                                                                                                            ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                                                                                                                            ])

                                                                                                                                            for index _candidate in enumerate(reversed(ranking))

                                                                                                                                            if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                                            leading_candidates or (_candidate[selfelec

                                                                                                                                            CANDIDATE_INDEX] in selfelecleading_candidates and

                                                                                                                                            selfelecleading_candidatesindex(_candidate[selfelec

                                                                                                                                            CANDIDATE_INDEX]) gt= half_vacancies)

                                                                                                                                            if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                                                                                                                            if randomrandom() lt selfelec

                                                                                                                                            minority_vote_percentages[_candidate[selfelec

                                                                                                                                            CANDIDATE_INDEX]]

                                                                                                                                            selfcandidates[candidate] -= 1

                                                                                                                                            selfcandidates[_candidate[selfelec

                                                                                                                                            CANDIDATE_INDEX]] += 1

                                                                                                                                            break

                                                                                                                                            break

                                                                                                                                            break

                                                                                                                                            73

                                                                                                                                            APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                                                                                                                            Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                                                                                                                            self_account_for_coalitions()

                                                                                                                                            for candidate in selfvotes

                                                                                                                                            if candidate = selfwinner and candidate = selfsecond_place

                                                                                                                                            for voter_index in selfvotes[candidate]

                                                                                                                                            if voter_index in selfrankings_changed

                                                                                                                                            ranking = selfrankings_changed[voter_index]

                                                                                                                                            else

                                                                                                                                            ranking = copydeepcopy(selfelecsorted_voters[

                                                                                                                                            voter_index])

                                                                                                                                            for index2 candidate in enumerate(reversed(ranking))

                                                                                                                                            if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                                                                                                                            selfcandidates[selfwinner] += 1

                                                                                                                                            selfvotes[selfwinner]add(voter_index)

                                                                                                                                            break

                                                                                                                                            elif candidate[selfelecCANDIDATE_INDEX] == self

                                                                                                                                            second_place

                                                                                                                                            selfcandidates[selfsecond_place] += 1

                                                                                                                                            selfvotes[selfsecond_place]add(voter_index)

                                                                                                                                            break

                                                                                                                                            selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                                                            winners = []

                                                                                                                                            vacancies = selfelecN_VACANCIES

                                                                                                                                            for candidate in reversed(selfsorted_candidates)

                                                                                                                                            if vacancies == 0

                                                                                                                                            break

                                                                                                                                            winnersappend(candidate[0])

                                                                                                                                            vacancies -= 1

                                                                                                                                            mean chose_best = selfelecget_mean(winners = winners)

                                                                                                                                            74

                                                                                                                                            APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                                                                                                                            Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                                                                                                                            for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                            voter_dict = dict()

                                                                                                                                            og_voter_dict = dict()

                                                                                                                                            for tup in voter

                                                                                                                                            voter_dict[tup[0]] = tup[1]

                                                                                                                                            og_voter_dict[tup[0]] = tup[1]

                                                                                                                                            for coalition in selfeleccoalitions

                                                                                                                                            for candidate in coalition

                                                                                                                                            add_to_score = 0

                                                                                                                                            for candidate2 in coalition

                                                                                                                                            if candidate == candidate2

                                                                                                                                            continue

                                                                                                                                            half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                                                                                                                            if half lt 0

                                                                                                                                            add_to_score += mathceil(half)

                                                                                                                                            else

                                                                                                                                            add_to_score += mathfloor(half)

                                                                                                                                            if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                                                                                                                            voter_dict[candidate[rsquovaluersquo]] = 10

                                                                                                                                            elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                                                                                                                            voter_dict[candidate[rsquovaluersquo]] = -10

                                                                                                                                            else

                                                                                                                                            voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                                                                                                                            selfrankings_changed[voter_index] = []

                                                                                                                                            for candidate in voter_dict

                                                                                                                                            selfrankings_changed[voter_index]append((candidate voter_dict[

                                                                                                                                            candidate]))

                                                                                                                                            selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                                                                                                                            voter_index] key=lambda x x[1])

                                                                                                                                            75

                                                                                                                                            APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                                                                                                            Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                                                                                                            selfelecroundsappend(selfsorted_candidates[_round])

                                                                                                                                            if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                                                            N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                                                                                                            N_VACANCIES - 1)

                                                                                                                                            return 2

                                                                                                                                            elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                                                            N_VOTERS gt 05)

                                                                                                                                            return 1

                                                                                                                                            else

                                                                                                                                            selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                                                                                                            CANDIDATE_INDEX])

                                                                                                                                            for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                                                                                                            elecCANDIDATE_INDEX]]

                                                                                                                                            if voter_index in selfrankings_changed

                                                                                                                                            for candidate in reversed(selfrankings_changed[voter_index

                                                                                                                                            ])

                                                                                                                                            if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                                            excluded

                                                                                                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                                                            ]] += 1

                                                                                                                                            selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                                                            add(voter_index)

                                                                                                                                            break

                                                                                                                                            else

                                                                                                                                            continue

                                                                                                                                            else

                                                                                                                                            for candidate in reversed(selfelecsorted_voters[

                                                                                                                                            voter_index])

                                                                                                                                            if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                                            excluded

                                                                                                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                                                            ]] += 1

                                                                                                                                            selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                                                            add(voter_index)

                                                                                                                                            break

                                                                                                                                            else

                                                                                                                                            continue

                                                                                                                                            selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                                                            return 0

                                                                                                                                            76

                                                                                                                                            APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                                                                                                            Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                                                                                                            for index in range(selfelecN_CANDIDATES)

                                                                                                                                            selfcandidates[index] = 0

                                                                                                                                            for voter in selfelecsorted_voters

                                                                                                                                            for candidate in reversed(voter)

                                                                                                                                            if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                            else

                                                                                                                                            break

                                                                                                                                            APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                                                                                                            Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                                                                                                            for index in range(selfelecN_CANDIDATES)

                                                                                                                                            selfcandidates[index] = 0

                                                                                                                                            for voter in selfelecsorted_voters

                                                                                                                                            if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                                                            elecCANDIDATE_INDEX]]

                                                                                                                                            selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                            else

                                                                                                                                            for candidate in reversed(voter)

                                                                                                                                            if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                            else

                                                                                                                                            break

                                                                                                                                            77

                                                                                                                                            APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                                                                                                            Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                                                                                                            pos = set()

                                                                                                                                            for index perc in enumerate(selfelectactical_vote_percentages)

                                                                                                                                            if perc gt 0

                                                                                                                                            posadd(index)

                                                                                                                                            for candidate in selfeleccandidates

                                                                                                                                            if candidate not in selfleading_candidates

                                                                                                                                            for voter_index in selfvotes[candidate]

                                                                                                                                            raised = None

                                                                                                                                            for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                                                                                                            ])

                                                                                                                                            if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                                                                                                            leading_candidates

                                                                                                                                            if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                                                                                                            if randomrandom() lt selfelectactical_vote_percentages[

                                                                                                                                            candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                                                                                                            ranking = [None]selfelecN_CANDIDATES

                                                                                                                                            ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                            selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                                            CANDIDATE_INDEX]])

                                                                                                                                            raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                            break

                                                                                                                                            break

                                                                                                                                            break

                                                                                                                                            if raised = None

                                                                                                                                            for _candidate in selfleading_candidates

                                                                                                                                            if _candidate = ranking[-1][0]

                                                                                                                                            ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                                                            _candidate])

                                                                                                                                            buried = _candidate

                                                                                                                                            break

                                                                                                                                            i = 1

                                                                                                                                            for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                                                            if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                                                                                                            buried]

                                                                                                                                            continue

                                                                                                                                            else

                                                                                                                                            ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                            selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                                            CANDIDATE_INDEX]])

                                                                                                                                            i += 1

                                                                                                                                            selfrankings_changed[voter_index] = ranking

                                                                                                                                            78

                                                                                                                                            APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                                                                                                            Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                                                                                                            for voter_index in selfvotes[candidate]

                                                                                                                                            if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                                                                                                            ]

                                                                                                                                            for _candidate in selfleading_candidates

                                                                                                                                            if _candidate = candidate

                                                                                                                                            ranking = [None]selfelecN_CANDIDATES

                                                                                                                                            ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                                                            _candidate])

                                                                                                                                            buried = _candidate

                                                                                                                                            break

                                                                                                                                            i = 1

                                                                                                                                            for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                                                            if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                                                                                                            continue

                                                                                                                                            else

                                                                                                                                            ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                            selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                                            CANDIDATE_INDEX]])

                                                                                                                                            i += 1

                                                                                                                                            selfrankings_changed[voter_index] = ranking

                                                                                                                                            79

                                                                                                                                            APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                                                                                                            Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                                                                                                            for index in range(selfelecN_CANDIDATES)

                                                                                                                                            selfcandidates[index] = 0

                                                                                                                                            for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                            score = 0

                                                                                                                                            if voter_index in selfrankings_changed

                                                                                                                                            for candidate in selfrankings_changed[voter_index]

                                                                                                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                                                            score += 1

                                                                                                                                            else

                                                                                                                                            for candidate in voter

                                                                                                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                                                            score += 1

                                                                                                                                            APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                                                                                                            Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                                                                                                            for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                            if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                                                            elecCANDIDATE_INDEX]]

                                                                                                                                            selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                                                                                                            sorted_voters[voter_index])

                                                                                                                                            for candidate_index candidate in enumerate(reversed(voter))

                                                                                                                                            if candidate_index == 0

                                                                                                                                            selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                                                            voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                                                                                                            else

                                                                                                                                            selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                                                            voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                                                                                                            80

                                                                                                                                            APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                                                                                                            Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                                                                                                            for index in range(selfelecN_CANDIDATES)

                                                                                                                                            selfcandidates[index] = 0

                                                                                                                                            for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                            if voter_index in selfrankings_changed

                                                                                                                                            for candidate in selfrankings_changed[voter_index]

                                                                                                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                                                            selfelecCANDIDATE_RANK]

                                                                                                                                            else

                                                                                                                                            for candidate in voter

                                                                                                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                                                            selfelecCANDIDATE_RANK]

                                                                                                                                            APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                                                                                                            Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                                                                                                            for index in range(selfelecN_CANDIDATES)

                                                                                                                                            selfcandidates[index] = 0

                                                                                                                                            for voter in selfelecsorted_voters

                                                                                                                                            votes = selfelecN_VACANCIES

                                                                                                                                            for candidate in reversed(voter)

                                                                                                                                            if votes == 0

                                                                                                                                            break

                                                                                                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                            votes -= 1

                                                                                                                                            • Folha de aprovaccedilatildeo
                                                                                                                                            • Agradecimentos
                                                                                                                                            • Epiacutegrafe
                                                                                                                                            • Resumo
                                                                                                                                            • Abstract
                                                                                                                                            • Lista de ilustraccedilotildees
                                                                                                                                            • Lista de Coacutedigos
                                                                                                                                            • Lista de tabelas
                                                                                                                                            • Lista de abreviaturas e siglas
                                                                                                                                            • Sumaacuterio
                                                                                                                                            • INTRODUCcedilAtildeO
                                                                                                                                              • MOTIVACcedilAtildeO E OBJETIVO
                                                                                                                                              • MEacuteTODO
                                                                                                                                              • ESTRUTURA
                                                                                                                                                • SISTEMAS ELEITORAIS
                                                                                                                                                  • FISRT PAST THE POST
                                                                                                                                                    • Exemplo
                                                                                                                                                    • Vantagens e Desvantagens do FPTP
                                                                                                                                                    • Voto Uacutetil no FPTP
                                                                                                                                                      • TWO-ROUND SYSTEM
                                                                                                                                                        • Exemplo
                                                                                                                                                        • Vantagens e Desvantagens do TRS
                                                                                                                                                        • Voto Uacutetil no TRS
                                                                                                                                                          • INSTANT-RUNOFF VOTING
                                                                                                                                                            • Exemplo
                                                                                                                                                            • Vantagens e Desvantagens do IRV
                                                                                                                                                            • Voto Uacutetil no IRV
                                                                                                                                                              • APPROVAL VOTING SYSTEM
                                                                                                                                                                • Exemplo
                                                                                                                                                                • Vantagens e Desvantagens do AVS
                                                                                                                                                                • Voto Uacutetil no AVS
                                                                                                                                                                  • THE BORDA COUNT
                                                                                                                                                                    • Exemplo
                                                                                                                                                                    • Vantagens e Desvantagens do BC
                                                                                                                                                                    • Voto Uacutetil no BC
                                                                                                                                                                      • SCORE VOTING SYSTEM
                                                                                                                                                                        • Exemplo
                                                                                                                                                                        • Vantagens e Desvantagens do SVS
                                                                                                                                                                        • Voto Uacutetil no SVS
                                                                                                                                                                          • BLOC VOTE
                                                                                                                                                                            • Exemplo
                                                                                                                                                                            • Voto Uacutetil no BV
                                                                                                                                                                                • O SIMULADOR
                                                                                                                                                                                • CENAacuteRIOS PERTINENTES
                                                                                                                                                                                  • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                                                                                                  • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                                                                                                  • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                                                                                                  • CENAacuteRIO 4 COALIZOtildeES
                                                                                                                                                                                  • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                                                                                                  • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                                                                                                    • COMO FUNCIONA O SIMULADOR
                                                                                                                                                                                      • CLASSE Elections
                                                                                                                                                                                      • CLASSE FirstPastThePost
                                                                                                                                                                                      • CLASSE TwoRoundSystem
                                                                                                                                                                                      • CLASSE InstantRunoffVoting
                                                                                                                                                                                      • CLASSE ApprovalVoting
                                                                                                                                                                                      • CLASSE BordaCount
                                                                                                                                                                                      • CLASSE ScoreVoting
                                                                                                                                                                                      • CLASSE BlocVote
                                                                                                                                                                                      • TECNOLOGIAS UTILIZADAS
                                                                                                                                                                                        • CONCLUSAtildeO
                                                                                                                                                                                        • Referecircncias
                                                                                                                                                                                        • Meacutetodo create_voters
                                                                                                                                                                                        • Meacutetodo create_candidates
                                                                                                                                                                                        • Meacutetodo calculate_means
                                                                                                                                                                                        • Meacutetodo get_mean
                                                                                                                                                                                        • Meacutetodo calculate_mean
                                                                                                                                                                                        • Meacutetodo set_leading_candidates
                                                                                                                                                                                        • Meacutetodo irv_set_leading_candidates
                                                                                                                                                                                        • Meacutetodo sort_ranks
                                                                                                                                                                                        • Meacutetodo fptp_count_tactical_votes
                                                                                                                                                                                        • Meacutetodo fptp_count_minority_votes
                                                                                                                                                                                        • Meacutetodo trs_second_round
                                                                                                                                                                                        • Meacutetodo trs_account_for_coalitions
                                                                                                                                                                                        • Meacutetodo irv_count_votes
                                                                                                                                                                                        • Meacutetodo avs_count_votes
                                                                                                                                                                                        • Meacutetodo avs_count_votes_with_tactical
                                                                                                                                                                                        • Meacutetodo irv_apply_tactical_votes
                                                                                                                                                                                        • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                                                                                                        • Meacutetodo bc_sum_candidates_scores
                                                                                                                                                                                        • Meacutetodo svs_apply_tactical_votes
                                                                                                                                                                                        • Meacutetodo svs_sum_candidates_scores
                                                                                                                                                                                        • Meacutetodo bv_count_votes

                                                                                                                                              71

                                                                                                                                              APEcircNDICE I ndash MEacuteTODO FPTP_COUNT_TACTICAL_VOTES

                                                                                                                                              Coacutedigo I1 ndash Meacutetodo fptp_count_tactical_votesdef count_tactical_votes(self)

                                                                                                                                              for candidate in selfvotes_copy

                                                                                                                                              if candidate not in selfelecleading_candidates

                                                                                                                                              for voter_index in selfvotes_copy[candidate]

                                                                                                                                              for index _candidate in enumerate(reversed(selfelec

                                                                                                                                              sorted_voters[voter_index]))

                                                                                                                                              if _candidate[selfelecCANDIDATE_INDEX] in selfelec

                                                                                                                                              leading_candidates

                                                                                                                                              if randomrandom() lt selfelec

                                                                                                                                              tactical_vote_percentages[_candidate[selfelec

                                                                                                                                              CANDIDATE_INDEX]]

                                                                                                                                              selfrankings_changed[voter_index] = copy

                                                                                                                                              deepcopy(selfelecsorted_voters[voter_index])

                                                                                                                                              selfrankings_changed[voter_index][-(index + 1)]

                                                                                                                                              selfrankings_changed[voter_index][-1] = self

                                                                                                                                              rankings_changed[voter_index][-1] self

                                                                                                                                              rankings_changed[voter_index][-(index + 1)]

                                                                                                                                              selfcandidates[candidate] -= 1

                                                                                                                                              selfcandidates[_candidate[selfelec

                                                                                                                                              CANDIDATE_INDEX]] += 1

                                                                                                                                              selfvotes[candidate]remove(voter_index)

                                                                                                                                              selfvotes[_candidate[selfelecCANDIDATE_INDEX

                                                                                                                                              ]]add(voter_index)

                                                                                                                                              break

                                                                                                                                              break

                                                                                                                                              72

                                                                                                                                              APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                                                                                                                              Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                                                                                                                              half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                                                                                                                              for candidate in selfelecleading_candidates

                                                                                                                                              if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                                                                                                                              continue

                                                                                                                                              for voter_index in selfvotes_copy[candidate]

                                                                                                                                              if voter_index in selfrankings_changed

                                                                                                                                              ranking = selfrankings_changed[voter_index]

                                                                                                                                              else

                                                                                                                                              ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                                                                                                                              ])

                                                                                                                                              for index _candidate in enumerate(reversed(ranking))

                                                                                                                                              if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                                              leading_candidates or (_candidate[selfelec

                                                                                                                                              CANDIDATE_INDEX] in selfelecleading_candidates and

                                                                                                                                              selfelecleading_candidatesindex(_candidate[selfelec

                                                                                                                                              CANDIDATE_INDEX]) gt= half_vacancies)

                                                                                                                                              if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                                                                                                                              if randomrandom() lt selfelec

                                                                                                                                              minority_vote_percentages[_candidate[selfelec

                                                                                                                                              CANDIDATE_INDEX]]

                                                                                                                                              selfcandidates[candidate] -= 1

                                                                                                                                              selfcandidates[_candidate[selfelec

                                                                                                                                              CANDIDATE_INDEX]] += 1

                                                                                                                                              break

                                                                                                                                              break

                                                                                                                                              break

                                                                                                                                              73

                                                                                                                                              APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                                                                                                                              Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                                                                                                                              self_account_for_coalitions()

                                                                                                                                              for candidate in selfvotes

                                                                                                                                              if candidate = selfwinner and candidate = selfsecond_place

                                                                                                                                              for voter_index in selfvotes[candidate]

                                                                                                                                              if voter_index in selfrankings_changed

                                                                                                                                              ranking = selfrankings_changed[voter_index]

                                                                                                                                              else

                                                                                                                                              ranking = copydeepcopy(selfelecsorted_voters[

                                                                                                                                              voter_index])

                                                                                                                                              for index2 candidate in enumerate(reversed(ranking))

                                                                                                                                              if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                                                                                                                              selfcandidates[selfwinner] += 1

                                                                                                                                              selfvotes[selfwinner]add(voter_index)

                                                                                                                                              break

                                                                                                                                              elif candidate[selfelecCANDIDATE_INDEX] == self

                                                                                                                                              second_place

                                                                                                                                              selfcandidates[selfsecond_place] += 1

                                                                                                                                              selfvotes[selfsecond_place]add(voter_index)

                                                                                                                                              break

                                                                                                                                              selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                                                              winners = []

                                                                                                                                              vacancies = selfelecN_VACANCIES

                                                                                                                                              for candidate in reversed(selfsorted_candidates)

                                                                                                                                              if vacancies == 0

                                                                                                                                              break

                                                                                                                                              winnersappend(candidate[0])

                                                                                                                                              vacancies -= 1

                                                                                                                                              mean chose_best = selfelecget_mean(winners = winners)

                                                                                                                                              74

                                                                                                                                              APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                                                                                                                              Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                                                                                                                              for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                              voter_dict = dict()

                                                                                                                                              og_voter_dict = dict()

                                                                                                                                              for tup in voter

                                                                                                                                              voter_dict[tup[0]] = tup[1]

                                                                                                                                              og_voter_dict[tup[0]] = tup[1]

                                                                                                                                              for coalition in selfeleccoalitions

                                                                                                                                              for candidate in coalition

                                                                                                                                              add_to_score = 0

                                                                                                                                              for candidate2 in coalition

                                                                                                                                              if candidate == candidate2

                                                                                                                                              continue

                                                                                                                                              half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                                                                                                                              if half lt 0

                                                                                                                                              add_to_score += mathceil(half)

                                                                                                                                              else

                                                                                                                                              add_to_score += mathfloor(half)

                                                                                                                                              if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                                                                                                                              voter_dict[candidate[rsquovaluersquo]] = 10

                                                                                                                                              elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                                                                                                                              voter_dict[candidate[rsquovaluersquo]] = -10

                                                                                                                                              else

                                                                                                                                              voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                                                                                                                              selfrankings_changed[voter_index] = []

                                                                                                                                              for candidate in voter_dict

                                                                                                                                              selfrankings_changed[voter_index]append((candidate voter_dict[

                                                                                                                                              candidate]))

                                                                                                                                              selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                                                                                                                              voter_index] key=lambda x x[1])

                                                                                                                                              75

                                                                                                                                              APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                                                                                                              Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                                                                                                              selfelecroundsappend(selfsorted_candidates[_round])

                                                                                                                                              if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                                                              N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                                                                                                              N_VACANCIES - 1)

                                                                                                                                              return 2

                                                                                                                                              elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                                                              N_VOTERS gt 05)

                                                                                                                                              return 1

                                                                                                                                              else

                                                                                                                                              selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                                                                                                              CANDIDATE_INDEX])

                                                                                                                                              for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                                                                                                              elecCANDIDATE_INDEX]]

                                                                                                                                              if voter_index in selfrankings_changed

                                                                                                                                              for candidate in reversed(selfrankings_changed[voter_index

                                                                                                                                              ])

                                                                                                                                              if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                                              excluded

                                                                                                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                                                              ]] += 1

                                                                                                                                              selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                                                              add(voter_index)

                                                                                                                                              break

                                                                                                                                              else

                                                                                                                                              continue

                                                                                                                                              else

                                                                                                                                              for candidate in reversed(selfelecsorted_voters[

                                                                                                                                              voter_index])

                                                                                                                                              if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                                              excluded

                                                                                                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                                                              ]] += 1

                                                                                                                                              selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                                                              add(voter_index)

                                                                                                                                              break

                                                                                                                                              else

                                                                                                                                              continue

                                                                                                                                              selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                                                              return 0

                                                                                                                                              76

                                                                                                                                              APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                                                                                                              Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                                                                                                              for index in range(selfelecN_CANDIDATES)

                                                                                                                                              selfcandidates[index] = 0

                                                                                                                                              for voter in selfelecsorted_voters

                                                                                                                                              for candidate in reversed(voter)

                                                                                                                                              if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                              else

                                                                                                                                              break

                                                                                                                                              APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                                                                                                              Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                                                                                                              for index in range(selfelecN_CANDIDATES)

                                                                                                                                              selfcandidates[index] = 0

                                                                                                                                              for voter in selfelecsorted_voters

                                                                                                                                              if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                                                              elecCANDIDATE_INDEX]]

                                                                                                                                              selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                              else

                                                                                                                                              for candidate in reversed(voter)

                                                                                                                                              if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                              else

                                                                                                                                              break

                                                                                                                                              77

                                                                                                                                              APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                                                                                                              Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                                                                                                              pos = set()

                                                                                                                                              for index perc in enumerate(selfelectactical_vote_percentages)

                                                                                                                                              if perc gt 0

                                                                                                                                              posadd(index)

                                                                                                                                              for candidate in selfeleccandidates

                                                                                                                                              if candidate not in selfleading_candidates

                                                                                                                                              for voter_index in selfvotes[candidate]

                                                                                                                                              raised = None

                                                                                                                                              for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                                                                                                              ])

                                                                                                                                              if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                                                                                                              leading_candidates

                                                                                                                                              if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                                                                                                              if randomrandom() lt selfelectactical_vote_percentages[

                                                                                                                                              candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                                                                                                              ranking = [None]selfelecN_CANDIDATES

                                                                                                                                              ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                              selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                                              CANDIDATE_INDEX]])

                                                                                                                                              raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                              break

                                                                                                                                              break

                                                                                                                                              break

                                                                                                                                              if raised = None

                                                                                                                                              for _candidate in selfleading_candidates

                                                                                                                                              if _candidate = ranking[-1][0]

                                                                                                                                              ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                                                              _candidate])

                                                                                                                                              buried = _candidate

                                                                                                                                              break

                                                                                                                                              i = 1

                                                                                                                                              for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                                                              if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                                                                                                              buried]

                                                                                                                                              continue

                                                                                                                                              else

                                                                                                                                              ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                              selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                                              CANDIDATE_INDEX]])

                                                                                                                                              i += 1

                                                                                                                                              selfrankings_changed[voter_index] = ranking

                                                                                                                                              78

                                                                                                                                              APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                                                                                                              Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                                                                                                              for voter_index in selfvotes[candidate]

                                                                                                                                              if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                                                                                                              ]

                                                                                                                                              for _candidate in selfleading_candidates

                                                                                                                                              if _candidate = candidate

                                                                                                                                              ranking = [None]selfelecN_CANDIDATES

                                                                                                                                              ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                                                              _candidate])

                                                                                                                                              buried = _candidate

                                                                                                                                              break

                                                                                                                                              i = 1

                                                                                                                                              for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                                                              if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                                                                                                              continue

                                                                                                                                              else

                                                                                                                                              ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                              selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                                              CANDIDATE_INDEX]])

                                                                                                                                              i += 1

                                                                                                                                              selfrankings_changed[voter_index] = ranking

                                                                                                                                              79

                                                                                                                                              APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                                                                                                              Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                                                                                                              for index in range(selfelecN_CANDIDATES)

                                                                                                                                              selfcandidates[index] = 0

                                                                                                                                              for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                              score = 0

                                                                                                                                              if voter_index in selfrankings_changed

                                                                                                                                              for candidate in selfrankings_changed[voter_index]

                                                                                                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                                                              score += 1

                                                                                                                                              else

                                                                                                                                              for candidate in voter

                                                                                                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                                                              score += 1

                                                                                                                                              APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                                                                                                              Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                                                                                                              for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                              if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                                                              elecCANDIDATE_INDEX]]

                                                                                                                                              selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                                                                                                              sorted_voters[voter_index])

                                                                                                                                              for candidate_index candidate in enumerate(reversed(voter))

                                                                                                                                              if candidate_index == 0

                                                                                                                                              selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                                                              voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                                                                                                              else

                                                                                                                                              selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                                                              voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                                                                                                              80

                                                                                                                                              APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                                                                                                              Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                                                                                                              for index in range(selfelecN_CANDIDATES)

                                                                                                                                              selfcandidates[index] = 0

                                                                                                                                              for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                              if voter_index in selfrankings_changed

                                                                                                                                              for candidate in selfrankings_changed[voter_index]

                                                                                                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                                                              selfelecCANDIDATE_RANK]

                                                                                                                                              else

                                                                                                                                              for candidate in voter

                                                                                                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                                                              selfelecCANDIDATE_RANK]

                                                                                                                                              APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                                                                                                              Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                                                                                                              for index in range(selfelecN_CANDIDATES)

                                                                                                                                              selfcandidates[index] = 0

                                                                                                                                              for voter in selfelecsorted_voters

                                                                                                                                              votes = selfelecN_VACANCIES

                                                                                                                                              for candidate in reversed(voter)

                                                                                                                                              if votes == 0

                                                                                                                                              break

                                                                                                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                              votes -= 1

                                                                                                                                              • Folha de aprovaccedilatildeo
                                                                                                                                              • Agradecimentos
                                                                                                                                              • Epiacutegrafe
                                                                                                                                              • Resumo
                                                                                                                                              • Abstract
                                                                                                                                              • Lista de ilustraccedilotildees
                                                                                                                                              • Lista de Coacutedigos
                                                                                                                                              • Lista de tabelas
                                                                                                                                              • Lista de abreviaturas e siglas
                                                                                                                                              • Sumaacuterio
                                                                                                                                              • INTRODUCcedilAtildeO
                                                                                                                                                • MOTIVACcedilAtildeO E OBJETIVO
                                                                                                                                                • MEacuteTODO
                                                                                                                                                • ESTRUTURA
                                                                                                                                                  • SISTEMAS ELEITORAIS
                                                                                                                                                    • FISRT PAST THE POST
                                                                                                                                                      • Exemplo
                                                                                                                                                      • Vantagens e Desvantagens do FPTP
                                                                                                                                                      • Voto Uacutetil no FPTP
                                                                                                                                                        • TWO-ROUND SYSTEM
                                                                                                                                                          • Exemplo
                                                                                                                                                          • Vantagens e Desvantagens do TRS
                                                                                                                                                          • Voto Uacutetil no TRS
                                                                                                                                                            • INSTANT-RUNOFF VOTING
                                                                                                                                                              • Exemplo
                                                                                                                                                              • Vantagens e Desvantagens do IRV
                                                                                                                                                              • Voto Uacutetil no IRV
                                                                                                                                                                • APPROVAL VOTING SYSTEM
                                                                                                                                                                  • Exemplo
                                                                                                                                                                  • Vantagens e Desvantagens do AVS
                                                                                                                                                                  • Voto Uacutetil no AVS
                                                                                                                                                                    • THE BORDA COUNT
                                                                                                                                                                      • Exemplo
                                                                                                                                                                      • Vantagens e Desvantagens do BC
                                                                                                                                                                      • Voto Uacutetil no BC
                                                                                                                                                                        • SCORE VOTING SYSTEM
                                                                                                                                                                          • Exemplo
                                                                                                                                                                          • Vantagens e Desvantagens do SVS
                                                                                                                                                                          • Voto Uacutetil no SVS
                                                                                                                                                                            • BLOC VOTE
                                                                                                                                                                              • Exemplo
                                                                                                                                                                              • Voto Uacutetil no BV
                                                                                                                                                                                  • O SIMULADOR
                                                                                                                                                                                  • CENAacuteRIOS PERTINENTES
                                                                                                                                                                                    • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                                                                                                    • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                                                                                                    • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                                                                                                    • CENAacuteRIO 4 COALIZOtildeES
                                                                                                                                                                                    • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                                                                                                    • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                                                                                                      • COMO FUNCIONA O SIMULADOR
                                                                                                                                                                                        • CLASSE Elections
                                                                                                                                                                                        • CLASSE FirstPastThePost
                                                                                                                                                                                        • CLASSE TwoRoundSystem
                                                                                                                                                                                        • CLASSE InstantRunoffVoting
                                                                                                                                                                                        • CLASSE ApprovalVoting
                                                                                                                                                                                        • CLASSE BordaCount
                                                                                                                                                                                        • CLASSE ScoreVoting
                                                                                                                                                                                        • CLASSE BlocVote
                                                                                                                                                                                        • TECNOLOGIAS UTILIZADAS
                                                                                                                                                                                          • CONCLUSAtildeO
                                                                                                                                                                                          • Referecircncias
                                                                                                                                                                                          • Meacutetodo create_voters
                                                                                                                                                                                          • Meacutetodo create_candidates
                                                                                                                                                                                          • Meacutetodo calculate_means
                                                                                                                                                                                          • Meacutetodo get_mean
                                                                                                                                                                                          • Meacutetodo calculate_mean
                                                                                                                                                                                          • Meacutetodo set_leading_candidates
                                                                                                                                                                                          • Meacutetodo irv_set_leading_candidates
                                                                                                                                                                                          • Meacutetodo sort_ranks
                                                                                                                                                                                          • Meacutetodo fptp_count_tactical_votes
                                                                                                                                                                                          • Meacutetodo fptp_count_minority_votes
                                                                                                                                                                                          • Meacutetodo trs_second_round
                                                                                                                                                                                          • Meacutetodo trs_account_for_coalitions
                                                                                                                                                                                          • Meacutetodo irv_count_votes
                                                                                                                                                                                          • Meacutetodo avs_count_votes
                                                                                                                                                                                          • Meacutetodo avs_count_votes_with_tactical
                                                                                                                                                                                          • Meacutetodo irv_apply_tactical_votes
                                                                                                                                                                                          • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                                                                                                          • Meacutetodo bc_sum_candidates_scores
                                                                                                                                                                                          • Meacutetodo svs_apply_tactical_votes
                                                                                                                                                                                          • Meacutetodo svs_sum_candidates_scores
                                                                                                                                                                                          • Meacutetodo bv_count_votes

                                                                                                                                                72

                                                                                                                                                APEcircNDICE J ndash MEacuteTODO FPTP_COUNT_MINORITY_VOTES

                                                                                                                                                Coacutedigo J1 ndash Meacutetodo fptp_count_minority_votesdef count_minority_votes(self)

                                                                                                                                                half_vacancies = mathfloor(selfelecN_VACANCIES2)

                                                                                                                                                for candidate in selfelecleading_candidates

                                                                                                                                                if selfelecleading_candidatesindex(candidate) gt= half_vacancies

                                                                                                                                                continue

                                                                                                                                                for voter_index in selfvotes_copy[candidate]

                                                                                                                                                if voter_index in selfrankings_changed

                                                                                                                                                ranking = selfrankings_changed[voter_index]

                                                                                                                                                else

                                                                                                                                                ranking = copydeepcopy(selfelecsorted_voters[voter_index

                                                                                                                                                ])

                                                                                                                                                for index _candidate in enumerate(reversed(ranking))

                                                                                                                                                if _candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                                                leading_candidates or (_candidate[selfelec

                                                                                                                                                CANDIDATE_INDEX] in selfelecleading_candidates and

                                                                                                                                                selfelecleading_candidatesindex(_candidate[selfelec

                                                                                                                                                CANDIDATE_INDEX]) gt= half_vacancies)

                                                                                                                                                if _candidate[selfelecCANDIDATE_RANK] gt= 0

                                                                                                                                                if randomrandom() lt selfelec

                                                                                                                                                minority_vote_percentages[_candidate[selfelec

                                                                                                                                                CANDIDATE_INDEX]]

                                                                                                                                                selfcandidates[candidate] -= 1

                                                                                                                                                selfcandidates[_candidate[selfelec

                                                                                                                                                CANDIDATE_INDEX]] += 1

                                                                                                                                                break

                                                                                                                                                break

                                                                                                                                                break

                                                                                                                                                73

                                                                                                                                                APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                                                                                                                                Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                                                                                                                                self_account_for_coalitions()

                                                                                                                                                for candidate in selfvotes

                                                                                                                                                if candidate = selfwinner and candidate = selfsecond_place

                                                                                                                                                for voter_index in selfvotes[candidate]

                                                                                                                                                if voter_index in selfrankings_changed

                                                                                                                                                ranking = selfrankings_changed[voter_index]

                                                                                                                                                else

                                                                                                                                                ranking = copydeepcopy(selfelecsorted_voters[

                                                                                                                                                voter_index])

                                                                                                                                                for index2 candidate in enumerate(reversed(ranking))

                                                                                                                                                if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                                                                                                                                selfcandidates[selfwinner] += 1

                                                                                                                                                selfvotes[selfwinner]add(voter_index)

                                                                                                                                                break

                                                                                                                                                elif candidate[selfelecCANDIDATE_INDEX] == self

                                                                                                                                                second_place

                                                                                                                                                selfcandidates[selfsecond_place] += 1

                                                                                                                                                selfvotes[selfsecond_place]add(voter_index)

                                                                                                                                                break

                                                                                                                                                selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                                                                winners = []

                                                                                                                                                vacancies = selfelecN_VACANCIES

                                                                                                                                                for candidate in reversed(selfsorted_candidates)

                                                                                                                                                if vacancies == 0

                                                                                                                                                break

                                                                                                                                                winnersappend(candidate[0])

                                                                                                                                                vacancies -= 1

                                                                                                                                                mean chose_best = selfelecget_mean(winners = winners)

                                                                                                                                                74

                                                                                                                                                APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                                                                                                                                Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                                                                                                                                for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                                voter_dict = dict()

                                                                                                                                                og_voter_dict = dict()

                                                                                                                                                for tup in voter

                                                                                                                                                voter_dict[tup[0]] = tup[1]

                                                                                                                                                og_voter_dict[tup[0]] = tup[1]

                                                                                                                                                for coalition in selfeleccoalitions

                                                                                                                                                for candidate in coalition

                                                                                                                                                add_to_score = 0

                                                                                                                                                for candidate2 in coalition

                                                                                                                                                if candidate == candidate2

                                                                                                                                                continue

                                                                                                                                                half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                                                                                                                                if half lt 0

                                                                                                                                                add_to_score += mathceil(half)

                                                                                                                                                else

                                                                                                                                                add_to_score += mathfloor(half)

                                                                                                                                                if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                                                                                                                                voter_dict[candidate[rsquovaluersquo]] = 10

                                                                                                                                                elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                                                                                                                                voter_dict[candidate[rsquovaluersquo]] = -10

                                                                                                                                                else

                                                                                                                                                voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                                                                                                                                selfrankings_changed[voter_index] = []

                                                                                                                                                for candidate in voter_dict

                                                                                                                                                selfrankings_changed[voter_index]append((candidate voter_dict[

                                                                                                                                                candidate]))

                                                                                                                                                selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                                                                                                                                voter_index] key=lambda x x[1])

                                                                                                                                                75

                                                                                                                                                APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                                                                                                                Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                                                                                                                selfelecroundsappend(selfsorted_candidates[_round])

                                                                                                                                                if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                                                                N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                                                                                                                N_VACANCIES - 1)

                                                                                                                                                return 2

                                                                                                                                                elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                                                                N_VOTERS gt 05)

                                                                                                                                                return 1

                                                                                                                                                else

                                                                                                                                                selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                                                                                                                CANDIDATE_INDEX])

                                                                                                                                                for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                                                                                                                elecCANDIDATE_INDEX]]

                                                                                                                                                if voter_index in selfrankings_changed

                                                                                                                                                for candidate in reversed(selfrankings_changed[voter_index

                                                                                                                                                ])

                                                                                                                                                if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                                                excluded

                                                                                                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                                                                ]] += 1

                                                                                                                                                selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                                                                add(voter_index)

                                                                                                                                                break

                                                                                                                                                else

                                                                                                                                                continue

                                                                                                                                                else

                                                                                                                                                for candidate in reversed(selfelecsorted_voters[

                                                                                                                                                voter_index])

                                                                                                                                                if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                                                excluded

                                                                                                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                                                                ]] += 1

                                                                                                                                                selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                                                                add(voter_index)

                                                                                                                                                break

                                                                                                                                                else

                                                                                                                                                continue

                                                                                                                                                selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                                                                return 0

                                                                                                                                                76

                                                                                                                                                APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                                                                                                                Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                                                                                                                for index in range(selfelecN_CANDIDATES)

                                                                                                                                                selfcandidates[index] = 0

                                                                                                                                                for voter in selfelecsorted_voters

                                                                                                                                                for candidate in reversed(voter)

                                                                                                                                                if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                                else

                                                                                                                                                break

                                                                                                                                                APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                                                                                                                Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                                                                                                                for index in range(selfelecN_CANDIDATES)

                                                                                                                                                selfcandidates[index] = 0

                                                                                                                                                for voter in selfelecsorted_voters

                                                                                                                                                if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                                                                elecCANDIDATE_INDEX]]

                                                                                                                                                selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                                else

                                                                                                                                                for candidate in reversed(voter)

                                                                                                                                                if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                                else

                                                                                                                                                break

                                                                                                                                                77

                                                                                                                                                APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                                                                                                                Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                                                                                                                pos = set()

                                                                                                                                                for index perc in enumerate(selfelectactical_vote_percentages)

                                                                                                                                                if perc gt 0

                                                                                                                                                posadd(index)

                                                                                                                                                for candidate in selfeleccandidates

                                                                                                                                                if candidate not in selfleading_candidates

                                                                                                                                                for voter_index in selfvotes[candidate]

                                                                                                                                                raised = None

                                                                                                                                                for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                                                                                                                ])

                                                                                                                                                if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                                                                                                                leading_candidates

                                                                                                                                                if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                                                                                                                if randomrandom() lt selfelectactical_vote_percentages[

                                                                                                                                                candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                                                                                                                ranking = [None]selfelecN_CANDIDATES

                                                                                                                                                ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                                selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                                                CANDIDATE_INDEX]])

                                                                                                                                                raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                                break

                                                                                                                                                break

                                                                                                                                                break

                                                                                                                                                if raised = None

                                                                                                                                                for _candidate in selfleading_candidates

                                                                                                                                                if _candidate = ranking[-1][0]

                                                                                                                                                ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                                                                _candidate])

                                                                                                                                                buried = _candidate

                                                                                                                                                break

                                                                                                                                                i = 1

                                                                                                                                                for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                                                                if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                                                                                                                buried]

                                                                                                                                                continue

                                                                                                                                                else

                                                                                                                                                ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                                selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                                                CANDIDATE_INDEX]])

                                                                                                                                                i += 1

                                                                                                                                                selfrankings_changed[voter_index] = ranking

                                                                                                                                                78

                                                                                                                                                APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                                                                                                                Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                                                                                                                for voter_index in selfvotes[candidate]

                                                                                                                                                if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                                                                                                                ]

                                                                                                                                                for _candidate in selfleading_candidates

                                                                                                                                                if _candidate = candidate

                                                                                                                                                ranking = [None]selfelecN_CANDIDATES

                                                                                                                                                ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                                                                _candidate])

                                                                                                                                                buried = _candidate

                                                                                                                                                break

                                                                                                                                                i = 1

                                                                                                                                                for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                                                                if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                                                                                                                continue

                                                                                                                                                else

                                                                                                                                                ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                                selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                                                CANDIDATE_INDEX]])

                                                                                                                                                i += 1

                                                                                                                                                selfrankings_changed[voter_index] = ranking

                                                                                                                                                79

                                                                                                                                                APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                                                                                                                Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                                                                                                                for index in range(selfelecN_CANDIDATES)

                                                                                                                                                selfcandidates[index] = 0

                                                                                                                                                for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                                score = 0

                                                                                                                                                if voter_index in selfrankings_changed

                                                                                                                                                for candidate in selfrankings_changed[voter_index]

                                                                                                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                                                                score += 1

                                                                                                                                                else

                                                                                                                                                for candidate in voter

                                                                                                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                                                                score += 1

                                                                                                                                                APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                                                                                                                Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                                                                                                                for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                                if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                                                                elecCANDIDATE_INDEX]]

                                                                                                                                                selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                                                                                                                sorted_voters[voter_index])

                                                                                                                                                for candidate_index candidate in enumerate(reversed(voter))

                                                                                                                                                if candidate_index == 0

                                                                                                                                                selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                                                                voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                                                                                                                else

                                                                                                                                                selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                                                                voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                                                                                                                80

                                                                                                                                                APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                                                                                                                Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                                                                                                                for index in range(selfelecN_CANDIDATES)

                                                                                                                                                selfcandidates[index] = 0

                                                                                                                                                for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                                if voter_index in selfrankings_changed

                                                                                                                                                for candidate in selfrankings_changed[voter_index]

                                                                                                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                                                                selfelecCANDIDATE_RANK]

                                                                                                                                                else

                                                                                                                                                for candidate in voter

                                                                                                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                                                                selfelecCANDIDATE_RANK]

                                                                                                                                                APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                                                                                                                Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                                                                                                                for index in range(selfelecN_CANDIDATES)

                                                                                                                                                selfcandidates[index] = 0

                                                                                                                                                for voter in selfelecsorted_voters

                                                                                                                                                votes = selfelecN_VACANCIES

                                                                                                                                                for candidate in reversed(voter)

                                                                                                                                                if votes == 0

                                                                                                                                                break

                                                                                                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                                votes -= 1

                                                                                                                                                • Folha de aprovaccedilatildeo
                                                                                                                                                • Agradecimentos
                                                                                                                                                • Epiacutegrafe
                                                                                                                                                • Resumo
                                                                                                                                                • Abstract
                                                                                                                                                • Lista de ilustraccedilotildees
                                                                                                                                                • Lista de Coacutedigos
                                                                                                                                                • Lista de tabelas
                                                                                                                                                • Lista de abreviaturas e siglas
                                                                                                                                                • Sumaacuterio
                                                                                                                                                • INTRODUCcedilAtildeO
                                                                                                                                                  • MOTIVACcedilAtildeO E OBJETIVO
                                                                                                                                                  • MEacuteTODO
                                                                                                                                                  • ESTRUTURA
                                                                                                                                                    • SISTEMAS ELEITORAIS
                                                                                                                                                      • FISRT PAST THE POST
                                                                                                                                                        • Exemplo
                                                                                                                                                        • Vantagens e Desvantagens do FPTP
                                                                                                                                                        • Voto Uacutetil no FPTP
                                                                                                                                                          • TWO-ROUND SYSTEM
                                                                                                                                                            • Exemplo
                                                                                                                                                            • Vantagens e Desvantagens do TRS
                                                                                                                                                            • Voto Uacutetil no TRS
                                                                                                                                                              • INSTANT-RUNOFF VOTING
                                                                                                                                                                • Exemplo
                                                                                                                                                                • Vantagens e Desvantagens do IRV
                                                                                                                                                                • Voto Uacutetil no IRV
                                                                                                                                                                  • APPROVAL VOTING SYSTEM
                                                                                                                                                                    • Exemplo
                                                                                                                                                                    • Vantagens e Desvantagens do AVS
                                                                                                                                                                    • Voto Uacutetil no AVS
                                                                                                                                                                      • THE BORDA COUNT
                                                                                                                                                                        • Exemplo
                                                                                                                                                                        • Vantagens e Desvantagens do BC
                                                                                                                                                                        • Voto Uacutetil no BC
                                                                                                                                                                          • SCORE VOTING SYSTEM
                                                                                                                                                                            • Exemplo
                                                                                                                                                                            • Vantagens e Desvantagens do SVS
                                                                                                                                                                            • Voto Uacutetil no SVS
                                                                                                                                                                              • BLOC VOTE
                                                                                                                                                                                • Exemplo
                                                                                                                                                                                • Voto Uacutetil no BV
                                                                                                                                                                                    • O SIMULADOR
                                                                                                                                                                                    • CENAacuteRIOS PERTINENTES
                                                                                                                                                                                      • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                                                                                                      • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                                                                                                      • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                                                                                                      • CENAacuteRIO 4 COALIZOtildeES
                                                                                                                                                                                      • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                                                                                                      • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                                                                                                        • COMO FUNCIONA O SIMULADOR
                                                                                                                                                                                          • CLASSE Elections
                                                                                                                                                                                          • CLASSE FirstPastThePost
                                                                                                                                                                                          • CLASSE TwoRoundSystem
                                                                                                                                                                                          • CLASSE InstantRunoffVoting
                                                                                                                                                                                          • CLASSE ApprovalVoting
                                                                                                                                                                                          • CLASSE BordaCount
                                                                                                                                                                                          • CLASSE ScoreVoting
                                                                                                                                                                                          • CLASSE BlocVote
                                                                                                                                                                                          • TECNOLOGIAS UTILIZADAS
                                                                                                                                                                                            • CONCLUSAtildeO
                                                                                                                                                                                            • Referecircncias
                                                                                                                                                                                            • Meacutetodo create_voters
                                                                                                                                                                                            • Meacutetodo create_candidates
                                                                                                                                                                                            • Meacutetodo calculate_means
                                                                                                                                                                                            • Meacutetodo get_mean
                                                                                                                                                                                            • Meacutetodo calculate_mean
                                                                                                                                                                                            • Meacutetodo set_leading_candidates
                                                                                                                                                                                            • Meacutetodo irv_set_leading_candidates
                                                                                                                                                                                            • Meacutetodo sort_ranks
                                                                                                                                                                                            • Meacutetodo fptp_count_tactical_votes
                                                                                                                                                                                            • Meacutetodo fptp_count_minority_votes
                                                                                                                                                                                            • Meacutetodo trs_second_round
                                                                                                                                                                                            • Meacutetodo trs_account_for_coalitions
                                                                                                                                                                                            • Meacutetodo irv_count_votes
                                                                                                                                                                                            • Meacutetodo avs_count_votes
                                                                                                                                                                                            • Meacutetodo avs_count_votes_with_tactical
                                                                                                                                                                                            • Meacutetodo irv_apply_tactical_votes
                                                                                                                                                                                            • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                                                                                                            • Meacutetodo bc_sum_candidates_scores
                                                                                                                                                                                            • Meacutetodo svs_apply_tactical_votes
                                                                                                                                                                                            • Meacutetodo svs_sum_candidates_scores
                                                                                                                                                                                            • Meacutetodo bv_count_votes

                                                                                                                                                  73

                                                                                                                                                  APEcircNDICE K ndash MEacuteTODO TRS_SECOND_ROUND

                                                                                                                                                  Coacutedigo K1 ndash Meacutetodo trs_second_rounddef trs_second_round(self)

                                                                                                                                                  self_account_for_coalitions()

                                                                                                                                                  for candidate in selfvotes

                                                                                                                                                  if candidate = selfwinner and candidate = selfsecond_place

                                                                                                                                                  for voter_index in selfvotes[candidate]

                                                                                                                                                  if voter_index in selfrankings_changed

                                                                                                                                                  ranking = selfrankings_changed[voter_index]

                                                                                                                                                  else

                                                                                                                                                  ranking = copydeepcopy(selfelecsorted_voters[

                                                                                                                                                  voter_index])

                                                                                                                                                  for index2 candidate in enumerate(reversed(ranking))

                                                                                                                                                  if candidate[selfelecCANDIDATE_INDEX] == selfwinner

                                                                                                                                                  selfcandidates[selfwinner] += 1

                                                                                                                                                  selfvotes[selfwinner]add(voter_index)

                                                                                                                                                  break

                                                                                                                                                  elif candidate[selfelecCANDIDATE_INDEX] == self

                                                                                                                                                  second_place

                                                                                                                                                  selfcandidates[selfsecond_place] += 1

                                                                                                                                                  selfvotes[selfsecond_place]add(voter_index)

                                                                                                                                                  break

                                                                                                                                                  selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                                                                  winners = []

                                                                                                                                                  vacancies = selfelecN_VACANCIES

                                                                                                                                                  for candidate in reversed(selfsorted_candidates)

                                                                                                                                                  if vacancies == 0

                                                                                                                                                  break

                                                                                                                                                  winnersappend(candidate[0])

                                                                                                                                                  vacancies -= 1

                                                                                                                                                  mean chose_best = selfelecget_mean(winners = winners)

                                                                                                                                                  74

                                                                                                                                                  APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                                                                                                                                  Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                                                                                                                                  for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                                  voter_dict = dict()

                                                                                                                                                  og_voter_dict = dict()

                                                                                                                                                  for tup in voter

                                                                                                                                                  voter_dict[tup[0]] = tup[1]

                                                                                                                                                  og_voter_dict[tup[0]] = tup[1]

                                                                                                                                                  for coalition in selfeleccoalitions

                                                                                                                                                  for candidate in coalition

                                                                                                                                                  add_to_score = 0

                                                                                                                                                  for candidate2 in coalition

                                                                                                                                                  if candidate == candidate2

                                                                                                                                                  continue

                                                                                                                                                  half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                                                                                                                                  if half lt 0

                                                                                                                                                  add_to_score += mathceil(half)

                                                                                                                                                  else

                                                                                                                                                  add_to_score += mathfloor(half)

                                                                                                                                                  if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                                                                                                                                  voter_dict[candidate[rsquovaluersquo]] = 10

                                                                                                                                                  elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                                                                                                                                  voter_dict[candidate[rsquovaluersquo]] = -10

                                                                                                                                                  else

                                                                                                                                                  voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                                                                                                                                  selfrankings_changed[voter_index] = []

                                                                                                                                                  for candidate in voter_dict

                                                                                                                                                  selfrankings_changed[voter_index]append((candidate voter_dict[

                                                                                                                                                  candidate]))

                                                                                                                                                  selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                                                                                                                                  voter_index] key=lambda x x[1])

                                                                                                                                                  75

                                                                                                                                                  APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                                                                                                                  Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                                                                                                                  selfelecroundsappend(selfsorted_candidates[_round])

                                                                                                                                                  if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                                                                  N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                                                                                                                  N_VACANCIES - 1)

                                                                                                                                                  return 2

                                                                                                                                                  elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                                                                  N_VOTERS gt 05)

                                                                                                                                                  return 1

                                                                                                                                                  else

                                                                                                                                                  selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                                                                                                                  CANDIDATE_INDEX])

                                                                                                                                                  for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                                                                                                                  elecCANDIDATE_INDEX]]

                                                                                                                                                  if voter_index in selfrankings_changed

                                                                                                                                                  for candidate in reversed(selfrankings_changed[voter_index

                                                                                                                                                  ])

                                                                                                                                                  if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                                                  excluded

                                                                                                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                                                                  ]] += 1

                                                                                                                                                  selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                                                                  add(voter_index)

                                                                                                                                                  break

                                                                                                                                                  else

                                                                                                                                                  continue

                                                                                                                                                  else

                                                                                                                                                  for candidate in reversed(selfelecsorted_voters[

                                                                                                                                                  voter_index])

                                                                                                                                                  if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                                                  excluded

                                                                                                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                                                                  ]] += 1

                                                                                                                                                  selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                                                                  add(voter_index)

                                                                                                                                                  break

                                                                                                                                                  else

                                                                                                                                                  continue

                                                                                                                                                  selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                                                                  return 0

                                                                                                                                                  76

                                                                                                                                                  APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                                                                                                                  Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                                                                                                                  for index in range(selfelecN_CANDIDATES)

                                                                                                                                                  selfcandidates[index] = 0

                                                                                                                                                  for voter in selfelecsorted_voters

                                                                                                                                                  for candidate in reversed(voter)

                                                                                                                                                  if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                                  else

                                                                                                                                                  break

                                                                                                                                                  APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                                                                                                                  Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                                                                                                                  for index in range(selfelecN_CANDIDATES)

                                                                                                                                                  selfcandidates[index] = 0

                                                                                                                                                  for voter in selfelecsorted_voters

                                                                                                                                                  if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                                                                  elecCANDIDATE_INDEX]]

                                                                                                                                                  selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                                  else

                                                                                                                                                  for candidate in reversed(voter)

                                                                                                                                                  if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                                  else

                                                                                                                                                  break

                                                                                                                                                  77

                                                                                                                                                  APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                                                                                                                  Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                                                                                                                  pos = set()

                                                                                                                                                  for index perc in enumerate(selfelectactical_vote_percentages)

                                                                                                                                                  if perc gt 0

                                                                                                                                                  posadd(index)

                                                                                                                                                  for candidate in selfeleccandidates

                                                                                                                                                  if candidate not in selfleading_candidates

                                                                                                                                                  for voter_index in selfvotes[candidate]

                                                                                                                                                  raised = None

                                                                                                                                                  for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                                                                                                                  ])

                                                                                                                                                  if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                                                                                                                  leading_candidates

                                                                                                                                                  if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                                                                                                                  if randomrandom() lt selfelectactical_vote_percentages[

                                                                                                                                                  candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                                                                                                                  ranking = [None]selfelecN_CANDIDATES

                                                                                                                                                  ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                                  selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                                                  CANDIDATE_INDEX]])

                                                                                                                                                  raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                                  break

                                                                                                                                                  break

                                                                                                                                                  break

                                                                                                                                                  if raised = None

                                                                                                                                                  for _candidate in selfleading_candidates

                                                                                                                                                  if _candidate = ranking[-1][0]

                                                                                                                                                  ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                                                                  _candidate])

                                                                                                                                                  buried = _candidate

                                                                                                                                                  break

                                                                                                                                                  i = 1

                                                                                                                                                  for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                                                                  if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                                                                                                                  buried]

                                                                                                                                                  continue

                                                                                                                                                  else

                                                                                                                                                  ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                                  selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                                                  CANDIDATE_INDEX]])

                                                                                                                                                  i += 1

                                                                                                                                                  selfrankings_changed[voter_index] = ranking

                                                                                                                                                  78

                                                                                                                                                  APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                                                                                                                  Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                                                                                                                  for voter_index in selfvotes[candidate]

                                                                                                                                                  if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                                                                                                                  ]

                                                                                                                                                  for _candidate in selfleading_candidates

                                                                                                                                                  if _candidate = candidate

                                                                                                                                                  ranking = [None]selfelecN_CANDIDATES

                                                                                                                                                  ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                                                                  _candidate])

                                                                                                                                                  buried = _candidate

                                                                                                                                                  break

                                                                                                                                                  i = 1

                                                                                                                                                  for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                                                                  if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                                                                                                                  continue

                                                                                                                                                  else

                                                                                                                                                  ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                                  selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                                                  CANDIDATE_INDEX]])

                                                                                                                                                  i += 1

                                                                                                                                                  selfrankings_changed[voter_index] = ranking

                                                                                                                                                  79

                                                                                                                                                  APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                                                                                                                  Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                                                                                                                  for index in range(selfelecN_CANDIDATES)

                                                                                                                                                  selfcandidates[index] = 0

                                                                                                                                                  for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                                  score = 0

                                                                                                                                                  if voter_index in selfrankings_changed

                                                                                                                                                  for candidate in selfrankings_changed[voter_index]

                                                                                                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                                                                  score += 1

                                                                                                                                                  else

                                                                                                                                                  for candidate in voter

                                                                                                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                                                                  score += 1

                                                                                                                                                  APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                                                                                                                  Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                                                                                                                  for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                                  if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                                                                  elecCANDIDATE_INDEX]]

                                                                                                                                                  selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                                                                                                                  sorted_voters[voter_index])

                                                                                                                                                  for candidate_index candidate in enumerate(reversed(voter))

                                                                                                                                                  if candidate_index == 0

                                                                                                                                                  selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                                                                  voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                                                                                                                  else

                                                                                                                                                  selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                                                                  voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                                                                                                                  80

                                                                                                                                                  APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                                                                                                                  Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                                                                                                                  for index in range(selfelecN_CANDIDATES)

                                                                                                                                                  selfcandidates[index] = 0

                                                                                                                                                  for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                                  if voter_index in selfrankings_changed

                                                                                                                                                  for candidate in selfrankings_changed[voter_index]

                                                                                                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                                                                  selfelecCANDIDATE_RANK]

                                                                                                                                                  else

                                                                                                                                                  for candidate in voter

                                                                                                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                                                                  selfelecCANDIDATE_RANK]

                                                                                                                                                  APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                                                                                                                  Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                                                                                                                  for index in range(selfelecN_CANDIDATES)

                                                                                                                                                  selfcandidates[index] = 0

                                                                                                                                                  for voter in selfelecsorted_voters

                                                                                                                                                  votes = selfelecN_VACANCIES

                                                                                                                                                  for candidate in reversed(voter)

                                                                                                                                                  if votes == 0

                                                                                                                                                  break

                                                                                                                                                  selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                                  votes -= 1

                                                                                                                                                  • Folha de aprovaccedilatildeo
                                                                                                                                                  • Agradecimentos
                                                                                                                                                  • Epiacutegrafe
                                                                                                                                                  • Resumo
                                                                                                                                                  • Abstract
                                                                                                                                                  • Lista de ilustraccedilotildees
                                                                                                                                                  • Lista de Coacutedigos
                                                                                                                                                  • Lista de tabelas
                                                                                                                                                  • Lista de abreviaturas e siglas
                                                                                                                                                  • Sumaacuterio
                                                                                                                                                  • INTRODUCcedilAtildeO
                                                                                                                                                    • MOTIVACcedilAtildeO E OBJETIVO
                                                                                                                                                    • MEacuteTODO
                                                                                                                                                    • ESTRUTURA
                                                                                                                                                      • SISTEMAS ELEITORAIS
                                                                                                                                                        • FISRT PAST THE POST
                                                                                                                                                          • Exemplo
                                                                                                                                                          • Vantagens e Desvantagens do FPTP
                                                                                                                                                          • Voto Uacutetil no FPTP
                                                                                                                                                            • TWO-ROUND SYSTEM
                                                                                                                                                              • Exemplo
                                                                                                                                                              • Vantagens e Desvantagens do TRS
                                                                                                                                                              • Voto Uacutetil no TRS
                                                                                                                                                                • INSTANT-RUNOFF VOTING
                                                                                                                                                                  • Exemplo
                                                                                                                                                                  • Vantagens e Desvantagens do IRV
                                                                                                                                                                  • Voto Uacutetil no IRV
                                                                                                                                                                    • APPROVAL VOTING SYSTEM
                                                                                                                                                                      • Exemplo
                                                                                                                                                                      • Vantagens e Desvantagens do AVS
                                                                                                                                                                      • Voto Uacutetil no AVS
                                                                                                                                                                        • THE BORDA COUNT
                                                                                                                                                                          • Exemplo
                                                                                                                                                                          • Vantagens e Desvantagens do BC
                                                                                                                                                                          • Voto Uacutetil no BC
                                                                                                                                                                            • SCORE VOTING SYSTEM
                                                                                                                                                                              • Exemplo
                                                                                                                                                                              • Vantagens e Desvantagens do SVS
                                                                                                                                                                              • Voto Uacutetil no SVS
                                                                                                                                                                                • BLOC VOTE
                                                                                                                                                                                  • Exemplo
                                                                                                                                                                                  • Voto Uacutetil no BV
                                                                                                                                                                                      • O SIMULADOR
                                                                                                                                                                                      • CENAacuteRIOS PERTINENTES
                                                                                                                                                                                        • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                                                                                                        • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                                                                                                        • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                                                                                                        • CENAacuteRIO 4 COALIZOtildeES
                                                                                                                                                                                        • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                                                                                                        • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                                                                                                          • COMO FUNCIONA O SIMULADOR
                                                                                                                                                                                            • CLASSE Elections
                                                                                                                                                                                            • CLASSE FirstPastThePost
                                                                                                                                                                                            • CLASSE TwoRoundSystem
                                                                                                                                                                                            • CLASSE InstantRunoffVoting
                                                                                                                                                                                            • CLASSE ApprovalVoting
                                                                                                                                                                                            • CLASSE BordaCount
                                                                                                                                                                                            • CLASSE ScoreVoting
                                                                                                                                                                                            • CLASSE BlocVote
                                                                                                                                                                                            • TECNOLOGIAS UTILIZADAS
                                                                                                                                                                                              • CONCLUSAtildeO
                                                                                                                                                                                              • Referecircncias
                                                                                                                                                                                              • Meacutetodo create_voters
                                                                                                                                                                                              • Meacutetodo create_candidates
                                                                                                                                                                                              • Meacutetodo calculate_means
                                                                                                                                                                                              • Meacutetodo get_mean
                                                                                                                                                                                              • Meacutetodo calculate_mean
                                                                                                                                                                                              • Meacutetodo set_leading_candidates
                                                                                                                                                                                              • Meacutetodo irv_set_leading_candidates
                                                                                                                                                                                              • Meacutetodo sort_ranks
                                                                                                                                                                                              • Meacutetodo fptp_count_tactical_votes
                                                                                                                                                                                              • Meacutetodo fptp_count_minority_votes
                                                                                                                                                                                              • Meacutetodo trs_second_round
                                                                                                                                                                                              • Meacutetodo trs_account_for_coalitions
                                                                                                                                                                                              • Meacutetodo irv_count_votes
                                                                                                                                                                                              • Meacutetodo avs_count_votes
                                                                                                                                                                                              • Meacutetodo avs_count_votes_with_tactical
                                                                                                                                                                                              • Meacutetodo irv_apply_tactical_votes
                                                                                                                                                                                              • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                                                                                                              • Meacutetodo bc_sum_candidates_scores
                                                                                                                                                                                              • Meacutetodo svs_apply_tactical_votes
                                                                                                                                                                                              • Meacutetodo svs_sum_candidates_scores
                                                                                                                                                                                              • Meacutetodo bv_count_votes

                                                                                                                                                    74

                                                                                                                                                    APEcircNDICE L ndash MEacuteTODO TRS_ACCOUNT_FOR_COALITIONS

                                                                                                                                                    Coacutedigo L1 ndash Meacutetodo trs_account_for_coalitionsdef account_for_coalitions(self)

                                                                                                                                                    for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                                    voter_dict = dict()

                                                                                                                                                    og_voter_dict = dict()

                                                                                                                                                    for tup in voter

                                                                                                                                                    voter_dict[tup[0]] = tup[1]

                                                                                                                                                    og_voter_dict[tup[0]] = tup[1]

                                                                                                                                                    for coalition in selfeleccoalitions

                                                                                                                                                    for candidate in coalition

                                                                                                                                                    add_to_score = 0

                                                                                                                                                    for candidate2 in coalition

                                                                                                                                                    if candidate == candidate2

                                                                                                                                                    continue

                                                                                                                                                    half = og_voter_dict[candidate2[rsquovaluersquo]]2

                                                                                                                                                    if half lt 0

                                                                                                                                                    add_to_score += mathceil(half)

                                                                                                                                                    else

                                                                                                                                                    add_to_score += mathfloor(half)

                                                                                                                                                    if voter_dict[candidate[rsquovaluersquo]] + add_to_score gt 10

                                                                                                                                                    voter_dict[candidate[rsquovaluersquo]] = 10

                                                                                                                                                    elif voter_dict[candidate[rsquovaluersquo]] + add_to_score lt -10

                                                                                                                                                    voter_dict[candidate[rsquovaluersquo]] = -10

                                                                                                                                                    else

                                                                                                                                                    voter_dict[candidate[rsquovaluersquo]] += add_to_score

                                                                                                                                                    selfrankings_changed[voter_index] = []

                                                                                                                                                    for candidate in voter_dict

                                                                                                                                                    selfrankings_changed[voter_index]append((candidate voter_dict[

                                                                                                                                                    candidate]))

                                                                                                                                                    selfrankings_changed[voter_index] = sorted(selfrankings_changed[

                                                                                                                                                    voter_index] key=lambda x x[1])

                                                                                                                                                    75

                                                                                                                                                    APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                                                                                                                    Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                                                                                                                    selfelecroundsappend(selfsorted_candidates[_round])

                                                                                                                                                    if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                                                                    N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                                                                                                                    N_VACANCIES - 1)

                                                                                                                                                    return 2

                                                                                                                                                    elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                                                                    N_VOTERS gt 05)

                                                                                                                                                    return 1

                                                                                                                                                    else

                                                                                                                                                    selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                                                                                                                    CANDIDATE_INDEX])

                                                                                                                                                    for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                                                                                                                    elecCANDIDATE_INDEX]]

                                                                                                                                                    if voter_index in selfrankings_changed

                                                                                                                                                    for candidate in reversed(selfrankings_changed[voter_index

                                                                                                                                                    ])

                                                                                                                                                    if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                                                    excluded

                                                                                                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                                                                    ]] += 1

                                                                                                                                                    selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                                                                    add(voter_index)

                                                                                                                                                    break

                                                                                                                                                    else

                                                                                                                                                    continue

                                                                                                                                                    else

                                                                                                                                                    for candidate in reversed(selfelecsorted_voters[

                                                                                                                                                    voter_index])

                                                                                                                                                    if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                                                    excluded

                                                                                                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                                                                    ]] += 1

                                                                                                                                                    selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                                                                    add(voter_index)

                                                                                                                                                    break

                                                                                                                                                    else

                                                                                                                                                    continue

                                                                                                                                                    selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                                                                    return 0

                                                                                                                                                    76

                                                                                                                                                    APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                                                                                                                    Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                                                                                                                    for index in range(selfelecN_CANDIDATES)

                                                                                                                                                    selfcandidates[index] = 0

                                                                                                                                                    for voter in selfelecsorted_voters

                                                                                                                                                    for candidate in reversed(voter)

                                                                                                                                                    if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                                    else

                                                                                                                                                    break

                                                                                                                                                    APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                                                                                                                    Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                                                                                                                    for index in range(selfelecN_CANDIDATES)

                                                                                                                                                    selfcandidates[index] = 0

                                                                                                                                                    for voter in selfelecsorted_voters

                                                                                                                                                    if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                                                                    elecCANDIDATE_INDEX]]

                                                                                                                                                    selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                                    else

                                                                                                                                                    for candidate in reversed(voter)

                                                                                                                                                    if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                                    else

                                                                                                                                                    break

                                                                                                                                                    77

                                                                                                                                                    APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                                                                                                                    Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                                                                                                                    pos = set()

                                                                                                                                                    for index perc in enumerate(selfelectactical_vote_percentages)

                                                                                                                                                    if perc gt 0

                                                                                                                                                    posadd(index)

                                                                                                                                                    for candidate in selfeleccandidates

                                                                                                                                                    if candidate not in selfleading_candidates

                                                                                                                                                    for voter_index in selfvotes[candidate]

                                                                                                                                                    raised = None

                                                                                                                                                    for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                                                                                                                    ])

                                                                                                                                                    if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                                                                                                                    leading_candidates

                                                                                                                                                    if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                                                                                                                    if randomrandom() lt selfelectactical_vote_percentages[

                                                                                                                                                    candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                                                                                                                    ranking = [None]selfelecN_CANDIDATES

                                                                                                                                                    ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                                    selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                                                    CANDIDATE_INDEX]])

                                                                                                                                                    raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                                    break

                                                                                                                                                    break

                                                                                                                                                    break

                                                                                                                                                    if raised = None

                                                                                                                                                    for _candidate in selfleading_candidates

                                                                                                                                                    if _candidate = ranking[-1][0]

                                                                                                                                                    ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                                                                    _candidate])

                                                                                                                                                    buried = _candidate

                                                                                                                                                    break

                                                                                                                                                    i = 1

                                                                                                                                                    for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                                                                    if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                                                                                                                    buried]

                                                                                                                                                    continue

                                                                                                                                                    else

                                                                                                                                                    ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                                    selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                                                    CANDIDATE_INDEX]])

                                                                                                                                                    i += 1

                                                                                                                                                    selfrankings_changed[voter_index] = ranking

                                                                                                                                                    78

                                                                                                                                                    APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                                                                                                                    Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                                                                                                                    for voter_index in selfvotes[candidate]

                                                                                                                                                    if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                                                                                                                    ]

                                                                                                                                                    for _candidate in selfleading_candidates

                                                                                                                                                    if _candidate = candidate

                                                                                                                                                    ranking = [None]selfelecN_CANDIDATES

                                                                                                                                                    ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                                                                    _candidate])

                                                                                                                                                    buried = _candidate

                                                                                                                                                    break

                                                                                                                                                    i = 1

                                                                                                                                                    for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                                                                    if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                                                                                                                    continue

                                                                                                                                                    else

                                                                                                                                                    ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                                    selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                                                    CANDIDATE_INDEX]])

                                                                                                                                                    i += 1

                                                                                                                                                    selfrankings_changed[voter_index] = ranking

                                                                                                                                                    79

                                                                                                                                                    APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                                                                                                                    Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                                                                                                                    for index in range(selfelecN_CANDIDATES)

                                                                                                                                                    selfcandidates[index] = 0

                                                                                                                                                    for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                                    score = 0

                                                                                                                                                    if voter_index in selfrankings_changed

                                                                                                                                                    for candidate in selfrankings_changed[voter_index]

                                                                                                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                                                                    score += 1

                                                                                                                                                    else

                                                                                                                                                    for candidate in voter

                                                                                                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                                                                    score += 1

                                                                                                                                                    APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                                                                                                                    Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                                                                                                                    for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                                    if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                                                                    elecCANDIDATE_INDEX]]

                                                                                                                                                    selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                                                                                                                    sorted_voters[voter_index])

                                                                                                                                                    for candidate_index candidate in enumerate(reversed(voter))

                                                                                                                                                    if candidate_index == 0

                                                                                                                                                    selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                                                                    voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                                                                                                                    else

                                                                                                                                                    selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                                                                    voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                                                                                                                    80

                                                                                                                                                    APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                                                                                                                    Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                                                                                                                    for index in range(selfelecN_CANDIDATES)

                                                                                                                                                    selfcandidates[index] = 0

                                                                                                                                                    for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                                    if voter_index in selfrankings_changed

                                                                                                                                                    for candidate in selfrankings_changed[voter_index]

                                                                                                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                                                                    selfelecCANDIDATE_RANK]

                                                                                                                                                    else

                                                                                                                                                    for candidate in voter

                                                                                                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                                                                    selfelecCANDIDATE_RANK]

                                                                                                                                                    APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                                                                                                                    Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                                                                                                                    for index in range(selfelecN_CANDIDATES)

                                                                                                                                                    selfcandidates[index] = 0

                                                                                                                                                    for voter in selfelecsorted_voters

                                                                                                                                                    votes = selfelecN_VACANCIES

                                                                                                                                                    for candidate in reversed(voter)

                                                                                                                                                    if votes == 0

                                                                                                                                                    break

                                                                                                                                                    selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                                    votes -= 1

                                                                                                                                                    • Folha de aprovaccedilatildeo
                                                                                                                                                    • Agradecimentos
                                                                                                                                                    • Epiacutegrafe
                                                                                                                                                    • Resumo
                                                                                                                                                    • Abstract
                                                                                                                                                    • Lista de ilustraccedilotildees
                                                                                                                                                    • Lista de Coacutedigos
                                                                                                                                                    • Lista de tabelas
                                                                                                                                                    • Lista de abreviaturas e siglas
                                                                                                                                                    • Sumaacuterio
                                                                                                                                                    • INTRODUCcedilAtildeO
                                                                                                                                                      • MOTIVACcedilAtildeO E OBJETIVO
                                                                                                                                                      • MEacuteTODO
                                                                                                                                                      • ESTRUTURA
                                                                                                                                                        • SISTEMAS ELEITORAIS
                                                                                                                                                          • FISRT PAST THE POST
                                                                                                                                                            • Exemplo
                                                                                                                                                            • Vantagens e Desvantagens do FPTP
                                                                                                                                                            • Voto Uacutetil no FPTP
                                                                                                                                                              • TWO-ROUND SYSTEM
                                                                                                                                                                • Exemplo
                                                                                                                                                                • Vantagens e Desvantagens do TRS
                                                                                                                                                                • Voto Uacutetil no TRS
                                                                                                                                                                  • INSTANT-RUNOFF VOTING
                                                                                                                                                                    • Exemplo
                                                                                                                                                                    • Vantagens e Desvantagens do IRV
                                                                                                                                                                    • Voto Uacutetil no IRV
                                                                                                                                                                      • APPROVAL VOTING SYSTEM
                                                                                                                                                                        • Exemplo
                                                                                                                                                                        • Vantagens e Desvantagens do AVS
                                                                                                                                                                        • Voto Uacutetil no AVS
                                                                                                                                                                          • THE BORDA COUNT
                                                                                                                                                                            • Exemplo
                                                                                                                                                                            • Vantagens e Desvantagens do BC
                                                                                                                                                                            • Voto Uacutetil no BC
                                                                                                                                                                              • SCORE VOTING SYSTEM
                                                                                                                                                                                • Exemplo
                                                                                                                                                                                • Vantagens e Desvantagens do SVS
                                                                                                                                                                                • Voto Uacutetil no SVS
                                                                                                                                                                                  • BLOC VOTE
                                                                                                                                                                                    • Exemplo
                                                                                                                                                                                    • Voto Uacutetil no BV
                                                                                                                                                                                        • O SIMULADOR
                                                                                                                                                                                        • CENAacuteRIOS PERTINENTES
                                                                                                                                                                                          • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                                                                                                          • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                                                                                                          • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                                                                                                          • CENAacuteRIO 4 COALIZOtildeES
                                                                                                                                                                                          • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                                                                                                          • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                                                                                                            • COMO FUNCIONA O SIMULADOR
                                                                                                                                                                                              • CLASSE Elections
                                                                                                                                                                                              • CLASSE FirstPastThePost
                                                                                                                                                                                              • CLASSE TwoRoundSystem
                                                                                                                                                                                              • CLASSE InstantRunoffVoting
                                                                                                                                                                                              • CLASSE ApprovalVoting
                                                                                                                                                                                              • CLASSE BordaCount
                                                                                                                                                                                              • CLASSE ScoreVoting
                                                                                                                                                                                              • CLASSE BlocVote
                                                                                                                                                                                              • TECNOLOGIAS UTILIZADAS
                                                                                                                                                                                                • CONCLUSAtildeO
                                                                                                                                                                                                • Referecircncias
                                                                                                                                                                                                • Meacutetodo create_voters
                                                                                                                                                                                                • Meacutetodo create_candidates
                                                                                                                                                                                                • Meacutetodo calculate_means
                                                                                                                                                                                                • Meacutetodo get_mean
                                                                                                                                                                                                • Meacutetodo calculate_mean
                                                                                                                                                                                                • Meacutetodo set_leading_candidates
                                                                                                                                                                                                • Meacutetodo irv_set_leading_candidates
                                                                                                                                                                                                • Meacutetodo sort_ranks
                                                                                                                                                                                                • Meacutetodo fptp_count_tactical_votes
                                                                                                                                                                                                • Meacutetodo fptp_count_minority_votes
                                                                                                                                                                                                • Meacutetodo trs_second_round
                                                                                                                                                                                                • Meacutetodo trs_account_for_coalitions
                                                                                                                                                                                                • Meacutetodo irv_count_votes
                                                                                                                                                                                                • Meacutetodo avs_count_votes
                                                                                                                                                                                                • Meacutetodo avs_count_votes_with_tactical
                                                                                                                                                                                                • Meacutetodo irv_apply_tactical_votes
                                                                                                                                                                                                • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                                                                                                                • Meacutetodo bc_sum_candidates_scores
                                                                                                                                                                                                • Meacutetodo svs_apply_tactical_votes
                                                                                                                                                                                                • Meacutetodo svs_sum_candidates_scores
                                                                                                                                                                                                • Meacutetodo bv_count_votes

                                                                                                                                                      75

                                                                                                                                                      APEcircNDICE M ndash MEacuteTODO IRV_COUNT_VOTES

                                                                                                                                                      Coacutedigo M1 ndash Meacutetodo irv_count_votesdef irv_count_votes(self _round)

                                                                                                                                                      selfelecroundsappend(selfsorted_candidates[_round])

                                                                                                                                                      if(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                                                                      N_VOTERS == 05 and _round == selfelecN_CANDIDATES - selfelec

                                                                                                                                                      N_VACANCIES - 1)

                                                                                                                                                      return 2

                                                                                                                                                      elif(selfsorted_candidates[selfelecN_CANDIDATES - 1][1]selfelec

                                                                                                                                                      N_VOTERS gt 05)

                                                                                                                                                      return 1

                                                                                                                                                      else

                                                                                                                                                      selfelecexcludedadd(selfsorted_candidates[_round][selfelec

                                                                                                                                                      CANDIDATE_INDEX])

                                                                                                                                                      for voter_index in selfvotes[selfsorted_candidates[_round][self

                                                                                                                                                      elecCANDIDATE_INDEX]]

                                                                                                                                                      if voter_index in selfrankings_changed

                                                                                                                                                      for candidate in reversed(selfrankings_changed[voter_index

                                                                                                                                                      ])

                                                                                                                                                      if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                                                      excluded

                                                                                                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                                                                      ]] += 1

                                                                                                                                                      selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                                                                      add(voter_index)

                                                                                                                                                      break

                                                                                                                                                      else

                                                                                                                                                      continue

                                                                                                                                                      else

                                                                                                                                                      for candidate in reversed(selfelecsorted_voters[

                                                                                                                                                      voter_index])

                                                                                                                                                      if candidate[selfelecCANDIDATE_INDEX] not in selfelec

                                                                                                                                                      excluded

                                                                                                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX

                                                                                                                                                      ]] += 1

                                                                                                                                                      selfvotes[candidate[selfelecCANDIDATE_INDEX]]

                                                                                                                                                      add(voter_index)

                                                                                                                                                      break

                                                                                                                                                      else

                                                                                                                                                      continue

                                                                                                                                                      selfsorted_candidates = selfelecsort_candidates(selfcandidates)

                                                                                                                                                      return 0

                                                                                                                                                      76

                                                                                                                                                      APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                                                                                                                      Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                                                                                                                      for index in range(selfelecN_CANDIDATES)

                                                                                                                                                      selfcandidates[index] = 0

                                                                                                                                                      for voter in selfelecsorted_voters

                                                                                                                                                      for candidate in reversed(voter)

                                                                                                                                                      if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                                      else

                                                                                                                                                      break

                                                                                                                                                      APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                                                                                                                      Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                                                                                                                      for index in range(selfelecN_CANDIDATES)

                                                                                                                                                      selfcandidates[index] = 0

                                                                                                                                                      for voter in selfelecsorted_voters

                                                                                                                                                      if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                                                                      elecCANDIDATE_INDEX]]

                                                                                                                                                      selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                                      else

                                                                                                                                                      for candidate in reversed(voter)

                                                                                                                                                      if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                                      else

                                                                                                                                                      break

                                                                                                                                                      77

                                                                                                                                                      APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                                                                                                                      Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                                                                                                                      pos = set()

                                                                                                                                                      for index perc in enumerate(selfelectactical_vote_percentages)

                                                                                                                                                      if perc gt 0

                                                                                                                                                      posadd(index)

                                                                                                                                                      for candidate in selfeleccandidates

                                                                                                                                                      if candidate not in selfleading_candidates

                                                                                                                                                      for voter_index in selfvotes[candidate]

                                                                                                                                                      raised = None

                                                                                                                                                      for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                                                                                                                      ])

                                                                                                                                                      if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                                                                                                                      leading_candidates

                                                                                                                                                      if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                                                                                                                      if randomrandom() lt selfelectactical_vote_percentages[

                                                                                                                                                      candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                                                                                                                      ranking = [None]selfelecN_CANDIDATES

                                                                                                                                                      ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                                      selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                                                      CANDIDATE_INDEX]])

                                                                                                                                                      raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                                      break

                                                                                                                                                      break

                                                                                                                                                      break

                                                                                                                                                      if raised = None

                                                                                                                                                      for _candidate in selfleading_candidates

                                                                                                                                                      if _candidate = ranking[-1][0]

                                                                                                                                                      ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                                                                      _candidate])

                                                                                                                                                      buried = _candidate

                                                                                                                                                      break

                                                                                                                                                      i = 1

                                                                                                                                                      for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                                                                      if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                                                                                                                      buried]

                                                                                                                                                      continue

                                                                                                                                                      else

                                                                                                                                                      ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                                      selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                                                      CANDIDATE_INDEX]])

                                                                                                                                                      i += 1

                                                                                                                                                      selfrankings_changed[voter_index] = ranking

                                                                                                                                                      78

                                                                                                                                                      APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                                                                                                                      Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                                                                                                                      for voter_index in selfvotes[candidate]

                                                                                                                                                      if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                                                                                                                      ]

                                                                                                                                                      for _candidate in selfleading_candidates

                                                                                                                                                      if _candidate = candidate

                                                                                                                                                      ranking = [None]selfelecN_CANDIDATES

                                                                                                                                                      ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                                                                      _candidate])

                                                                                                                                                      buried = _candidate

                                                                                                                                                      break

                                                                                                                                                      i = 1

                                                                                                                                                      for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                                                                      if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                                                                                                                      continue

                                                                                                                                                      else

                                                                                                                                                      ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                                      selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                                                      CANDIDATE_INDEX]])

                                                                                                                                                      i += 1

                                                                                                                                                      selfrankings_changed[voter_index] = ranking

                                                                                                                                                      79

                                                                                                                                                      APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                                                                                                                      Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                                                                                                                      for index in range(selfelecN_CANDIDATES)

                                                                                                                                                      selfcandidates[index] = 0

                                                                                                                                                      for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                                      score = 0

                                                                                                                                                      if voter_index in selfrankings_changed

                                                                                                                                                      for candidate in selfrankings_changed[voter_index]

                                                                                                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                                                                      score += 1

                                                                                                                                                      else

                                                                                                                                                      for candidate in voter

                                                                                                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                                                                      score += 1

                                                                                                                                                      APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                                                                                                                      Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                                                                                                                      for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                                      if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                                                                      elecCANDIDATE_INDEX]]

                                                                                                                                                      selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                                                                                                                      sorted_voters[voter_index])

                                                                                                                                                      for candidate_index candidate in enumerate(reversed(voter))

                                                                                                                                                      if candidate_index == 0

                                                                                                                                                      selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                                                                      voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                                                                                                                      else

                                                                                                                                                      selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                                                                      voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                                                                                                                      80

                                                                                                                                                      APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                                                                                                                      Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                                                                                                                      for index in range(selfelecN_CANDIDATES)

                                                                                                                                                      selfcandidates[index] = 0

                                                                                                                                                      for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                                      if voter_index in selfrankings_changed

                                                                                                                                                      for candidate in selfrankings_changed[voter_index]

                                                                                                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                                                                      selfelecCANDIDATE_RANK]

                                                                                                                                                      else

                                                                                                                                                      for candidate in voter

                                                                                                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                                                                      selfelecCANDIDATE_RANK]

                                                                                                                                                      APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                                                                                                                      Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                                                                                                                      for index in range(selfelecN_CANDIDATES)

                                                                                                                                                      selfcandidates[index] = 0

                                                                                                                                                      for voter in selfelecsorted_voters

                                                                                                                                                      votes = selfelecN_VACANCIES

                                                                                                                                                      for candidate in reversed(voter)

                                                                                                                                                      if votes == 0

                                                                                                                                                      break

                                                                                                                                                      selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                                      votes -= 1

                                                                                                                                                      • Folha de aprovaccedilatildeo
                                                                                                                                                      • Agradecimentos
                                                                                                                                                      • Epiacutegrafe
                                                                                                                                                      • Resumo
                                                                                                                                                      • Abstract
                                                                                                                                                      • Lista de ilustraccedilotildees
                                                                                                                                                      • Lista de Coacutedigos
                                                                                                                                                      • Lista de tabelas
                                                                                                                                                      • Lista de abreviaturas e siglas
                                                                                                                                                      • Sumaacuterio
                                                                                                                                                      • INTRODUCcedilAtildeO
                                                                                                                                                        • MOTIVACcedilAtildeO E OBJETIVO
                                                                                                                                                        • MEacuteTODO
                                                                                                                                                        • ESTRUTURA
                                                                                                                                                          • SISTEMAS ELEITORAIS
                                                                                                                                                            • FISRT PAST THE POST
                                                                                                                                                              • Exemplo
                                                                                                                                                              • Vantagens e Desvantagens do FPTP
                                                                                                                                                              • Voto Uacutetil no FPTP
                                                                                                                                                                • TWO-ROUND SYSTEM
                                                                                                                                                                  • Exemplo
                                                                                                                                                                  • Vantagens e Desvantagens do TRS
                                                                                                                                                                  • Voto Uacutetil no TRS
                                                                                                                                                                    • INSTANT-RUNOFF VOTING
                                                                                                                                                                      • Exemplo
                                                                                                                                                                      • Vantagens e Desvantagens do IRV
                                                                                                                                                                      • Voto Uacutetil no IRV
                                                                                                                                                                        • APPROVAL VOTING SYSTEM
                                                                                                                                                                          • Exemplo
                                                                                                                                                                          • Vantagens e Desvantagens do AVS
                                                                                                                                                                          • Voto Uacutetil no AVS
                                                                                                                                                                            • THE BORDA COUNT
                                                                                                                                                                              • Exemplo
                                                                                                                                                                              • Vantagens e Desvantagens do BC
                                                                                                                                                                              • Voto Uacutetil no BC
                                                                                                                                                                                • SCORE VOTING SYSTEM
                                                                                                                                                                                  • Exemplo
                                                                                                                                                                                  • Vantagens e Desvantagens do SVS
                                                                                                                                                                                  • Voto Uacutetil no SVS
                                                                                                                                                                                    • BLOC VOTE
                                                                                                                                                                                      • Exemplo
                                                                                                                                                                                      • Voto Uacutetil no BV
                                                                                                                                                                                          • O SIMULADOR
                                                                                                                                                                                          • CENAacuteRIOS PERTINENTES
                                                                                                                                                                                            • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                                                                                                            • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                                                                                                            • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                                                                                                            • CENAacuteRIO 4 COALIZOtildeES
                                                                                                                                                                                            • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                                                                                                            • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                                                                                                              • COMO FUNCIONA O SIMULADOR
                                                                                                                                                                                                • CLASSE Elections
                                                                                                                                                                                                • CLASSE FirstPastThePost
                                                                                                                                                                                                • CLASSE TwoRoundSystem
                                                                                                                                                                                                • CLASSE InstantRunoffVoting
                                                                                                                                                                                                • CLASSE ApprovalVoting
                                                                                                                                                                                                • CLASSE BordaCount
                                                                                                                                                                                                • CLASSE ScoreVoting
                                                                                                                                                                                                • CLASSE BlocVote
                                                                                                                                                                                                • TECNOLOGIAS UTILIZADAS
                                                                                                                                                                                                  • CONCLUSAtildeO
                                                                                                                                                                                                  • Referecircncias
                                                                                                                                                                                                  • Meacutetodo create_voters
                                                                                                                                                                                                  • Meacutetodo create_candidates
                                                                                                                                                                                                  • Meacutetodo calculate_means
                                                                                                                                                                                                  • Meacutetodo get_mean
                                                                                                                                                                                                  • Meacutetodo calculate_mean
                                                                                                                                                                                                  • Meacutetodo set_leading_candidates
                                                                                                                                                                                                  • Meacutetodo irv_set_leading_candidates
                                                                                                                                                                                                  • Meacutetodo sort_ranks
                                                                                                                                                                                                  • Meacutetodo fptp_count_tactical_votes
                                                                                                                                                                                                  • Meacutetodo fptp_count_minority_votes
                                                                                                                                                                                                  • Meacutetodo trs_second_round
                                                                                                                                                                                                  • Meacutetodo trs_account_for_coalitions
                                                                                                                                                                                                  • Meacutetodo irv_count_votes
                                                                                                                                                                                                  • Meacutetodo avs_count_votes
                                                                                                                                                                                                  • Meacutetodo avs_count_votes_with_tactical
                                                                                                                                                                                                  • Meacutetodo irv_apply_tactical_votes
                                                                                                                                                                                                  • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                                                                                                                  • Meacutetodo bc_sum_candidates_scores
                                                                                                                                                                                                  • Meacutetodo svs_apply_tactical_votes
                                                                                                                                                                                                  • Meacutetodo svs_sum_candidates_scores
                                                                                                                                                                                                  • Meacutetodo bv_count_votes

                                                                                                                                                        76

                                                                                                                                                        APEcircNDICE N ndash MEacuteTODO AVS_COUNT_VOTES

                                                                                                                                                        Coacutedigo N1 ndash Meacutetodo avs_count_votesdef avs_count_votes(self)

                                                                                                                                                        for index in range(selfelecN_CANDIDATES)

                                                                                                                                                        selfcandidates[index] = 0

                                                                                                                                                        for voter in selfelecsorted_voters

                                                                                                                                                        for candidate in reversed(voter)

                                                                                                                                                        if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                                        else

                                                                                                                                                        break

                                                                                                                                                        APEcircNDICE O ndash MEacuteTODO AVS_COUNT_VOTES_WITH_TACTICAL

                                                                                                                                                        Coacutedigo O1 ndash Meacutetodo avs_count_votes_with_tacticaldef _count_votes_with_tactical(self)

                                                                                                                                                        for index in range(selfelecN_CANDIDATES)

                                                                                                                                                        selfcandidates[index] = 0

                                                                                                                                                        for voter in selfelecsorted_voters

                                                                                                                                                        if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                                                                        elecCANDIDATE_INDEX]]

                                                                                                                                                        selfcandidates[voter[-1][selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                                        else

                                                                                                                                                        for candidate in reversed(voter)

                                                                                                                                                        if candidate[selfelecCANDIDATE_SCORE] gt 0

                                                                                                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                                        else

                                                                                                                                                        break

                                                                                                                                                        77

                                                                                                                                                        APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                                                                                                                        Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                                                                                                                        pos = set()

                                                                                                                                                        for index perc in enumerate(selfelectactical_vote_percentages)

                                                                                                                                                        if perc gt 0

                                                                                                                                                        posadd(index)

                                                                                                                                                        for candidate in selfeleccandidates

                                                                                                                                                        if candidate not in selfleading_candidates

                                                                                                                                                        for voter_index in selfvotes[candidate]

                                                                                                                                                        raised = None

                                                                                                                                                        for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                                                                                                                        ])

                                                                                                                                                        if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                                                                                                                        leading_candidates

                                                                                                                                                        if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                                                                                                                        if randomrandom() lt selfelectactical_vote_percentages[

                                                                                                                                                        candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                                                                                                                        ranking = [None]selfelecN_CANDIDATES

                                                                                                                                                        ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                                        selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                                                        CANDIDATE_INDEX]])

                                                                                                                                                        raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                                        break

                                                                                                                                                        break

                                                                                                                                                        break

                                                                                                                                                        if raised = None

                                                                                                                                                        for _candidate in selfleading_candidates

                                                                                                                                                        if _candidate = ranking[-1][0]

                                                                                                                                                        ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                                                                        _candidate])

                                                                                                                                                        buried = _candidate

                                                                                                                                                        break

                                                                                                                                                        i = 1

                                                                                                                                                        for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                                                                        if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                                                                                                                        buried]

                                                                                                                                                        continue

                                                                                                                                                        else

                                                                                                                                                        ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                                        selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                                                        CANDIDATE_INDEX]])

                                                                                                                                                        i += 1

                                                                                                                                                        selfrankings_changed[voter_index] = ranking

                                                                                                                                                        78

                                                                                                                                                        APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                                                                                                                        Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                                                                                                                        for voter_index in selfvotes[candidate]

                                                                                                                                                        if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                                                                                                                        ]

                                                                                                                                                        for _candidate in selfleading_candidates

                                                                                                                                                        if _candidate = candidate

                                                                                                                                                        ranking = [None]selfelecN_CANDIDATES

                                                                                                                                                        ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                                                                        _candidate])

                                                                                                                                                        buried = _candidate

                                                                                                                                                        break

                                                                                                                                                        i = 1

                                                                                                                                                        for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                                                                        if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                                                                                                                        continue

                                                                                                                                                        else

                                                                                                                                                        ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                                        selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                                                        CANDIDATE_INDEX]])

                                                                                                                                                        i += 1

                                                                                                                                                        selfrankings_changed[voter_index] = ranking

                                                                                                                                                        79

                                                                                                                                                        APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                                                                                                                        Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                                                                                                                        for index in range(selfelecN_CANDIDATES)

                                                                                                                                                        selfcandidates[index] = 0

                                                                                                                                                        for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                                        score = 0

                                                                                                                                                        if voter_index in selfrankings_changed

                                                                                                                                                        for candidate in selfrankings_changed[voter_index]

                                                                                                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                                                                        score += 1

                                                                                                                                                        else

                                                                                                                                                        for candidate in voter

                                                                                                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                                                                        score += 1

                                                                                                                                                        APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                                                                                                                        Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                                                                                                                        for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                                        if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                                                                        elecCANDIDATE_INDEX]]

                                                                                                                                                        selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                                                                                                                        sorted_voters[voter_index])

                                                                                                                                                        for candidate_index candidate in enumerate(reversed(voter))

                                                                                                                                                        if candidate_index == 0

                                                                                                                                                        selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                                                                        voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                                                                                                                        else

                                                                                                                                                        selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                                                                        voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                                                                                                                        80

                                                                                                                                                        APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                                                                                                                        Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                                                                                                                        for index in range(selfelecN_CANDIDATES)

                                                                                                                                                        selfcandidates[index] = 0

                                                                                                                                                        for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                                        if voter_index in selfrankings_changed

                                                                                                                                                        for candidate in selfrankings_changed[voter_index]

                                                                                                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                                                                        selfelecCANDIDATE_RANK]

                                                                                                                                                        else

                                                                                                                                                        for candidate in voter

                                                                                                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                                                                        selfelecCANDIDATE_RANK]

                                                                                                                                                        APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                                                                                                                        Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                                                                                                                        for index in range(selfelecN_CANDIDATES)

                                                                                                                                                        selfcandidates[index] = 0

                                                                                                                                                        for voter in selfelecsorted_voters

                                                                                                                                                        votes = selfelecN_VACANCIES

                                                                                                                                                        for candidate in reversed(voter)

                                                                                                                                                        if votes == 0

                                                                                                                                                        break

                                                                                                                                                        selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                                        votes -= 1

                                                                                                                                                        • Folha de aprovaccedilatildeo
                                                                                                                                                        • Agradecimentos
                                                                                                                                                        • Epiacutegrafe
                                                                                                                                                        • Resumo
                                                                                                                                                        • Abstract
                                                                                                                                                        • Lista de ilustraccedilotildees
                                                                                                                                                        • Lista de Coacutedigos
                                                                                                                                                        • Lista de tabelas
                                                                                                                                                        • Lista de abreviaturas e siglas
                                                                                                                                                        • Sumaacuterio
                                                                                                                                                        • INTRODUCcedilAtildeO
                                                                                                                                                          • MOTIVACcedilAtildeO E OBJETIVO
                                                                                                                                                          • MEacuteTODO
                                                                                                                                                          • ESTRUTURA
                                                                                                                                                            • SISTEMAS ELEITORAIS
                                                                                                                                                              • FISRT PAST THE POST
                                                                                                                                                                • Exemplo
                                                                                                                                                                • Vantagens e Desvantagens do FPTP
                                                                                                                                                                • Voto Uacutetil no FPTP
                                                                                                                                                                  • TWO-ROUND SYSTEM
                                                                                                                                                                    • Exemplo
                                                                                                                                                                    • Vantagens e Desvantagens do TRS
                                                                                                                                                                    • Voto Uacutetil no TRS
                                                                                                                                                                      • INSTANT-RUNOFF VOTING
                                                                                                                                                                        • Exemplo
                                                                                                                                                                        • Vantagens e Desvantagens do IRV
                                                                                                                                                                        • Voto Uacutetil no IRV
                                                                                                                                                                          • APPROVAL VOTING SYSTEM
                                                                                                                                                                            • Exemplo
                                                                                                                                                                            • Vantagens e Desvantagens do AVS
                                                                                                                                                                            • Voto Uacutetil no AVS
                                                                                                                                                                              • THE BORDA COUNT
                                                                                                                                                                                • Exemplo
                                                                                                                                                                                • Vantagens e Desvantagens do BC
                                                                                                                                                                                • Voto Uacutetil no BC
                                                                                                                                                                                  • SCORE VOTING SYSTEM
                                                                                                                                                                                    • Exemplo
                                                                                                                                                                                    • Vantagens e Desvantagens do SVS
                                                                                                                                                                                    • Voto Uacutetil no SVS
                                                                                                                                                                                      • BLOC VOTE
                                                                                                                                                                                        • Exemplo
                                                                                                                                                                                        • Voto Uacutetil no BV
                                                                                                                                                                                            • O SIMULADOR
                                                                                                                                                                                            • CENAacuteRIOS PERTINENTES
                                                                                                                                                                                              • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                                                                                                              • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                                                                                                              • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                                                                                                              • CENAacuteRIO 4 COALIZOtildeES
                                                                                                                                                                                              • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                                                                                                              • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                                                                                                                • COMO FUNCIONA O SIMULADOR
                                                                                                                                                                                                  • CLASSE Elections
                                                                                                                                                                                                  • CLASSE FirstPastThePost
                                                                                                                                                                                                  • CLASSE TwoRoundSystem
                                                                                                                                                                                                  • CLASSE InstantRunoffVoting
                                                                                                                                                                                                  • CLASSE ApprovalVoting
                                                                                                                                                                                                  • CLASSE BordaCount
                                                                                                                                                                                                  • CLASSE ScoreVoting
                                                                                                                                                                                                  • CLASSE BlocVote
                                                                                                                                                                                                  • TECNOLOGIAS UTILIZADAS
                                                                                                                                                                                                    • CONCLUSAtildeO
                                                                                                                                                                                                    • Referecircncias
                                                                                                                                                                                                    • Meacutetodo create_voters
                                                                                                                                                                                                    • Meacutetodo create_candidates
                                                                                                                                                                                                    • Meacutetodo calculate_means
                                                                                                                                                                                                    • Meacutetodo get_mean
                                                                                                                                                                                                    • Meacutetodo calculate_mean
                                                                                                                                                                                                    • Meacutetodo set_leading_candidates
                                                                                                                                                                                                    • Meacutetodo irv_set_leading_candidates
                                                                                                                                                                                                    • Meacutetodo sort_ranks
                                                                                                                                                                                                    • Meacutetodo fptp_count_tactical_votes
                                                                                                                                                                                                    • Meacutetodo fptp_count_minority_votes
                                                                                                                                                                                                    • Meacutetodo trs_second_round
                                                                                                                                                                                                    • Meacutetodo trs_account_for_coalitions
                                                                                                                                                                                                    • Meacutetodo irv_count_votes
                                                                                                                                                                                                    • Meacutetodo avs_count_votes
                                                                                                                                                                                                    • Meacutetodo avs_count_votes_with_tactical
                                                                                                                                                                                                    • Meacutetodo irv_apply_tactical_votes
                                                                                                                                                                                                    • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                                                                                                                    • Meacutetodo bc_sum_candidates_scores
                                                                                                                                                                                                    • Meacutetodo svs_apply_tactical_votes
                                                                                                                                                                                                    • Meacutetodo svs_sum_candidates_scores
                                                                                                                                                                                                    • Meacutetodo bv_count_votes

                                                                                                                                                          77

                                                                                                                                                          APEcircNDICE P ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES

                                                                                                                                                          Coacutedigo P1 ndash Meacutetodo irv_apply_tactical_votesdef irv_apply_tactical_votes(self)

                                                                                                                                                          pos = set()

                                                                                                                                                          for index perc in enumerate(selfelectactical_vote_percentages)

                                                                                                                                                          if perc gt 0

                                                                                                                                                          posadd(index)

                                                                                                                                                          for candidate in selfeleccandidates

                                                                                                                                                          if candidate not in selfleading_candidates

                                                                                                                                                          for voter_index in selfvotes[candidate]

                                                                                                                                                          raised = None

                                                                                                                                                          for candidate_tuple in reversed(selfelecsorted_voters[voter_index

                                                                                                                                                          ])

                                                                                                                                                          if candidate_tuple[selfelecCANDIDATE_INDEX] in self

                                                                                                                                                          leading_candidates

                                                                                                                                                          if candidate_tuple[selfelecCANDIDATE_INDEX] in pos

                                                                                                                                                          if randomrandom() lt selfelectactical_vote_percentages[

                                                                                                                                                          candidate_tuple[selfelecCANDIDATE_INDEX]]

                                                                                                                                                          ranking = [None]selfelecN_CANDIDATES

                                                                                                                                                          ranking[-1] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                                          selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                                                          CANDIDATE_INDEX]])

                                                                                                                                                          raised = candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                                          break

                                                                                                                                                          break

                                                                                                                                                          break

                                                                                                                                                          if raised = None

                                                                                                                                                          for _candidate in selfleading_candidates

                                                                                                                                                          if _candidate = ranking[-1][0]

                                                                                                                                                          ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                                                                          _candidate])

                                                                                                                                                          buried = _candidate

                                                                                                                                                          break

                                                                                                                                                          i = 1

                                                                                                                                                          for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                                                                          if candidate_tuple[selfelecCANDIDATE_INDEX] in [raised

                                                                                                                                                          buried]

                                                                                                                                                          continue

                                                                                                                                                          else

                                                                                                                                                          ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                                          selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                                                          CANDIDATE_INDEX]])

                                                                                                                                                          i += 1

                                                                                                                                                          selfrankings_changed[voter_index] = ranking

                                                                                                                                                          78

                                                                                                                                                          APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                                                                                                                          Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                                                                                                                          for voter_index in selfvotes[candidate]

                                                                                                                                                          if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                                                                                                                          ]

                                                                                                                                                          for _candidate in selfleading_candidates

                                                                                                                                                          if _candidate = candidate

                                                                                                                                                          ranking = [None]selfelecN_CANDIDATES

                                                                                                                                                          ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                                                                          _candidate])

                                                                                                                                                          buried = _candidate

                                                                                                                                                          break

                                                                                                                                                          i = 1

                                                                                                                                                          for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                                                                          if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                                                                                                                          continue

                                                                                                                                                          else

                                                                                                                                                          ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                                          selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                                                          CANDIDATE_INDEX]])

                                                                                                                                                          i += 1

                                                                                                                                                          selfrankings_changed[voter_index] = ranking

                                                                                                                                                          79

                                                                                                                                                          APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                                                                                                                          Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                                                                                                                          for index in range(selfelecN_CANDIDATES)

                                                                                                                                                          selfcandidates[index] = 0

                                                                                                                                                          for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                                          score = 0

                                                                                                                                                          if voter_index in selfrankings_changed

                                                                                                                                                          for candidate in selfrankings_changed[voter_index]

                                                                                                                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                                                                          score += 1

                                                                                                                                                          else

                                                                                                                                                          for candidate in voter

                                                                                                                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                                                                          score += 1

                                                                                                                                                          APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                                                                                                                          Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                                                                                                                          for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                                          if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                                                                          elecCANDIDATE_INDEX]]

                                                                                                                                                          selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                                                                                                                          sorted_voters[voter_index])

                                                                                                                                                          for candidate_index candidate in enumerate(reversed(voter))

                                                                                                                                                          if candidate_index == 0

                                                                                                                                                          selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                                                                          voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                                                                                                                          else

                                                                                                                                                          selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                                                                          voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                                                                                                                          80

                                                                                                                                                          APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                                                                                                                          Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                                                                                                                          for index in range(selfelecN_CANDIDATES)

                                                                                                                                                          selfcandidates[index] = 0

                                                                                                                                                          for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                                          if voter_index in selfrankings_changed

                                                                                                                                                          for candidate in selfrankings_changed[voter_index]

                                                                                                                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                                                                          selfelecCANDIDATE_RANK]

                                                                                                                                                          else

                                                                                                                                                          for candidate in voter

                                                                                                                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                                                                          selfelecCANDIDATE_RANK]

                                                                                                                                                          APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                                                                                                                          Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                                                                                                                          for index in range(selfelecN_CANDIDATES)

                                                                                                                                                          selfcandidates[index] = 0

                                                                                                                                                          for voter in selfelecsorted_voters

                                                                                                                                                          votes = selfelecN_VACANCIES

                                                                                                                                                          for candidate in reversed(voter)

                                                                                                                                                          if votes == 0

                                                                                                                                                          break

                                                                                                                                                          selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                                          votes -= 1

                                                                                                                                                          • Folha de aprovaccedilatildeo
                                                                                                                                                          • Agradecimentos
                                                                                                                                                          • Epiacutegrafe
                                                                                                                                                          • Resumo
                                                                                                                                                          • Abstract
                                                                                                                                                          • Lista de ilustraccedilotildees
                                                                                                                                                          • Lista de Coacutedigos
                                                                                                                                                          • Lista de tabelas
                                                                                                                                                          • Lista de abreviaturas e siglas
                                                                                                                                                          • Sumaacuterio
                                                                                                                                                          • INTRODUCcedilAtildeO
                                                                                                                                                            • MOTIVACcedilAtildeO E OBJETIVO
                                                                                                                                                            • MEacuteTODO
                                                                                                                                                            • ESTRUTURA
                                                                                                                                                              • SISTEMAS ELEITORAIS
                                                                                                                                                                • FISRT PAST THE POST
                                                                                                                                                                  • Exemplo
                                                                                                                                                                  • Vantagens e Desvantagens do FPTP
                                                                                                                                                                  • Voto Uacutetil no FPTP
                                                                                                                                                                    • TWO-ROUND SYSTEM
                                                                                                                                                                      • Exemplo
                                                                                                                                                                      • Vantagens e Desvantagens do TRS
                                                                                                                                                                      • Voto Uacutetil no TRS
                                                                                                                                                                        • INSTANT-RUNOFF VOTING
                                                                                                                                                                          • Exemplo
                                                                                                                                                                          • Vantagens e Desvantagens do IRV
                                                                                                                                                                          • Voto Uacutetil no IRV
                                                                                                                                                                            • APPROVAL VOTING SYSTEM
                                                                                                                                                                              • Exemplo
                                                                                                                                                                              • Vantagens e Desvantagens do AVS
                                                                                                                                                                              • Voto Uacutetil no AVS
                                                                                                                                                                                • THE BORDA COUNT
                                                                                                                                                                                  • Exemplo
                                                                                                                                                                                  • Vantagens e Desvantagens do BC
                                                                                                                                                                                  • Voto Uacutetil no BC
                                                                                                                                                                                    • SCORE VOTING SYSTEM
                                                                                                                                                                                      • Exemplo
                                                                                                                                                                                      • Vantagens e Desvantagens do SVS
                                                                                                                                                                                      • Voto Uacutetil no SVS
                                                                                                                                                                                        • BLOC VOTE
                                                                                                                                                                                          • Exemplo
                                                                                                                                                                                          • Voto Uacutetil no BV
                                                                                                                                                                                              • O SIMULADOR
                                                                                                                                                                                              • CENAacuteRIOS PERTINENTES
                                                                                                                                                                                                • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                                                                                                                • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                                                                                                                • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                                                                                                                • CENAacuteRIO 4 COALIZOtildeES
                                                                                                                                                                                                • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                                                                                                                • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                                                                                                                  • COMO FUNCIONA O SIMULADOR
                                                                                                                                                                                                    • CLASSE Elections
                                                                                                                                                                                                    • CLASSE FirstPastThePost
                                                                                                                                                                                                    • CLASSE TwoRoundSystem
                                                                                                                                                                                                    • CLASSE InstantRunoffVoting
                                                                                                                                                                                                    • CLASSE ApprovalVoting
                                                                                                                                                                                                    • CLASSE BordaCount
                                                                                                                                                                                                    • CLASSE ScoreVoting
                                                                                                                                                                                                    • CLASSE BlocVote
                                                                                                                                                                                                    • TECNOLOGIAS UTILIZADAS
                                                                                                                                                                                                      • CONCLUSAtildeO
                                                                                                                                                                                                      • Referecircncias
                                                                                                                                                                                                      • Meacutetodo create_voters
                                                                                                                                                                                                      • Meacutetodo create_candidates
                                                                                                                                                                                                      • Meacutetodo calculate_means
                                                                                                                                                                                                      • Meacutetodo get_mean
                                                                                                                                                                                                      • Meacutetodo calculate_mean
                                                                                                                                                                                                      • Meacutetodo set_leading_candidates
                                                                                                                                                                                                      • Meacutetodo irv_set_leading_candidates
                                                                                                                                                                                                      • Meacutetodo sort_ranks
                                                                                                                                                                                                      • Meacutetodo fptp_count_tactical_votes
                                                                                                                                                                                                      • Meacutetodo fptp_count_minority_votes
                                                                                                                                                                                                      • Meacutetodo trs_second_round
                                                                                                                                                                                                      • Meacutetodo trs_account_for_coalitions
                                                                                                                                                                                                      • Meacutetodo irv_count_votes
                                                                                                                                                                                                      • Meacutetodo avs_count_votes
                                                                                                                                                                                                      • Meacutetodo avs_count_votes_with_tactical
                                                                                                                                                                                                      • Meacutetodo irv_apply_tactical_votes
                                                                                                                                                                                                      • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                                                                                                                      • Meacutetodo bc_sum_candidates_scores
                                                                                                                                                                                                      • Meacutetodo svs_apply_tactical_votes
                                                                                                                                                                                                      • Meacutetodo svs_sum_candidates_scores
                                                                                                                                                                                                      • Meacutetodo bv_count_votes

                                                                                                                                                            78

                                                                                                                                                            APEcircNDICE Q ndash MEacuteTODO IRV_APPLY_TACTICAL_VOTES(CONTINUACcedilAtildeO)

                                                                                                                                                            Coacutedigo Q1 ndash Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)elif candidate in pos

                                                                                                                                                            for voter_index in selfvotes[candidate]

                                                                                                                                                            if randomrandom() lt selfelectactical_vote_percentages[candidate

                                                                                                                                                            ]

                                                                                                                                                            for _candidate in selfleading_candidates

                                                                                                                                                            if _candidate = candidate

                                                                                                                                                            ranking = [None]selfelecN_CANDIDATES

                                                                                                                                                            ranking[0] = (_candidate selfelecvoters[voter_index][

                                                                                                                                                            _candidate])

                                                                                                                                                            buried = _candidate

                                                                                                                                                            break

                                                                                                                                                            i = 1

                                                                                                                                                            for candidate_tuple in selfelecsorted_voters[voter_index]

                                                                                                                                                            if candidate_tuple[selfelecCANDIDATE_INDEX] == buried

                                                                                                                                                            continue

                                                                                                                                                            else

                                                                                                                                                            ranking[i] = (candidate_tuple[selfelecCANDIDATE_INDEX]

                                                                                                                                                            selfelecvoters[voter_index][candidate_tuple[selfelec

                                                                                                                                                            CANDIDATE_INDEX]])

                                                                                                                                                            i += 1

                                                                                                                                                            selfrankings_changed[voter_index] = ranking

                                                                                                                                                            79

                                                                                                                                                            APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                                                                                                                            Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                                                                                                                            for index in range(selfelecN_CANDIDATES)

                                                                                                                                                            selfcandidates[index] = 0

                                                                                                                                                            for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                                            score = 0

                                                                                                                                                            if voter_index in selfrankings_changed

                                                                                                                                                            for candidate in selfrankings_changed[voter_index]

                                                                                                                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                                                                            score += 1

                                                                                                                                                            else

                                                                                                                                                            for candidate in voter

                                                                                                                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                                                                            score += 1

                                                                                                                                                            APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                                                                                                                            Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                                                                                                                            for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                                            if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                                                                            elecCANDIDATE_INDEX]]

                                                                                                                                                            selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                                                                                                                            sorted_voters[voter_index])

                                                                                                                                                            for candidate_index candidate in enumerate(reversed(voter))

                                                                                                                                                            if candidate_index == 0

                                                                                                                                                            selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                                                                            voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                                                                                                                            else

                                                                                                                                                            selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                                                                            voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                                                                                                                            80

                                                                                                                                                            APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                                                                                                                            Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                                                                                                                            for index in range(selfelecN_CANDIDATES)

                                                                                                                                                            selfcandidates[index] = 0

                                                                                                                                                            for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                                            if voter_index in selfrankings_changed

                                                                                                                                                            for candidate in selfrankings_changed[voter_index]

                                                                                                                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                                                                            selfelecCANDIDATE_RANK]

                                                                                                                                                            else

                                                                                                                                                            for candidate in voter

                                                                                                                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                                                                            selfelecCANDIDATE_RANK]

                                                                                                                                                            APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                                                                                                                            Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                                                                                                                            for index in range(selfelecN_CANDIDATES)

                                                                                                                                                            selfcandidates[index] = 0

                                                                                                                                                            for voter in selfelecsorted_voters

                                                                                                                                                            votes = selfelecN_VACANCIES

                                                                                                                                                            for candidate in reversed(voter)

                                                                                                                                                            if votes == 0

                                                                                                                                                            break

                                                                                                                                                            selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                                            votes -= 1

                                                                                                                                                            • Folha de aprovaccedilatildeo
                                                                                                                                                            • Agradecimentos
                                                                                                                                                            • Epiacutegrafe
                                                                                                                                                            • Resumo
                                                                                                                                                            • Abstract
                                                                                                                                                            • Lista de ilustraccedilotildees
                                                                                                                                                            • Lista de Coacutedigos
                                                                                                                                                            • Lista de tabelas
                                                                                                                                                            • Lista de abreviaturas e siglas
                                                                                                                                                            • Sumaacuterio
                                                                                                                                                            • INTRODUCcedilAtildeO
                                                                                                                                                              • MOTIVACcedilAtildeO E OBJETIVO
                                                                                                                                                              • MEacuteTODO
                                                                                                                                                              • ESTRUTURA
                                                                                                                                                                • SISTEMAS ELEITORAIS
                                                                                                                                                                  • FISRT PAST THE POST
                                                                                                                                                                    • Exemplo
                                                                                                                                                                    • Vantagens e Desvantagens do FPTP
                                                                                                                                                                    • Voto Uacutetil no FPTP
                                                                                                                                                                      • TWO-ROUND SYSTEM
                                                                                                                                                                        • Exemplo
                                                                                                                                                                        • Vantagens e Desvantagens do TRS
                                                                                                                                                                        • Voto Uacutetil no TRS
                                                                                                                                                                          • INSTANT-RUNOFF VOTING
                                                                                                                                                                            • Exemplo
                                                                                                                                                                            • Vantagens e Desvantagens do IRV
                                                                                                                                                                            • Voto Uacutetil no IRV
                                                                                                                                                                              • APPROVAL VOTING SYSTEM
                                                                                                                                                                                • Exemplo
                                                                                                                                                                                • Vantagens e Desvantagens do AVS
                                                                                                                                                                                • Voto Uacutetil no AVS
                                                                                                                                                                                  • THE BORDA COUNT
                                                                                                                                                                                    • Exemplo
                                                                                                                                                                                    • Vantagens e Desvantagens do BC
                                                                                                                                                                                    • Voto Uacutetil no BC
                                                                                                                                                                                      • SCORE VOTING SYSTEM
                                                                                                                                                                                        • Exemplo
                                                                                                                                                                                        • Vantagens e Desvantagens do SVS
                                                                                                                                                                                        • Voto Uacutetil no SVS
                                                                                                                                                                                          • BLOC VOTE
                                                                                                                                                                                            • Exemplo
                                                                                                                                                                                            • Voto Uacutetil no BV
                                                                                                                                                                                                • O SIMULADOR
                                                                                                                                                                                                • CENAacuteRIOS PERTINENTES
                                                                                                                                                                                                  • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                                                                                                                  • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                                                                                                                  • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                                                                                                                  • CENAacuteRIO 4 COALIZOtildeES
                                                                                                                                                                                                  • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                                                                                                                  • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                                                                                                                    • COMO FUNCIONA O SIMULADOR
                                                                                                                                                                                                      • CLASSE Elections
                                                                                                                                                                                                      • CLASSE FirstPastThePost
                                                                                                                                                                                                      • CLASSE TwoRoundSystem
                                                                                                                                                                                                      • CLASSE InstantRunoffVoting
                                                                                                                                                                                                      • CLASSE ApprovalVoting
                                                                                                                                                                                                      • CLASSE BordaCount
                                                                                                                                                                                                      • CLASSE ScoreVoting
                                                                                                                                                                                                      • CLASSE BlocVote
                                                                                                                                                                                                      • TECNOLOGIAS UTILIZADAS
                                                                                                                                                                                                        • CONCLUSAtildeO
                                                                                                                                                                                                        • Referecircncias
                                                                                                                                                                                                        • Meacutetodo create_voters
                                                                                                                                                                                                        • Meacutetodo create_candidates
                                                                                                                                                                                                        • Meacutetodo calculate_means
                                                                                                                                                                                                        • Meacutetodo get_mean
                                                                                                                                                                                                        • Meacutetodo calculate_mean
                                                                                                                                                                                                        • Meacutetodo set_leading_candidates
                                                                                                                                                                                                        • Meacutetodo irv_set_leading_candidates
                                                                                                                                                                                                        • Meacutetodo sort_ranks
                                                                                                                                                                                                        • Meacutetodo fptp_count_tactical_votes
                                                                                                                                                                                                        • Meacutetodo fptp_count_minority_votes
                                                                                                                                                                                                        • Meacutetodo trs_second_round
                                                                                                                                                                                                        • Meacutetodo trs_account_for_coalitions
                                                                                                                                                                                                        • Meacutetodo irv_count_votes
                                                                                                                                                                                                        • Meacutetodo avs_count_votes
                                                                                                                                                                                                        • Meacutetodo avs_count_votes_with_tactical
                                                                                                                                                                                                        • Meacutetodo irv_apply_tactical_votes
                                                                                                                                                                                                        • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                                                                                                                        • Meacutetodo bc_sum_candidates_scores
                                                                                                                                                                                                        • Meacutetodo svs_apply_tactical_votes
                                                                                                                                                                                                        • Meacutetodo svs_sum_candidates_scores
                                                                                                                                                                                                        • Meacutetodo bv_count_votes

                                                                                                                                                              79

                                                                                                                                                              APEcircNDICE R ndash MEacuteTODO BC_SUM_CANDIDATES_SCORES

                                                                                                                                                              Coacutedigo R1 ndash Meacutetodo bc_sum_candidates_scoresdef bc_sum_candidates_scores(self)

                                                                                                                                                              for index in range(selfelecN_CANDIDATES)

                                                                                                                                                              selfcandidates[index] = 0

                                                                                                                                                              for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                                              score = 0

                                                                                                                                                              if voter_index in selfrankings_changed

                                                                                                                                                              for candidate in selfrankings_changed[voter_index]

                                                                                                                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                                                                              score += 1

                                                                                                                                                              else

                                                                                                                                                              for candidate in voter

                                                                                                                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += score

                                                                                                                                                              score += 1

                                                                                                                                                              APEcircNDICE S ndash MEacuteTODO SVS_APPLY_TACTICAL_VOTES

                                                                                                                                                              Coacutedigo S1 ndash Meacutetodo svs_apply_tactical_votesdef svs_apply_tactical_votes(self)

                                                                                                                                                              for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                                              if randomrandom() lt selfelectactical_vote_percentages[voter[-1][self

                                                                                                                                                              elecCANDIDATE_INDEX]]

                                                                                                                                                              selfrankings_changed[voter_index] = copydeepcopy(selfelec

                                                                                                                                                              sorted_voters[voter_index])

                                                                                                                                                              for candidate_index candidate in enumerate(reversed(voter))

                                                                                                                                                              if candidate_index == 0

                                                                                                                                                              selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                                                                              voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] 10)

                                                                                                                                                              else

                                                                                                                                                              selfrankings_changed[voter_index][-(candidate_index + 1)] = (

                                                                                                                                                              voter[-(candidate_index + 1)][selfelecCANDIDATE_INDEX] -10)

                                                                                                                                                              80

                                                                                                                                                              APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                                                                                                                              Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                                                                                                                              for index in range(selfelecN_CANDIDATES)

                                                                                                                                                              selfcandidates[index] = 0

                                                                                                                                                              for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                                              if voter_index in selfrankings_changed

                                                                                                                                                              for candidate in selfrankings_changed[voter_index]

                                                                                                                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                                                                              selfelecCANDIDATE_RANK]

                                                                                                                                                              else

                                                                                                                                                              for candidate in voter

                                                                                                                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                                                                              selfelecCANDIDATE_RANK]

                                                                                                                                                              APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                                                                                                                              Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                                                                                                                              for index in range(selfelecN_CANDIDATES)

                                                                                                                                                              selfcandidates[index] = 0

                                                                                                                                                              for voter in selfelecsorted_voters

                                                                                                                                                              votes = selfelecN_VACANCIES

                                                                                                                                                              for candidate in reversed(voter)

                                                                                                                                                              if votes == 0

                                                                                                                                                              break

                                                                                                                                                              selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                                              votes -= 1

                                                                                                                                                              • Folha de aprovaccedilatildeo
                                                                                                                                                              • Agradecimentos
                                                                                                                                                              • Epiacutegrafe
                                                                                                                                                              • Resumo
                                                                                                                                                              • Abstract
                                                                                                                                                              • Lista de ilustraccedilotildees
                                                                                                                                                              • Lista de Coacutedigos
                                                                                                                                                              • Lista de tabelas
                                                                                                                                                              • Lista de abreviaturas e siglas
                                                                                                                                                              • Sumaacuterio
                                                                                                                                                              • INTRODUCcedilAtildeO
                                                                                                                                                                • MOTIVACcedilAtildeO E OBJETIVO
                                                                                                                                                                • MEacuteTODO
                                                                                                                                                                • ESTRUTURA
                                                                                                                                                                  • SISTEMAS ELEITORAIS
                                                                                                                                                                    • FISRT PAST THE POST
                                                                                                                                                                      • Exemplo
                                                                                                                                                                      • Vantagens e Desvantagens do FPTP
                                                                                                                                                                      • Voto Uacutetil no FPTP
                                                                                                                                                                        • TWO-ROUND SYSTEM
                                                                                                                                                                          • Exemplo
                                                                                                                                                                          • Vantagens e Desvantagens do TRS
                                                                                                                                                                          • Voto Uacutetil no TRS
                                                                                                                                                                            • INSTANT-RUNOFF VOTING
                                                                                                                                                                              • Exemplo
                                                                                                                                                                              • Vantagens e Desvantagens do IRV
                                                                                                                                                                              • Voto Uacutetil no IRV
                                                                                                                                                                                • APPROVAL VOTING SYSTEM
                                                                                                                                                                                  • Exemplo
                                                                                                                                                                                  • Vantagens e Desvantagens do AVS
                                                                                                                                                                                  • Voto Uacutetil no AVS
                                                                                                                                                                                    • THE BORDA COUNT
                                                                                                                                                                                      • Exemplo
                                                                                                                                                                                      • Vantagens e Desvantagens do BC
                                                                                                                                                                                      • Voto Uacutetil no BC
                                                                                                                                                                                        • SCORE VOTING SYSTEM
                                                                                                                                                                                          • Exemplo
                                                                                                                                                                                          • Vantagens e Desvantagens do SVS
                                                                                                                                                                                          • Voto Uacutetil no SVS
                                                                                                                                                                                            • BLOC VOTE
                                                                                                                                                                                              • Exemplo
                                                                                                                                                                                              • Voto Uacutetil no BV
                                                                                                                                                                                                  • O SIMULADOR
                                                                                                                                                                                                  • CENAacuteRIOS PERTINENTES
                                                                                                                                                                                                    • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                                                                                                                    • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                                                                                                                    • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                                                                                                                    • CENAacuteRIO 4 COALIZOtildeES
                                                                                                                                                                                                    • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                                                                                                                    • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                                                                                                                      • COMO FUNCIONA O SIMULADOR
                                                                                                                                                                                                        • CLASSE Elections
                                                                                                                                                                                                        • CLASSE FirstPastThePost
                                                                                                                                                                                                        • CLASSE TwoRoundSystem
                                                                                                                                                                                                        • CLASSE InstantRunoffVoting
                                                                                                                                                                                                        • CLASSE ApprovalVoting
                                                                                                                                                                                                        • CLASSE BordaCount
                                                                                                                                                                                                        • CLASSE ScoreVoting
                                                                                                                                                                                                        • CLASSE BlocVote
                                                                                                                                                                                                        • TECNOLOGIAS UTILIZADAS
                                                                                                                                                                                                          • CONCLUSAtildeO
                                                                                                                                                                                                          • Referecircncias
                                                                                                                                                                                                          • Meacutetodo create_voters
                                                                                                                                                                                                          • Meacutetodo create_candidates
                                                                                                                                                                                                          • Meacutetodo calculate_means
                                                                                                                                                                                                          • Meacutetodo get_mean
                                                                                                                                                                                                          • Meacutetodo calculate_mean
                                                                                                                                                                                                          • Meacutetodo set_leading_candidates
                                                                                                                                                                                                          • Meacutetodo irv_set_leading_candidates
                                                                                                                                                                                                          • Meacutetodo sort_ranks
                                                                                                                                                                                                          • Meacutetodo fptp_count_tactical_votes
                                                                                                                                                                                                          • Meacutetodo fptp_count_minority_votes
                                                                                                                                                                                                          • Meacutetodo trs_second_round
                                                                                                                                                                                                          • Meacutetodo trs_account_for_coalitions
                                                                                                                                                                                                          • Meacutetodo irv_count_votes
                                                                                                                                                                                                          • Meacutetodo avs_count_votes
                                                                                                                                                                                                          • Meacutetodo avs_count_votes_with_tactical
                                                                                                                                                                                                          • Meacutetodo irv_apply_tactical_votes
                                                                                                                                                                                                          • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                                                                                                                          • Meacutetodo bc_sum_candidates_scores
                                                                                                                                                                                                          • Meacutetodo svs_apply_tactical_votes
                                                                                                                                                                                                          • Meacutetodo svs_sum_candidates_scores
                                                                                                                                                                                                          • Meacutetodo bv_count_votes

                                                                                                                                                                80

                                                                                                                                                                APEcircNDICE T ndash MEacuteTODO SVS_SUM_CANDIDATES_SCORES

                                                                                                                                                                Coacutedigo T1 ndash Meacutetodo svs_sum_candidates_scoresdef svs_sum_candidates_scores(self)

                                                                                                                                                                for index in range(selfelecN_CANDIDATES)

                                                                                                                                                                selfcandidates[index] = 0

                                                                                                                                                                for voter_index voter in enumerate(selfelecsorted_voters)

                                                                                                                                                                if voter_index in selfrankings_changed

                                                                                                                                                                for candidate in selfrankings_changed[voter_index]

                                                                                                                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                                                                                selfelecCANDIDATE_RANK]

                                                                                                                                                                else

                                                                                                                                                                for candidate in voter

                                                                                                                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += candidate[

                                                                                                                                                                selfelecCANDIDATE_RANK]

                                                                                                                                                                APEcircNDICE U ndash MEacuteTODO BV_COUNT_VOTES

                                                                                                                                                                Coacutedigo U1 ndash Meacutetodo bv_count_votesdef bv_count_votes(self)

                                                                                                                                                                for index in range(selfelecN_CANDIDATES)

                                                                                                                                                                selfcandidates[index] = 0

                                                                                                                                                                for voter in selfelecsorted_voters

                                                                                                                                                                votes = selfelecN_VACANCIES

                                                                                                                                                                for candidate in reversed(voter)

                                                                                                                                                                if votes == 0

                                                                                                                                                                break

                                                                                                                                                                selfcandidates[candidate[selfelecCANDIDATE_INDEX]] += 1

                                                                                                                                                                votes -= 1

                                                                                                                                                                • Folha de aprovaccedilatildeo
                                                                                                                                                                • Agradecimentos
                                                                                                                                                                • Epiacutegrafe
                                                                                                                                                                • Resumo
                                                                                                                                                                • Abstract
                                                                                                                                                                • Lista de ilustraccedilotildees
                                                                                                                                                                • Lista de Coacutedigos
                                                                                                                                                                • Lista de tabelas
                                                                                                                                                                • Lista de abreviaturas e siglas
                                                                                                                                                                • Sumaacuterio
                                                                                                                                                                • INTRODUCcedilAtildeO
                                                                                                                                                                  • MOTIVACcedilAtildeO E OBJETIVO
                                                                                                                                                                  • MEacuteTODO
                                                                                                                                                                  • ESTRUTURA
                                                                                                                                                                    • SISTEMAS ELEITORAIS
                                                                                                                                                                      • FISRT PAST THE POST
                                                                                                                                                                        • Exemplo
                                                                                                                                                                        • Vantagens e Desvantagens do FPTP
                                                                                                                                                                        • Voto Uacutetil no FPTP
                                                                                                                                                                          • TWO-ROUND SYSTEM
                                                                                                                                                                            • Exemplo
                                                                                                                                                                            • Vantagens e Desvantagens do TRS
                                                                                                                                                                            • Voto Uacutetil no TRS
                                                                                                                                                                              • INSTANT-RUNOFF VOTING
                                                                                                                                                                                • Exemplo
                                                                                                                                                                                • Vantagens e Desvantagens do IRV
                                                                                                                                                                                • Voto Uacutetil no IRV
                                                                                                                                                                                  • APPROVAL VOTING SYSTEM
                                                                                                                                                                                    • Exemplo
                                                                                                                                                                                    • Vantagens e Desvantagens do AVS
                                                                                                                                                                                    • Voto Uacutetil no AVS
                                                                                                                                                                                      • THE BORDA COUNT
                                                                                                                                                                                        • Exemplo
                                                                                                                                                                                        • Vantagens e Desvantagens do BC
                                                                                                                                                                                        • Voto Uacutetil no BC
                                                                                                                                                                                          • SCORE VOTING SYSTEM
                                                                                                                                                                                            • Exemplo
                                                                                                                                                                                            • Vantagens e Desvantagens do SVS
                                                                                                                                                                                            • Voto Uacutetil no SVS
                                                                                                                                                                                              • BLOC VOTE
                                                                                                                                                                                                • Exemplo
                                                                                                                                                                                                • Voto Uacutetil no BV
                                                                                                                                                                                                    • O SIMULADOR
                                                                                                                                                                                                    • CENAacuteRIOS PERTINENTES
                                                                                                                                                                                                      • CENAacuteRIO 1 VOTO TAacuteTICO
                                                                                                                                                                                                      • CENAacuteRIO 2 VOTO TAacuteTICO NO IRV
                                                                                                                                                                                                      • CENAacuteRIO 3 NAtildeO-MONOTONICIDADE
                                                                                                                                                                                                      • CENAacuteRIO 4 COALIZOtildeES
                                                                                                                                                                                                      • CENAacuteRIO 5 DILEMA DO PRISIONEIRO
                                                                                                                                                                                                      • CENAacuteRIO 6 VOTO DE MINORIA
                                                                                                                                                                                                        • COMO FUNCIONA O SIMULADOR
                                                                                                                                                                                                          • CLASSE Elections
                                                                                                                                                                                                          • CLASSE FirstPastThePost
                                                                                                                                                                                                          • CLASSE TwoRoundSystem
                                                                                                                                                                                                          • CLASSE InstantRunoffVoting
                                                                                                                                                                                                          • CLASSE ApprovalVoting
                                                                                                                                                                                                          • CLASSE BordaCount
                                                                                                                                                                                                          • CLASSE ScoreVoting
                                                                                                                                                                                                          • CLASSE BlocVote
                                                                                                                                                                                                          • TECNOLOGIAS UTILIZADAS
                                                                                                                                                                                                            • CONCLUSAtildeO
                                                                                                                                                                                                            • Referecircncias
                                                                                                                                                                                                            • Meacutetodo create_voters
                                                                                                                                                                                                            • Meacutetodo create_candidates
                                                                                                                                                                                                            • Meacutetodo calculate_means
                                                                                                                                                                                                            • Meacutetodo get_mean
                                                                                                                                                                                                            • Meacutetodo calculate_mean
                                                                                                                                                                                                            • Meacutetodo set_leading_candidates
                                                                                                                                                                                                            • Meacutetodo irv_set_leading_candidates
                                                                                                                                                                                                            • Meacutetodo sort_ranks
                                                                                                                                                                                                            • Meacutetodo fptp_count_tactical_votes
                                                                                                                                                                                                            • Meacutetodo fptp_count_minority_votes
                                                                                                                                                                                                            • Meacutetodo trs_second_round
                                                                                                                                                                                                            • Meacutetodo trs_account_for_coalitions
                                                                                                                                                                                                            • Meacutetodo irv_count_votes
                                                                                                                                                                                                            • Meacutetodo avs_count_votes
                                                                                                                                                                                                            • Meacutetodo avs_count_votes_with_tactical
                                                                                                                                                                                                            • Meacutetodo irv_apply_tactical_votes
                                                                                                                                                                                                            • Meacutetodo irv_apply_tactical_votes (continuaccedilatildeo)
                                                                                                                                                                                                            • Meacutetodo bc_sum_candidates_scores
                                                                                                                                                                                                            • Meacutetodo svs_apply_tactical_votes
                                                                                                                                                                                                            • Meacutetodo svs_sum_candidates_scores
                                                                                                                                                                                                            • Meacutetodo bv_count_votes

                                                                                                                                                                  top related